adc是带进位加法指令,它利用了CF位上记录的进位值。
指令格式: adc 操作对象1,操作对象2
功能:操作对象1 = 操作对象1 + 操作对象2 + CF
例如指令 adc ax,bx实现的功能是: (ax)=(ax)+(bx)+CF
例如:
mov ax,2 mov bx,1 sub bx,ax adc ax,1
执行后,(ax)=4。adc执行时,相当于计算: (ax)+1+CF = 2+1+1 = 4。
mov ax,1 add ax,ax adc ax,3
执行后,(ax)=5。adc执行时,相当于计算: (ax)+3+CF=2+3+0=5。
mov al,98H add al,al adc al,3
执行后,(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,8 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