解:
.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