adc是带进位加法指令,它利用了CF位上记录的进位值。
指令格式: adc 操作对象1,操作对象2
功能:操作对象1 = 操作对象1 + 操作对象2 + CF
例如指令 adc ax,bx实现的功能是: (ax)=(ax)+(bx)+CF
例如:
mov ax,
mov bx,
sub bx,ax
adc ax,
执行后,(ax)=4。adc执行时,相当于计算: (ax)+1+CF = 2+1+1 = 4。
mov ax,
add ax,ax
adc ax,
执行后,(ax)=5。adc执行时,相当于计算: (ax)+3+CF=2+3+0=5。
mov al,98H
add al,al
adc al,
执行后,(al)=34H。adc执行时,相当于计算: (al)+3+CF=30H+3+1=34H。
adc指令的意义:
加法可以分两步来进行:1)低位相加;2)高位相加再加上地位相加产生的进位值
下面的指令和add ax,bx具有相同的结果:
add al,bl
adc ah,bh
所以CPU提供adc指令的目的,就是来进行加法的第二步运算的。adc指令和add指令相配合就可以对更大的数据进行加法运算。
编程计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位)中。 mov ax, 001EH
mov bx,0F000H
add bx,1000H
adc ax,0020H
编程计算1EF0001000H + 2010001EF0H, 结果放在ax(最高16位),bx(次高16位),cx(低16位)中。
mov ax, 001EH
mov bx, 0F000H
mov cx, 1000H
add cx, 1EF0H
adc bx, 1000H
adc ax, 0020H
编写子程序,对两个128位数据进行相加
名称:add128
功能:两个128位数据进行相加
参数:ds:si指向存储第一个数的内存空间,因数据为128,所以需要8个字单元,由低地址单元到高地址单元依次存放128位数据由低到到高的每个字。运算结果存储在第一个数的存储空间中。
ds:di指向存储第二个数的内存空间。
add128:
push ax
push cx
push si
push di sub ax,ax ;将CF设置为0 mov cx, s:
mov ax,[si]
adc ax,[di]
mov [si],ax
inc si
inc si
inc di
inc di
loop s pop di
pop si
pop cx
pop ax
ret
注意:inc和loop指令不影响CF为,但是add指令会影响CF为,所以
inc si
inc si
不能换成
add si,2