控制转移指令
1. jmp(无条件转移)
|
|
可以加上 short
, near
, far
等标识符,分别表明是短转移(ip
修改范围 -128 ~ 127)、近转移(ip
修改范围 -32768 ~ 32767)、远转移(cs
:ip
都修改)。
2. jcc(条件转移)
|
|
简单测试条件的jcc
指令
jcc 指令 | 描述 | 转移条件 |
---|---|---|
jz/je | 为零(相等)时转移 | zf = 1 |
jnz/jne | 非零(不等)时转移 | zf = 0 |
jc/jb | 有进位时转移 | cf = 1 |
jnc/jnb | 无进位时转移 | cf = 0 |
js | 为负时转移 | sf = 1 |
jns | 为正时转移 | sf = 0 |
jo | 溢出时转移 | of = 1 |
jno | 不溢出时转移 | of = 0 |
jp/jpe | 奇偶位为1 时转移 |
pf = 1 |
jnp/jpo | 奇偶位为0 时转移 |
pf = 0 |
jcxz | cx 为0 时转移 |
cf = 0 |
带符号数比较的jcc
指令
jcc 指令 | 描述 | 转移条件 |
---|---|---|
jg/jnle | 大于(不小于等于)时转移 | sf = of 且 zf = 0 |
jge/jnl | 大于等于(不小于)时转移 | sf = pf |
jl/jnge | 小于(不大于等于)时转移 | sf ≠ of |
jle/jng | 小于等于(不大于)时转移 | sf ≠ of 且 zf ≠ 0 |
无符号数比较的jcc
指令
jcc 指令 | 描述 | 转移条件 |
---|---|---|
ja/jnbe | 高于(不低于等于)时转移 | cf = 0 且 zf = 0 |
jae/jnb | 高于等于(不低于)时转移 | cf = 0 |
jb/jnae | 低于(不高于等于)时转移 | cf = 1 |
jbe/jna | 低于等于(不高于)时转移 | cf = 1 或 zf = 1 |
3. loop(循环)
|
|
label的相对偏移量必须在-128~127之间
4. call(调用)/ ret(返回)
|
|
CPU
执行call
指令时,分两步操作:
- 将
ip
(16位操作)或cs
:ip
(32位操作)入栈 - 转移
|
|
CPU
执行ret
指令时,相当于
CPU
执行retf
指令时,相当于
call
指令与ret
指令必须配合使用。
标志处理指令
指令 | 功能 |
---|---|
clc | cf = 0 |
stc | cf = 1 |
cmc | cf = not cf |
cld | df = 0 |
std | df = 1 |
cli | if = 0 |
sti | if = 1 |
串处理指令
串操作指令有以下特点:
- 用
si
寄存器寻址源操作数,用di
寄存器寻址目的操作数 - 源操作数隐含的段寄存器为
ds
,但允许段超越;目的操作数的段寄存器约定为es
,不允许段超越 - 每当串操作指令执行后,自动执行源变址或目的变址,当
df
=0 时,地址增量为正,否则为负。增量的大小与操作数类型有关,字节为1,字为2,双字为4
※ 这也表明了为什么si
是源变址寄存器,di
是目的变址寄存器,而ds
为数据段,es
为附加段。
1. rep(重复串操作直到cx
为0)
rep
常与 [movs
,stos
,lods
,ins
,outs
] 指令配合使用。
执行过程如下:
- 若
cx
=0,退出rep
,否则往下执行 dec
cx
- 执行
string op
- 返回 1
2. movs(串传送)
movs
后加上b
,w
等表示操作类型为字节
,字
。
作用: es
:[di]
= ds
:si
,将ds
:si
所指的串复制cx
个字节/字到es
:di
所指的内存单元中,当df
=0时,每次操作后si
和di
递增size
,否则递减size
。其中,size
等于1(字节)或2(字)。
例:
3. lods(串载入)/ stos(串存储)
|
|
作用:将 ds
:si
所指串的值复制到 al
/ax
中,然后根据df
增加或减少si
。
|
|
作用:将 al
/ax
的值 复制到 es
:di
所指的内存单元中,然后根据df
增加或减少di
。
例:
4. cmps(串比较)
|
|
作用:将 ds
:si
所指串的值与 es
:di
所指串的值进行比较,并根据比较结果(两个值相减)设置标志位,然后,对 si
和 di
做相应的调整。