在BUFI和BUF2两个数据区中,各定义有10个带符号字节数据,试编制完整的源程序,求它们对应项的和,并将和数存入以SUM为首址的数据区中考虑求和的溢出)。 DATA SEGMENT BUFI DB -5,24,16,-8,56,.….. BUF2DB 4,-23,12,45,-25,…… SUM DB 10 DUP(0) DATA ENDS
时间: 2023-09-20 07:11:39 浏览: 95
下面是完整的汇编源代码:
```
ASSUME CS:CODE, DS:DATA
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX ; 初始化数据段寄存器
; 求和
MOV SI, 0 ; SI指向BUFI
MOV DI, 0 ; DI指向BUF2
MOV BX, OFFSET SUM ; BX指向SUM
CLC ; 清除进位标志
LOOP_START:
MOV AL, [SI]
ADD AL, [DI]
ADC AH, 0 ; 加上进位标志
MOV [BX], AL
INC SI
INC DI
INC BX
LOOP LOOP_START
; 程序结束
MOV AH, 4CH
INT 21H
CODE ENDS
DATA SEGMENT
BUFI DB -5,24,16,-8,56,-7,-12,-3,20,10
BUF2 DB 4,-23,12,45,-25,6,-15,8,-30,11
SUM DB 10 DUP(0)
DATA ENDS
END START
```
代码解释:
1. `MOV AX, DATA`和`MOV DS, AX`初始化数据段寄存器。
2. `MOV SI, 0`和`MOV DI, 0`分别将SI和DI寄存器初始化为0,用来指向BUFI和BUF2。
3. `MOV BX, OFFSET SUM`将BX寄存器初始化为SUM的偏移地址,用来存储结果。
4. `CLC`清除进位标志。
5. `LOOP_START`是一个循环标记,用来实现遍历BUFI和BUF2数组的功能。
6. `MOV AL, [SI]`和`ADD AL, [DI]`分别将BUFI和BUF2数组对应项相加(带符号)。
7. `ADC AH, 0`加上进位标志。
8. `MOV [BX], AL`将结果存储到SUM数组中。
9. `INC SI`、`INC DI`和`INC BX`分别将SI、DI和BX寄存器的值加1,以便指向下一个数组项。
10. `LOOP LOOP_START`实现循环遍历BUFI和BUF2数组,直到所有数组项都相加完毕。
11. `MOV AH, 4CH`和`INT 21H`是DOS系统调用,表示程序正常结束。
注意:在进行加法运算时,要使用`ADC`指令来加上进位标志。这是因为带符号数相加可能发生溢出,需要考虑进位的影响。
阅读全文