要求计算X+Y=Z,将结果Z输出到屏幕上,其中X=001565A0H,Y=0021B79EH。实验利用累加器AX,先求低十六位和,并存入地址存储单元,后求高16位和,再存入高址存储单元。由于地位可能向高位有进位,因而高位相加语句需用ADC指令,则地位相加有进位时,CF=1,高位字相加时,同时加上CF中的1。在80386以上微机中可以直接使用32位寄存器和32位加法指令完成。
;二进制双精度加法运算
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
MES1 DB 'The result is:$'
XL DW 65A0H
XH DW 0015H
YL DW 0B79EH
YH DW 0021H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MES1 ;将MES1偏移地址给DX
MOV AH,09H ;将MES1中的内容输出到屏幕
INT 21H
MOV AX,XL
ADD AX,YL
MOV BX,AX
MOV AX,XH
ADC AX,YH
PUSH BX ;入栈保存BX
CALL SHWORD ;先去执行SHWORD
POP BX ;返回继续执行BX出栈处理
MOV AX,BX ;此时AX中是低16位之和
CALL SHWORD ;再次调用SHWORD
MOV AX,4C00H
INT 21H
SHWORD PROC NEAR
MOV BL,AH ;保持高16位的高8位
CALL SHOW ;显示结果
MOV BL,AL ;保持高16位的低8位
CALL SHOW ;显示结果
RET
ENDP
SHOW PROC NEAR
PUSH AX ;保持AX
PUSH DX ;保存DX
MOV AL,BL
AND AL,0F0H ;AL与0F0H相与取高4位
SHR AL,4
CMP AL,0AH ;是否是A以上的数
JB C2
ADD AL,07H ;A以上的数加07H折显示的是字母
C2: ADD AL,30H
MOV DL,AL ;show character
MOV AH,02H
INT 21H
MOV AL,BL
AND AL,0FH ;AL与0FH相与取低4位
CMP AL,0AH
JB C3
ADD AL,07H
C3: ADD AL,30H
MOV DL,AL ;show character
MOV AH,02H
INT 21H
POP DX
POP AX
RET
ENDP
CODE ENDS
END START