跳转指令有两种跳转方式:
1)直接跳转 。即跳转目标是作为指令的一部分编码的;
2)间接跳转。即跳转目标是从寄存器或存储器位置中读出的。
直接跳转是给出一个标号作为跳转目标的,间接跳转的写法是‘*’ 后面跟一个操作数指示符。
表中所示的其他跳转指令都是有条件的——它们根据条件码的某个组合,或者跳转,或者继续执行代码序列中的下一条指令。
指令 | 同义名 | 跳转条件 | 描述 |
jmp Label jmp *Operand
je Label jne Label
jg Label jge Label jl Label jle Label
ja Label jae Label jb Label jbe Label |
jz jnz
jnle jnl jnge jng
jnbe jnb jnae jna | 1 1
ZF ~ZF
~(SF ^ OF)& ~ZF ~(SF ^ OF) SF ^ OF (SF ^ OF)| ZF
~CF ^ ~ZF ~CF CF CF | ZF | 直接跳转 间接跳转
相等/零 不相等/非零
大于(有符号>) 大于或等于(有符号>=) 小于(有符号<) 小于或等于(有符号<=)
超过(无符号>) 超过或相等(无符号>=) 低于(无符号<) 低于或等于(无符号<=) |
跳转指令有几种不同的编码,但是最常用的都是 PC 相关的(PC-relative,PC,程序计数器)。它们会将目标指令的地址与紧跟在跳转指令后面的那条指令的地址之间的差作为编码。这些地址偏移量可以编码为1、2 或者 4 个字节。第二种编码方式是给出 “绝对” 地址,用 4 个字节直接指定目标。汇编器和链接器会选择适当的跳转目的编码。