ITEEDU

例10.9 编写一个子程序,该子程序能把32位二进制变量的数值以十进制形式输出出来。若该数值为负数,则需要输出负号"-",否则,不输出符号。

解:

.MODEL?SMALL, C

.DATA

          CR  =         13

          LF  =         10

Data1 DD?908976789

.CODE

;子程序Display是按十进制输出32位二进制数值SOURCE

     Display  PROC      USES AX BX CX DX SI DI SOURCE:DWORD

              LOCAL     FLAG:BYTE   ;定义一个字节类型的局部变量FLAG

              MOV       BX, WORD PTR [SOURCE]

              MOV       CX, WORD PTR [SOURCE+2]

              MOV       FLAG, 0?    ;FLAG=0——正数

              CMP       CX, 0

              JGE       next

              INC       FLAG        ;FLAG=1——负数

              NOT       BX

              NOT       CX

              ADD       BX, 1       ;能否用指令INC BX?

              ADC       CX, 0       ;上四条指令把32位数CX-BX变为正数

       next:

              XOR       DI, DI      ;压入堆栈字符的个数

              MOV       SI,10       ;用10来除

.REPEAT          ;本循环把32位二进制数转换成十进制

              XOR       DX, DX?     ;数的字符串存入堆栈之中

              MOV       AX, CX

              DIV       SI

              MOV       CX, AX

              MOV       AX, BX

              DIV       SI

              ADD       DL, '0'

              PUSH      DX

              INC       DI

              MOV       BX, AX

.UNTIL        BX==0 && CX==0

.IF FLAG==1 ;判断前面转换的数是否为负数 

              MOV       AL, '-'     ;若是,把符号'-'压入堆栈

              PUSH      AX

              INC       DI

.ENDIF

              MOV       CX, DI

.REPEAT          ;本循环把堆栈中的字符串显示出来

              POP       DX

              MOV       AH, 2

              INT       21H

.UNTILCXZ

              MOV       DL, CR      ;下面六条指令显示回车、换行

              MOV       AH, 2

              INT       21H

              MOV       DL, LF

              MOV       AH, 2

              INT       21H

              RET

     Display  ENDP

.STARTUP

              INVOKE    Display, Data1

              INVOKE    Display, -123456789

.EXIT         0

              END