(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

推荐内容