汇编语言
1. adc指令
- 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
bx - ax = 1 - 2 = -1,所以为NG,然后进位放在CF,进位值为1,后面adc ax,1为ax + 1 + 1 = 4
2. sbb指令
- sbb是带借位减法指令,它利用了CF位上记录的借位值
- 指令格式:sbb 操作对象1,操作对象2
- 功能:操作对象1 = 操作对象1 - 操作对象2 - CF
- 例如:
sbb ax,bx
,实现的功能是:ax = ax - bx - CF
mov bx,1000
mov ax,003e
sub bx,2000
sbb ax,0020
首先bx-1000=f000,借的一位放在了CF位上面,然后ax-0020还有减个CF=003e-0020-1=001d
3. cmp指令
- cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果
- cmp指令执行后,将对标志寄存器产生影响,其他相关指令通过识别这些影响的标志寄存器来得知比较结果
- cmp指令格式:cmp 操作对象1,操作对象2
- 功能:计算操作对象1 - 操作对象2 但并不保存结果,根据计算结果对标志寄存器进行设置
- 比如:,指令
cmp ax,ax
,做ax-ax的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。指令执行后:zf=1,pf=1,sf=0,cf=0,of=0
4. je,ja,jb
- je:jump equal
- ja:jump above
- jb:jump below
- n:not
- 重点:利用cmp和ja,jb,je来实现一个算法,当ax>bx时;令dx++,当ax=bx时,令dx=0;当ax<bx时,令dx–
- 实现算法如下:
mov ax,1
mov bx,2
inc dx
mov dx,0
dec dx
cmp ax,bx
ja 073f:0106 //跳转到inc dx
je 073f:0107 //跳转到mov dx,0
jb 073f:010a //跳转到dec dx
给ax,bx赋完值后,更改ip地址为010b,执行ax与bx的比较,很明显ax<bx,所以顺序执行,直到执行到jb,满足该条件,于是跳转到dec dx
,dx本来为0,自减后为ffffh