(1) 数据为字型数据
assume cs:code
a segment
(资料图片)
dw 1,2,3,4,5,6,7,8
a ends
b segment
dw 1,2,3,4,5,6,7,8
b ends
c segment
dw 0,0,0,0,0,0,0,0
c ends
code segment
start:mov bx,0
s:mov dx,0
mov cx,2
mov ax,a
u:mov ds,ax
add dx,ds:[bx]
mov ax,b
loop u
mov ax,c
mov ds,ax
mov ds:[bx],dx
mov cx,15
sub cx,bx
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
(2) 数据为字节型数据
第 1 种情况:a 段和 b 段两个字节型数据相加的结果不会产生溢出
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:mov bx,0; ?
s:mov dx,0
mov cx,2
mov ax,a
u:mov ds,ax
add dx,ds:[bx]
mov ax,b
loop u
mov ax,c
mov ds,ax
mov ds:[bx],dx
mov cx,8
sub cx,bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
第 2 种情况:a 段和 b 段两个字节型数据相加的结果产生溢出
测试数据使用下面的 7 种方式:
第 1 种方式:
a segment
db 1,2,3,4,0ffh,6,7,8
a ends
b segment
db 1,2,3,4,0ffh,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
以下为程序代码(该程序不适合连续两个计算结果均有进位溢出的情况,例如下面的第2种方式):
assume cs:code
a segment
db 1,2,3,4,0ffh,6,7,8
a ends
b segment
db 1,2,3,4,0ffh,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:mov bx,0
s:mov dx,0
mov cx,2
mov ax,a
u:mov ds,ax
mov ax,0
add al,ds:[bx]
add dx,ax
mov ax,b
loop u
mov cx,c
mov ds,cx
mov ax,0ffh; 注意,应 0ffh 而不是 0fh(少了一个 f)
add ax,ds:[bx]; 将来自前一个计算结果的进位加到 ax 中,(ah)=1 则有溢出,(ah)=0 则无溢出
mov cx,ax
mov ax,0
mov al,ch; 将进位值传入 ax,(ax)=1 或 (ax)=0,为 1 表示前一个计算有进位,0 即无进位
add bx,ax
mov ds:[bx],dx
sub bx,ax; 恢复 bx 的原值
mov cx,8
sub cx,bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
第 2 种方式:
a segment
db 1,2,3,0ffh,0ffh,6,7,8
a ends
b segment
db 1,2,3,0ffh,0ffh,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
以下为程序代码(该程序能够兼容上面的第 1 种方式,同时也适用于下面的第 3~7 种方式):
assume cs:code
a segment
db 1,2,3,0ffh,0ffh,6,7,8
a ends
b segment
db 1,2,3,0ffh,0ffh,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:mov bx,0; ?
mov bp,0; 用初始化为 0 的 BP 寄存器存储 a、b 段数据每次相加后发生进位的累计次数
s:mov dx,0
mov cx,2
mov ax,a
u:mov ds,ax
mov ax,0
add al,ds:[bx]
add dx,ax
mov ax,b
loop u
; 将 a 段数据与 b 段数据相加的计算结果存储到 c 段中
mov ax,c
mov ds,ax
add bx,bp
mov ds:[bx],dx
sub bx,bp; 恢复 bx 的原值
mov ax,0; 将进位值传入 ax,(ax)=1 或 (ax)=0,为 1 表示前一个计算有进位,0 即无进位
mov al,dh; 由于 16 位的 BP 寄存器没有如 AX、BX、CX、DX 寄存器的字节型用法,即没有用 h 和 l 表示的高、低 8 位字节型数据,所以不能直接将进位判断直接传递给 BP 寄存器。
add bp,ax; 将进位值累加入 bp
mov cx,8
sub cx,bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
以下第 3~7 种方式的数据形式使用上面的第 2 种方式中的程序进行实验,均能通过测试。
第 3 种方式:
a segment
db 1,2,0ffh,0ffh,0ffh,6,7,8
a ends
b segment
db 1,2,0ffh,0ffh,0ffh,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
第 4 种方式:
a segment
db 1,2,3,4,0ffh,6,0ffh,8
a ends
b segment
db 1,2,3,4,0ffh,6,0ffh,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
第 5 种方式:
a segment
db 1,0ffh,0ffh,0ffh,5,0ffh,7,0ffh
a ends
b segment
db 1,0ffh,0ffh,0ffh,5,0ffh,7,0ffh
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
第 6 种方式:
a segment
db 1,0ffh,0ffh,0ffh,5,0ffh,0ffh,0ffh
a ends
b segment
db 1,0ffh,0ffh,0ffh,5,0ffh,0ffh,0ffh
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
第 7 种方式:
a segment
db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh
a ends
b segment
db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends