汇编是如何实现指令之间的跳转
指令
- JMP,跳转指令
- CALL,过程调用指令
- LOOP,循环指令
段寄存器
- CS:code segment 指令段寄存器
- DS:data segment 数据段寄存器
- SS:stack segment 栈段寄存器
- ES:不知道英文,但是是辅助段寄存器
- fs,gs:一般存操作系统的线程本地存储
跳转指令
操作码 |
指令 |
说明 |
EB cb |
JMP rel8 |
相对短跳转,位移量相对于下一条指令 |
E9 cw |
JMP rel16 |
相对近跳转,位移量相对于下一条指令 |
E9 cd |
JMP rel32 |
相对近跳转,位移量相对于下一条指令 |
FF /4 |
JMP r/m16 |
绝对间接近跳转,地址由 r/m16 给出 |
FF /4 |
JMP r/m32 |
绝对间接近跳转,地址由 r/m32 给出 |
EA cd |
JMP ptr16:16 |
绝对远跳转,地址由操作数给出 |
EA cp |
JMP ptr16:32 |
绝对远跳转,地址由操作数给出 |
FF /5 |
JMP m16:16 |
绝对间接远跳转,地址由 m16:16 给出 |
FF /5 |
JMP m16:32 |
绝对间接远跳转,地址由 m16:32 给出 |
分为三种:
- 段内跳转:由本段段寄存器作为基址+偏移的跳转
- 相对跳转:由下一条指令地址作为基址+偏移的跳转
- 远跳转:由一个段寄存器作为基址+偏移的跳转
- 任务切换:略(切换进程/线程)
条件跳转
操作码 |
指令 |
说明 |
77 cb |
JA rel8 |
高于(CF=0 且 ZF=0)时短跳转 |
73 cb |
JAE rel8 |
高于或等于 (CF=0) 时短跳转 |
72 cb |
JB rel8 |
低于 (CF=1) 时短跳转 |
76 cb |
JBE rel8 |
低于或等于(CF=1 或 ZF=1)时短跳转 |
72 cb |
JC rel8 |
进位 (CF=1) 时短跳转 |
E3 cb |
JCXZ rel8 |
CX 寄存器为 0 时短跳转 |
E3 cb |
JECXZ rel8 |
ECX 寄存器为 0 时短跳转 |
74 cb |
JE rel8 |
等于 (ZF=1) 时短跳转 |
7F cb |
JG rel8 |
大于(ZF=0 且 SF=OF)时短跳转 |
7D cb |
JGE rel8 |
大于或等于 (SF=OF) 时短跳转 |
7C cb |
JL rel8 |
小于 (SF<>OF) 时短跳转 |
7E cb |
JLE rel8 |
小于或等于(ZF=1 或 SF<>OF)时短跳转 |
76 cb |
JNA rel8 |
不高于(CF=1 或 ZF=1)时短跳转 |
72 cb |
JNAE rel8 |
不高于或等于 (CF=1) 时短跳转 |
73 cb |
JNB rel8 |
不低于 (CF=0) 时短跳转 |
77 cb |
JNBE rel8 |
不低于或等于(CF=0 或 ZF=0)时短跳转 |
73 cb |
JNC rel8 |
无进位 (CF=0) 时短跳转 |
75 cb |
JNE rel8 |
不相等 (ZF=0) 时短跳转 |
7E cb |
JNG rel8 |
不大于(ZF=1 或 SF<>OF)时短跳转 |
7C cb |
JNGE rel8 |
不大于或等于 (SF<>OF) 时短跳转 |
7D cb |
JNL rel8 |
不小于 (SF=OF) 时短跳转 |
7F cb |
JNLE rel8 |
不小于或等于(ZF=0 且 SF=OF)时短跳转 |
71 cb |
JNO rel8 |
不上溢 (OF=0) 时短跳转 |
7B cb |
JNP rel8 |
奇校验 (PF=0) 时短跳转 |
79 cb |
JNS rel8 |
正数时 (SF=0) 短跳转 |
75 cb |
JNZ rel8 |
不为零 (ZF=0) 时短跳转 |
70 cb |
JO rel8 |
上溢 (OF=1) 时短跳转 |
7A cb |
JP rel8 |
偶校验 (PF=1) 时短跳转 |
7A cb |
JPE rel8 |
偶校验 (PF=1) 时短跳转 |
7B cb |
JPO rel8 |
奇校验 (PF=0) 时短跳转 |
78 cb |
JS rel8 |
负数 (SF=1) 时短跳转 |
74 cb |
JZ rel8 |
为零 (ZF $\leftarrow$ 1) 时短跳转 |
0F 87 cw/cd |
JA rel16/32 |
高于(CF=0 且 ZF=0)时近跳转 |
0F 83 cw/cd |
JAE rel16/32 |
高于或等于 (CF=0) 时近跳转 |
0F 82 cw/cd |
JB rel16/32 |
低于 (CF=1) 时近跳转 |
0F 86 cw/cd |
JBE rel16/32 |
低于或等于(CF=1 或 ZF=1)时近跳转 |
0F 82 cw/cd |
JC rel16/32 |
进位 (CF=1) 时近跳转 |
0F 84 cw/cd |
JE rel16/32 |
相等 (ZF=1) 时近跳转 |
0F 84 cw/cd |
JZ rel16/32 |
为 0 (ZF=1) 时近跳转 |
0F 8F cw/cd |
JG rel16/32 |
大于(ZF=0 且 SF=OF)时近跳转 |
操作码 |
指令 |
说明 |
0F 8D cw/cd |
JGE rel16/32 |
大于或等于 (SF=OF) 时近跳转 |
0F 8C cw/cd |
JL rel16/32 |
小于 (SF<>OF) 时近跳转 |
0F 8E cw/cd |
JLE rel16/32 |
小于或等于(ZF=1 或 SF<>OF)时近跳转 |
0F 86 cw/cd |
JNA rel16/32 |
不高于(CF=1 或 ZF=1)时近跳转 |
0F 82 cw/cd |
JNAE rel16/32 |
不高于或等于 (CF=1) 时近跳转 |
0F 83 cw/cd |
JNB rel16/32 |
不低于 (CF=0) 时近跳转 |
0F 87 cw/cd |
JNBE rel16/32 |
不低于或等于(CF=0 或 ZF=0)时近跳转 |
0F 83 cw/cd |
JNC rel16/32 |
无进位 (CF=0) 时近跳转 |
0F 85 cw/cd |
JNE rel16/32 |
不相等 (ZF=0) 时近跳转 |
0F 8E cw/cd |
JNG rel16/32 |
不大于(ZF=1 或 SF<>OF)时近跳转 |
0F 8C cw/cd |
JNGE rel16/32 |
不大于或等于 (SF<>OF) 时近跳转 |
0F 8D cw/cd |
JNL rel16/32 |
不小于 (SF=OF) 时近跳转 |
0F 8F cw/cd |
JNLE rel16/32 |
不小于或等于(ZF=0 且 SF=OF)时近跳转 |
0F 81 cw/cd |
JNO rel16/32 |
不上溢 (OF=0) 时近跳转 |
0F 8B cw/cd |
JNP rel16/32 |
奇校验 (PF=0) 时近跳转 |
0F 89 cw/cd |
JNS rel16/32 |
正数 (SF=0) 时近跳转 |
0F 85 cw/cd |
JNZ rel16/32 |
不为零 (ZF=0) 时近跳转 |
0F 80 cw/cd |
JO rel16/32 |
上溢 (OF=1) 时近跳转 |
0F 8A cw/cd |
JP rel16/32 |
偶校验 (PF=1) 时近跳转 |
0F 8A cw/cd |
JPE rel16/32 |
偶校验 (PF=1) 时近跳转 |
0F 8B cw/cd |
JPO rel16/32 |
奇校验 (PF=0) 时近跳转 |
0F 88 cw/cd |
JS rel16/32 |
负数 (SF=1) 时近跳转 |
0F 84 cw/cd |
JZ rel16/32 |
为 0 (ZF=1) 时近跳转 |
过程调用指令
操作码 |
指令 |
说明 |
E8 cw |
CALL rel16 |
相对近调用,位移量相对于下一条指令 |
E8 cd |
CALL rel32 |
相对近调用,位移量相对于下一条指令 |
FF /2 |
CALL r/m16 |
绝对间接近调用,地址由 r/m16 给出 |
FF /2 |
CALL r/m32 |
绝对间接近调用,地址由 r/m32 给出 |
9A cd |
CALL ptr16:16 |
绝对远调用,地址由操作数给出 |
9A cp |
CALL ptr16:32 |
绝对远调用,地址由操作数给出 |
FF /3 |
CALL m16:16 |
绝对间接远调用,地址由 m16:16 给出 |
FF /3 |
CALL m16:32 |
绝对间接远调用,地址由 m16:32 给出 |
操作码 |
指令 |
说明 |
C3 |
RET |
近返回到调用过程 |
CB |
RET |
远返回到调用过程 |
C2 iw |
RET imm16 |
近返回到调用过程,并从堆栈弹出 imm16 个字节 |
CA iw |
RET imm16 |
远返回到调用过程,并从堆栈弹出 imm16 个字节 |
retf指令:先弹出值到IP寄存器,再弹出值到CS段寄存器实现返回。
循环指令
操作码 |
指令 |
说明 |
E2 cb |
LOOP rel8 |
递减计数;计数 $\not =$ 0 时短跳转 |
E1 cb |
LOOPE rel8 |
递减计数;计数 $\not =$ 0 且 ZF=1 时短跳转 |
E1 cb |
LOOPZ rel8 |
递减计数;计数 $\not =$ 0 且 ZF=1 时短跳转 |
E0 cb |
LOOPNE rel8 |
递减计数;计数 $\not =$ 0 且 ZF=0 时短跳转 |
E0 cb |
LOOPNZ rel8 |
递减计数;计数 $\not =$ 0 且 ZF=0 时短跳转 |