❤️💕💕汇编语言目前仍在发挥着不可替代的作用,在效率上无可替代,在底层,学习linux内核,计算机外围设备和驱动,都离不开汇编。Myblog:http://nsddd.top
[TOC]
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 ; bx 获得bx - ax ;向高位借位CF = 1,
adc ax, 1
执行后,(ax)= 4。adc执行时,相当于计算:(ax) + 1 + CF = 2 + 1 + 1 = 4。
这个借位是上面减法的进位
mov ax, 1
add ax, ax //没有产生进位CF = 0
adc ax, 3
执行后,(ax)= 5。adc执行时,相当于计算:(ax) + 3 + CF = 2 + 2 + 0 = 5。
mov al, 98H
mov al, al //进位,al不存不下,为30H
adc al, 3
执行后,(al)= 34H。adc执行时,相当于计算:(al) + 3 + CF = 30H + 3 + 1 = 34H
可以看出adc指令比add指令多加了一个CF位的值。
8086提供add指令,完成8位或16位相加,但是更大的数相加?
在执行adc指令的时候加上CF的值的含义,是由adc指令前面的指令决定的,也就是说,关键在于所加上的CF值是被什么指令设置的。如果CF的值是被sub指令设置的,那么它的含义就是借位值;如果是被add指令设置的,那么它的含义就是进位值。
例:
01 98
+ 01 83
1
------------
03 1B
加法分两步进行:
1)低位相加;
2)高位相加再加上低位相加产生的进位值。
用法:
add al, bl ;低位相加,cf保存进位值
adc ah, bh ;如果进位加上进位的值。
CPU提供adc指令的目的,就是来进行加法的第二步运算的。adc指令和add指令相配合就可以对更大的数据进行加法运算。
例:计算1EF000H + 201000H,结果放在ax(高16位)和xb(低16位)中。
mov ax, 001EH
mov bx, 0F000H
add bx, 1000H
adc ax, 0020H
计算1EF0001000H + 2010001EF0H,结果放在ax(最高16位),bx(次高16位),cx(低16位)
mov cx, 1000H
mov bx, 0F000H
mov ax, 001EH
add cx, 1EF0H
adc bx, 1000H
adc ax, 0020H
sbb是带借位减法指令,它利用了CF位上记录的借位值。
指令格式:
sbb 操作对象1, 操作对象2
功能:
操作对象1 = 操作对象1 - 操作对象2 - CF
比如:
sbb ax, bx
(ax) = (ax) - (bx) - CF
sbb指令执行后,将对CF进行设置。利用sbb指令可以对任意大的数据进行减法运算。
例:003E1000H - 00202000H,结果放在ax, bx
mov bx, 1000H
mov ax, 003EH
sub bx, 2000H
sbb ax, 0020H
sbb和adc是基于同样的思想设计的两条指令。