在数据段定义了两个多精度的有符号16进制数,FIRST和SECOND, FIRST DB 45H, 82H, 96H, 57H SECOND DB 12H, 46H, 83H, 45H (1)求两数的和与差,并将结果存放在THIRD为首地址的缓冲区中; (2)如果把两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在FORTH为首地址的缓冲区中
时间: 2024-02-13 21:00:53 浏览: 46
MATLAB中将二进制有符号数转化为十进制数的函数
好的,让我来回答您的问题。
针对问题一,我们可以将两个多精度数转换成十进制数,然后再进行加减运算。这里提供一种汇编语言实现的方法:
```
MOV SI, OFFSET FIRST ; 将FIRST的地址存入SI
MOV DI, OFFSET SECOND ; 将SECOND的地址存入DI
MOV BX, 0 ; BX用来存放进位
MOV CX, 4 ; CX用来计数,每次处理4个字节
MOV DX, 0 ; DX用来存放差值
MOV AX, 0 ; AX用来存放和值
LOOP1:
MOV AL, [SI] ; 取出FIRST的一个字节
SUB AL, 30H ; 将其转换成十进制数
MOV BL, [DI] ; 取出SECOND的一个字节
SUB BL, 30H ; 将其转换成十进制数
ADD AL, BL ; 加法运算
ADD AL, BH ; 加上进位
CMP AL, 9 ; 判断是否需要进位
JBE NO_CARRY1
SUB AL, 10
INC BH
NO_CARRY1:
ADD DX, 30H ; 将差值转换成ASCII码
ADD AX, DX ; 将差值加入和值
MOV DX, 0 ; 清空DX
MOV DL, AL ; 将和值的低字节存入DX
ADD DX, 30H ; 将和值的低字节转换成ASCII码
MOV [THIRD], DL ; 将和值的低字节存入缓冲区
INC THIRD ; 缓冲区指针加1
ADC BX, 0 ; 处理进位
MOV BH, BL ; 将BX的高字节存入BH
INC SI ; FIRST指针加1
INC DI ; SECOND指针加1
LOOP LOOP1
MOV DL, BH ; 将最后的进位存入DL
ADD DL, 30H ; 将进位转换成ASCII码
MOV [THIRD], DL ; 将进位存入缓冲区
; 计算差值
MOV SI, OFFSET FIRST
MOV DI, OFFSET SECOND
MOV BX, 0 ; BX用来存放借位
MOV CX, 4 ; CX用来计数,每次处理4个字节
MOV DX, 0 ; DX用来存放差值
MOV AL, 0 ; AL用来存放借位
LOOP2:
MOV BL, [SI] ; 取出FIRST的一个字节
SUB BL, 30H ; 将其转换成十进制数
MOV DL, [DI] ; 取出SECOND的一个字节
SUB DL, 30H ; 将其转换成十进制数
SUB BL, BH ; 减法运算
CMP BL, DL ; 判断是否需要借位
JAE NO_BORROW
ADD BL, 10
DEC AL
NO_BORROW:
ADD DX, 30H ; 将差值转换成ASCII码
MOV [THIRD], BL ; 将差值存入缓冲区
INC THIRD ; 缓冲区指针加1
MOV BH, 0 ; 清空BH
MOV [FORTH], DX ; 将差值存入缓冲区
INC FORTH ; 缓冲区指针加1
MOV BX, 0 ; 清空BX
MOV BL, AL ; 将AL存入BL,为下一次运算做准备
ADD BL, 30H ; 将借位转换成ASCII码
MOV [FORTH], BL ; 将借位存入缓冲区
INC FORTH ; 缓冲区指针加1
MOV AL, 0 ; 清空AL
CMP DI, OFFSET SECOND ; 判断是否处理完毕
JE END_LOOP2
INC SI ; FIRST指针加1
INC DI ; SECOND指针加1
LOOP LOOP2
END_LOOP2:
```
针对问题二,我们可以先将两个多精度数转换成十进制数,然后再进行加减运算。这里提供一种汇编语言实现的方法:
```
MOV SI, OFFSET FIRST ; 将FIRST的地址存入SI
MOV DI, OFFSET SECOND ; 将SECOND的地址存入DI
MOV BX, 0 ; BX用来存放进位
MOV CX, 4 ; CX用来计数,每次处理4个字节
MOV DX, 0 ; DX用来存放差值
MOV AX, 0 ; AX用来存放和值
LOOP1:
MOV AL, [SI] ; 取出FIRST的一个字节
MOV BL, [DI] ; 取出SECOND的一个字节
ADD AL, BL ; 加法运算
ADD AL, BH ; 加上进位
CMP AL, 15 ; 判断是否需要进位
JBE NO_CARRY2
SUB AL, 16
INC BH
NO_CARRY2:
ADD DX, 30H ; 将差值转换成ASCII码
ADD AX, DX ; 将差值加入和值
MOV DX, 0 ; 清空DX
MOV DL, AL ; 将和值的低字节存入DX
ADD DX, 30H ; 将和值的低字节转换成ASCII码
MOV [FORTH], DL ; 将和值的低字节存入缓冲区
INC FORTH ; 缓冲区指针加1
ADC BX, 0 ; 处理进位
MOV BH, BL ; 将BX的高字节存入BH
INC SI ; FIRST指针加1
INC DI ; SECOND指针加1
LOOP LOOP1
MOV DL, BH ; 将最后的进位存入DL
ADD DL, 30H ; 将进位转换成ASCII码
MOV [FORTH], DL ; 将进位存入缓冲区
; 计算差值
MOV SI, OFFSET FIRST
MOV DI, OFFSET SECOND
MOV BX, 0 ; BX用来存放借位
MOV CX, 4 ; CX用来计数,每次处理4个字节
MOV DX, 0 ; DX用来存放差值
MOV AL, 0 ; AL用来存放借位
LOOP2:
MOV BL, [SI] ; 取出FIRST的一个字节
MOV DL, [DI] ; 取出SECOND的一个字节
SUB BL, BH ; 减法运算
CMP BL, DL ; 判断是否需要借位
JAE NO_BORROW
ADD BL, 16
DEC AL
NO_BORROW:
ADD DX, 30H ; 将差值转换成ASCII码
MOV [FORTH], BL ; 将差值存入缓冲区
INC FORTH ; 缓冲区指针加1
MOV BH, 0 ; 清空BH
CMP DI, OFFSET SECOND ; 判断是否处理完毕
JE END_LOOP2
INC SI ; FIRST指针加1
INC DI ; SECOND指针加1
LOOP LOOP2
END_LOOP2:
```
希望能够解决您的问题!
阅读全文