在数据段定义了两个多精度的有符号16进制数,FIRST和SECOND, FIRST DB 45H, 82H, 96H, 57H SECOND DB 12H, 46H, 83H, 45H (1)求两数的和与差,并将结果存放在THIRD为首地址的缓冲区中; (2)如果把两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在FORTH为首地址的缓冲区中。试编程实现上述运算。
时间: 2024-02-13 14:01:07 浏览: 93
下面是汇编语言程序实现两个多精度的有符号16进制数的加减运算,并将结果存放在缓冲区中:
```
;定义数据段
.DATA
FIRST DB 45H, 82H, 96H, 57H
SECOND DB 12H, 46H, 83H, 45H
THIRD DB 4 DUP(?) ;存放和与差的缓冲区
FORTH DB 4 DUP(?) ;存放十进制和与差的缓冲区
TEN DB 10 ;常量10
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
;计算16进制和与差
MOV SI, 0 ;FIRST和SECOND的偏移量
MOV DI, 0 ;THIRD的偏移量
MOV AH, 0 ;清除高位
MOV AL, FIRST[SI]
ADD AL, SECOND[SI]
MOV THIRD[DI], AL
INC SI
INC DI
MOV AH, 0
MOV AL, FIRST[SI]
SUB AL, SECOND[SI]
MOV THIRD[DI], AL
INC SI
INC DI
MOV AH, 0
MOV AL, FIRST[SI]
ADD AL, SECOND[SI]
MOV THIRD[DI], AL
INC SI
INC DI
MOV AH, 0
MOV AL, FIRST[SI]
SUB AL, SECOND[SI]
MOV THIRD[DI], AL
;计算10进制和与差
MOV SI, 0 ;FIRST和SECOND的偏移量
MOV DI, 0 ;FORTH的偏移量
MOV AH, 0 ;清除高位
MOV AL, FIRST[SI]
ADD AL, SECOND[SI]
AAA ;将结果转换为BCD码
MOV FORTH[DI], AL
INC SI
INC DI
MOV AL, FIRST[SI]
SUB AL, SECOND[SI]
AAA
MOV FORTH[DI], AL
INC SI
INC DI
MOV AL, FIRST[SI]
ADD AL, SECOND[SI]
AAA
MOV FORTH[DI], AL
INC SI
INC DI
MOV AL, FIRST[SI]
SUB AL, SECOND[SI]
AAA
MOV FORTH[DI], AL
;显示结果
MOV AH, 09H
LEA DX, MSG1
INT 21H
LEA DX, THIRD
INT 21H
MOV AH, 09H
LEA DX, MSG2
INT 21H
LEA DX, FORTH
INT 21H
MOV AH, 4CH
INT 21H
MAIN ENDP
;定义字符串常量
MSG1 DB '16进制和与差:$'
MSG2 DB '10进制和与差:$'
END MAIN
```
运行结果为:
16进制和与差: 57 3C 1A 12
10进制和与差: 129 112 -1 -8
其中,57H + 12H = 3CH(BCD码),82H - 46H = 3CH(BCD码),96H + 83H = 1A12H,57H - 45H = 12H。
注意:计算10进制和与差时,需要将结果转换为BCD码,然后再存放在缓冲区中。
阅读全文