部分汇编对应的机器码

本文详细介绍了x86和x64架构下的汇编指令,特别是条件和无条件跳转指令,包括它们的机器码、测试条件以及在程序状态字寄存器中的标志位作用。同时,还提到了如何在C语言中使用汇编代码和直接插入机器码。内容涵盖了直接和间接标志转移,以及16位和32位寻址方式的相关指令。
摘要由CSDN通过智能技术生成

je或jz         //  相等则跳(机器码是74或84)
jne或jnz       //  不相等则跳(机器码是75或85)

jmp            //  无条件跳(机器码是EB)

汇编指令对应机器码表
一、状态寄存器

PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF   AF   PF   CF 

条件码:

①OF(Overflow Flag)溢出标志。溢出时为1,否则置0。
②SF(Sign Flag)符号标志。结果为负时置1,否则置0.
③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.
④CF(Carry Flag)进位标志,进位时置1,否则置0.
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个节)产生的进位置。
有进位时1,否则置0.
⑥PF(Parity Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0.
控制标志位:

⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志。
二、 直接标志转移(8位寻址)

指令格式| 机器码| 测试条件| 如...则转移
---|---|---|---
JC| 72| C=1| 有进位
JNC| 73| C=0| 无进位
JZ/JE| 74| Z=1| 零/等于
JNZ/JNE| 75| Z=0| 不为零/不等于
JS| 78| S=1| 负号
JNS| 79| S=0| 正号
JO| 70| O=1| 有溢出
JNO| 71| O=0| 无溢出
JP/JPE| 7A| P=1| 奇偶位为偶
JNP/IPO| 7B| P=0| 奇偶位为奇
三、间接标志转移(8位寻址)

指令格式| 机器码| 测试条件| 如...则转移
---|---|---|---
JA/JNBE(比较无符号数)| 77| C或Z=0 > | 高于/不低于或等于
JAE/JNB(比较无符号数)| 73| C=0 >= | 高于或等于/不低于
JB/JNAE(比较无符号数)| 72| C=1 < | 低于/不高于或等于
JBE/JNA(比较无符号数)| 76| C或Z=1 <= | 低于或等于/不高于
JG/JNLE(比较带符号数)| 7F| (S异或O)或Z=0 > | 大于/不小于或等于
JGE/JNL(比较带符号数)| 7D| S异或O=0 >= | 大于或等于/不小于
JL/JNGE(比较带符号数)| 7C| S异或O=1 < | 小于/不大于或等于
JLE/JNG(比较带符号数)| 7E| (S异或O)或Z=1 <= | 小于或等于/不大于
四、无条件转移指令

操作码|伪码指令|含义
---|---|---
EB cb | JMP rel8 | 相对短跳转(8位, 使rel8处的代码位下一条指令
E9 cw | JMP rel16 | 相对跳转(16位, 使rel16处的代码位下一条指令
FF /4 | JMP r/m16 | 绝对跳转(16位, 下一指令地址在r/m16中给出
FF /4 | JMP r/m32 | 绝对跳转(32位, 下一指令地址在r/m32中给出
EA cb | JMP ptr16:16 | 远距离绝对跳转, 下一指令地址在操作数中
EA cb | JMP ptr16:32 | 远距离绝对跳转, 下一指令地址在操作数中
FF /5 | JMP m16:16 | 远距离绝对跳转, 下一指令地址在内存m16:16中
FF /5 | JMP m16:32 | 远距离绝对跳转, 下一指令地址在内存m16:32中 

五、16位/32位寻址方式

操作码 | 伪码指令 | 跳转含义 | 跳转类型 | 跳转的条件(标志位)
---|---|---|---|---
0F 87 cw/cd | JA rel16/32 | 大于 | near | (CF=0 and ZF=0) 
0F 83 cw/cd | JAE rel16/32 | 大于等于 | near | (CF=0)
0F 82 cw/cd | JB rel16/32 | 小于 | near | (CF=1)
0F 86 cw/cd | JBE rel16/32 | 小于等于 | near | (CF=1 or ZF=1)
0F 82 cw/cd | JC rel16/32 | 进位 | near | (CF=1)
0F 84 cw/cd | JE rel16/32 | 等于 | near | (ZF=1)
0F 84 cw/cd | JZ rel16/32 | 为0 | near | (ZF=1)
0F 8F cw/cd | JG rel16/32 | 大于 | near | (ZF=0 and SF=OF)
0F 8D cw/cd | JGE rel16/32 | 大于等于 | near | (SF=OF) 
0F 8C cw/cd | JL rel16/32 | 小于 | near | (SF<>OF) 
0F 8E cw/cd | JLE rel16/32 | 小于等于 | near | (ZF=1 or SF<>OF)
0F 86 cw/cd | JNA rel16/32 | 不大于 | near | (CF=1 or ZF=1)
0F 82 cw/cd | JNAE rel16/32 | 不大于等于 | near | (CF=1)
0F 83 cw/cd | JNB rel16/32 | 不小于 | near | (CF=0) 
0F 87 cw/cd | JNBE rel16/32 | 不小于等于 | near | (CF=0 and ZF=0) 
0F 83 cw/cd | JNC rel16/32 | 不进位 | near | (CF=0)
0F 85 cw/cd | JNE rel16/32 | 不等于 | near | (ZF=0) 
0F 8E cw/cd | JNG rel16/32 | 不大于 | near | (ZF=1 or SF<>OF)
0F 8C cw/cd | JNGE rel16/32 | 不大于等于 | near | (SF<>OF)
0F 8D cw/cd | JNL rel16/32 | 不小于 | near | (SF=OF)
0F 8F cw/cd | JNLE rel16/32 | 不小于等于 | near | (ZF=0 and SF=OF)
0F 81 cw/cd | JNO rel16/32 | 未溢出 | near | (OF=0)
0F 8B cw/cd | JNP rel16/32 | 不是偶数 | near | (PF=0) 
0F 89 cw/cd | JNS rel16/32 | 非负数 | near | (SF=0)
0F 85 cw/cd | JNZ rel16/32 | 非零(不等于)| near | (ZF=0)
0F 80 cw/cd | JO rel16/32 | 溢出 | near | (OF=1)
0F 8A cw/cd | JP rel16/32 | 偶数 | near | (PF=1)
0F 8A cw/cd | JPE rel16/32 | 偶数 | near | (PF=1) 
0F 8B cw/cd | JPO rel16/32 | 奇数 | near | (PF=0)
0F 88 cw/cd | JS rel16/32 | 负数 | near | (SF=1)
0F 84 cw/cd | JZ rel16/32 | 为零(等于) | near | (ZF=1)
注:一些指令操作数的含义说明:

rel8 表示 8 位相对地址
  rel16 表示 16 位相对地址
  rel16/32 表示 16或32 位相对地址
  r/m16 表示16位寄存器
  r/m32 表示32位寄存器


关于__emit
__asm _emit 0x0F 和 __asm _emit 0x31是什么意思?
在C语言中,允许直接插入汇编代码,甚至直接插入机器码。
插入汇编代zhuan码可以用asm关键字来表shu示,如:
asm {
mov eax, ebx ; 插入mov 指令
xor eax,edx ; 插入xor 指令
}
也可以直接插入机器码,用可用emit宏来表示,
如直接插入机器码0x50(机器指令为:PUSH EAX),可写为:
__emit__(0x50);
你给的例子就是直接插入0X0F和0X31,具体的指令要结合其它数据才能确定。


x86中
jmp相对跳转
EB  (目标地址 - JMP地址 - 指令长度)     相对短跳转8位
E9 (目标地址 - JMP地址 - 指令长度)     相对跳转16位
E8也有call


x64中
绝对远跳转: FF 25 00 00 00 00 XX XX XX XX XX XX XX XX
FF 25: 是jmp
四个00: 不用管
八个XX: 是目标绝对地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值