精华内容
下载资源
问答
  • x64汇编机器码对应表
    千次阅读
    2020-12-19 20:29:14

    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: 是目标绝对地址

    更多相关内容
  • 汇编指令和机器码对应表

    千次阅读 2021-04-15 19:20:11
    PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件标志(flag)和控制标志构成,如下所示: 15 14 13 12 11 10 98 7 6 5 4 3 2 1 0  OF DFIF TF SF ZF AF PF CF 条件: ①OF(Overflow Flag)溢出...

     

    一、状态寄存器

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

    15 14 13 12 11 10 98 7 6 5 4 3 2 1 0 
          OF DFIF 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  72C=1 有进位 JNS79 S=0 正号 
    JNC  73C=0 无进位 JO 70O=1 有溢出 
    JZ/JE  74Z=1 零/等于 JNO 71 O=0 无溢出 
    JNZ/JNE  75Z=0 不为零/不等于 JP/JPE 7A P=1 奇偶位为偶 
    JS 78 S=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位寄存器




    机器语言我们只要重点理解一下几个概念:

    1. 机器语言指令有操作码(OP)和地址码两部分组成 

    |_____________OP_______________|__d__|__w__|
    |_____________OP_______________|__s__|__w__|<--此格式用于立即寻址方式

    在多数操作码中,常使用某些位来指示某些信息:
    如图上结构里的: w=1 时 对字来操作
    w=0 时 对字节来操作
    d值在双操作数指令中才有效
    当 d=1 时 有且只有一个寄存器用于目的操作数
    d=0 时 有且只有一个寄存器用于源操作数
    s=1 时 立即数为8位,但要求扩展成16位数
    s=0 时 当指令作字节操作/有16位立即数
    由于汇编的指令格式很多,这里我只作一些基本情况介绍,
    2. 寻址方式的机器语言表示:
    | mod | reg | r/m |
    |_____|_____|_____|_____|_____|_____|_____|
    reg 表示寄存器方式,在不包括立即数的双操作数指令的情况下,规定必须有一个操作数在寄存器中,该寄存器由reg字段指定,并与操作码字节中的w位相组合确定的寄存器
    mod字段与r/m(reGISter/memory)字段结合在一起确定另一个操作数的寻址方式
    现在熟悉简单的:
    ______________________________________________________________________________
    表1 <PS:部分资料> rrr : W=0 : W=1 : reg32 
    000 : AL : AX : EAX 
    001 : CL : CX : ECX 
    010 : DL : DX : EDX 
    011 : BL : BX : EBX 
    100 : AH : SP : ESP 
    101 : CH : BP : EBP 
    110 : DH : SI : ESI 
    111 : BH : DI : EDI
    ______________________________________________________________________________
    表2 <PS:部分资料> rrr : Index Register 
    000 : EAX 
    001 : ECX 
    010 : EDX 
    011 : EBX 
    100 : No Index 
    101 : EBP 
    110 : ESI 
    111 : EDI
    ______________________________________________________________________________
    表3 <PS:部分资料> mmm : Function 11
    w=1
    000 : DS:[BX+SI] 
    001 : DS:[BX+DI] 
    010 : SS:[BP+SI] 
    011 : SS:[BP+DI] BX 
    100 : DS:[SI] 
    101 : DS:[DI] 
    110 : SS:[BP] 
    111 : DS:[BX]
    ______________________________________________________________________________
    表4 <PS:部分资料>
    oo : Function 
    00 : If mmm = 110,then a displacement follows the operation; otherwise, no displacement is used 
    01 : An 8-bitsigned displacement follows the opcode 
    10 : A 16-bitsigned displacement follows the opcode 
    11 : mmm specifiesa register, instead of an addressing mode
    ______________________________________________________________________________
    上面的表,你都看明白了吗? 现在我就教你们如何利用这样的表格来把汇编指令翻译机器码
    3.指令格式简介
    8086所用的16位指令格式:
    _____________________ ________ ________
    |操作码| + |mod-reg-r/m| + |位移量| + |立即数|
    1~2字节 0~1字节 0~2字节 0~2字节

    OK!以上就是基本知识,下面我们来实践吧:
    ———————————————————————————————————————
    问题:
    MOV AX,1234H 对应的机器码为:B83412 
    MOV EBX,0 对应的机器码为:66BB00000000
    MOV CL,55H 对应的机器码为: B155

    MOV AX,BX 对应的机器码为:8BC3

    我在问一下,机器码的数据格式是什么? 好像是 机器指令+操作数(高位存放在地址高位,低位存放在地址低位),但是前面MOVAX,怎么就变成了B8,弄不明白,请指教。
    PS: 上面的题目是一个网友问的,现在我来实践一遍给你们看。
    ———————————————————————————————————————
    指令1 -> MOV AX,1234H 对应的机器码为:B83412 
    解法: 判断-> 这个是8086汇编16位汇编指令格式,并且是立即寻址方式
    查表-> 打开opcodes.html文件,找到标题为“Main Instructions”,单击“M”字母,然后对应查看 “MOV Reg,Imm”格式的“OpCode”项为:1011wrrr
    再判断-> 由于寄存器是AX, 立即数是1234H,明显是“对字操作”,所以w=1
    在查看本文章上面的“表1”,对应的查到rrr的值为000
    组合结果-> w=1
    rrr=000
    1011wrrr=1011 1000B ->B8H 
    根据“ 3.指令格式简介” -> B8H + |立即数(低位在前高位在后)|=B83412H 
    PS: "+" 符号不为“加号” 
    好了,已经解完第一题了,机器码为 B83412H 
    ———————————————————————————————————————
    指令4 -> MOV AX,BX 对应的机器码为:8BC3
    解法: 判断-> 这个是8086汇编16位汇编指令格式,并且是寄存器寻址方式
    查表-> 打开opcodes.html文件,找到标题为“Main Instructions”,单击“M
    ”字母,然后对应查看 “MOV Reg,Reg”格式的“OpCode”项为:1000101woorrrmmm
    再判断-> 由于寄存器是AX, BX 明显是“对字操作”,所以w=1
    在查看本文章上面的“表4”,对应查到oo=11 因为是寄存器寻址方式
    在查看本文章上面的“表1”,对应查到rrr的值为000 ,因为当两个操
    作数都是寄存器,那么一般要以目的操作数为准
    在查看本文章上面的“表3”, 对应查到mmm的值为011 ,因为当两个操作数都是寄存器,那么一般要以源操作数为准
    组合结果-> w=1
    oo=11
    rrr=000
    mmm=011
    1000101woorrrmmm=1000 1011 1100 0011B ->8BC3H
    好了,已经解完第二题了,机器码为8BC3H
    ———————————————————————————————————————
    呵呵,不错吧,很简单吧,有了80X86 OPCODES 查询表一切都是那么简单,如果还有什么问题,大家都来这里提问!
    剩下的: 
    指令2 -> MOV EBX,0 对应的机器码为:66BB00000000 
    指令3 -> MOV CL,55H 对应的机器码为: B155
    大家来练练手,注意指令2 需要用到32位指令格式,请查阅相关的80x86汇编语言书籍的机器语言部分,应该有解释的。
    指令2的解法,请大家等待,或者大家研究一下,把解法贴出来,给大家参考哦!

    本文转载自:https://blog.csdn.net/zhou191954/article/details/31349577

    展开全文
  • 汇编指令对应机器码表 一、状态寄存器 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 ...

    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: 是目标绝对地址

    展开全文
  • 1. 关于X64架构 2. X64架构的寄存器结构 2.1 通用目的寄存器 2.2浮点数寄存器 2.3指令指针寄存器 2.4段寄存器 2.5标识寄存器 2.6控制寄存器 2.6.1控制寄存器CR0 2.6.2控制寄存器CR2 2.6.3控制寄存器CR3 ...

    目录

    1.  关于X64架构

    2.  X64架构的寄存器结构

    2.1  通用目的寄存器

    2.2 浮点数寄存器

    2.3 指令指针寄存器

    2.4 段寄存器

    2.5 标识寄存器

    2.6 控制寄存器

    2.6.1 控制寄存器CR0

    2.6.2 控制寄存器CR2

    2.6.3 控制寄存器CR3

    2.6.4 控制寄存器CR4

    2.6.5 控制寄存器CR8

    2.6.6 控制寄存器CR1,CR5-7, CR9-15

    2.7  模式指定寄存器(MSRs)(Model Specific Registers)

    2.7.1 IA32  EFER寄存器

    2.7.2  FS.base, GS.base

    2.7.3  内核GSBase

    2.8  调试寄存器(Debug Registers)

    2.8.1  DR0-DR3寄存器

    2.8.2  DR6寄存器

    2.8.3  DR7寄存器

    2.9  测试寄存器(Test Registers)

    2.10  保护模式寄存器(Protected Mode Registers)

    2.10.1  全局描述符表寄存器(GDTR)(Global Descriptor Table Registers)

    2.10.2 局部描述符表寄存器(LDTR)(Local Descriptor Table Registers)

    2.10.3 任务寄存器(TR)(Task Registers)

    2.10.4 中断描述符表寄存器(IDTR)(Interrupt Descriptor Table Registers)

    3.  X64架构调用约定

    4.  X64架构寻址模式


    1.  关于X64架构

    X64结构是一个向后兼容的X86结构的扩展。它提供了一个传统的32位模式。实际上,它等同于一个X86模式,和一个新的64位模式。

    2.  X64架构的寄存器结构

    2.1  通用目的寄存器

    X64将X86的8个通用寄存器扩展为64位,增加了8个新的通用64位寄存器。64位寄存器的名称都以字母“r”开头(当然,寄存器名称不区分大小写,也可以是“R”开头),例如,eax的64位扩展寄存器命名为rax,新增加的寄存器命名从r8到r15。

    每个寄存器的低32位,低16位,低8位可在操作数中直接寻址。这包括像esi这样的寄存器,其低8位在以前是不能直接寻址的。下面的列表指出了64位通用寄存器的低位名称。

    64位

    低32位

    低16位

    低8位

    描述

    rax

    eax

    ax

    al

    累加器

    rbx

    ebx

    bx

    bl

    基地址

    rcx

    ecx

    cx

    cl

    循环记数器

    rdx

    edx

    dx

    dl

    数据寄存器,通常扩展A寄存器

    rsi

    esi

    si

    sil

    字符串操作的源索引

    rdi

    edi

    di

    dil

    字符串操作的目的索引

    rbp

    ebp

    bp

    bpl

    栈指针

    rsp

    esp

    sp

    spl

    基地址指针(栈帧基地址)

    r8

    r8d

    r8w

    r8b

    新增通用寄存器

    r9

    r9d

    r9w

    r9b

    新增通用寄存器

    r10

    r10d

    r10w

    r10b

    新增通用寄存器

    r11

    r11d

    r11w

    r11b

    新增通用寄存器

    r12

    r12d

    r12w

    r12b

    新增通用寄存器

    r13

    r13d

    r13w

    r13b

    新增通用寄存器

    r14

    r14d

    r14w

    r14b

    新增通用寄存器

    r15

    r15d

    r15w

    r15b

    新增通用寄存器

    注意:使用REX.W指令前缀时,不能访问AH、BH、CH 和 DH。当操作数包含 64 位寄存器时,会添加此前缀(由汇编程序自动添加)。

    输出到32位子寄存器的操作数自动零扩展到整个64位寄存器(注:0扩展不影响符号位,因为有符号数最高位为1才表示负数)。输出到8位和16位字寄存器的操作数不是0扩展(这是为了兼容x86的行为)。

    ax、bx、cx和dx的高 8 位仍可寻址为ah、bh、ch、dh,但不能与所有类型的操作数一起使用。

    指令指针寄存器eip和标识寄存器flags已被分别扩展为64位。

    2.2 浮点数寄存器

    x64处理器也提供了几套浮点寄存器:

    8个80位x87 寄存器。

    8个64位MMX寄存器。(这些与x87 寄存器重叠)

    原来的8个128位SSE寄存器增加到16个。

    2.3 指令指针寄存器

    指令指针寄存器rip和标识寄存器flags已被分别扩展为64位。

    注意:指令指针只能用于rip相对寻址,它是在long模式中引入的。

    名称

    64

    32

    16

    RIP

    EIP

    IP

    2.4 段寄存器

    段寄存器全部为16位长。

    名称

    描述

    CS

    代码段

    DS

    数据段

    SS

    堆栈段

    ES

    扩展段 (用于字符串操作)

    FS

    通用目的段

    GS

    通用目的段

    无论GDT中的段描述符是什么,CS、DS、ES 和 SS的段都被视为它们的基数为 0。FS 和 GS 例外,它们有 MSR 来改变它们的基数。

    对所有段禁用限制检查。

    2.5 标识寄存器

    标识

    描述

    0

    CF

    进位标识(Carry Flag)

    1

    1

    保留(Reserved)

    2

    PF

    校验标识(Parity Flag)

    3

    0

    保留(Reserved)

    4

    AF

    辅助进位标识(Auxiliary Carry Flag)

    5

    0

    保留(Reserved)

    6

    ZF

    零标识(Zero Flag)

    7

    SF

    符号标识(Sign Flag)

    8

    TF

    陷阱标识(Trap Flag)

    9

    IF

    中断使能标识(Interrupt Enable Flag)

    10

    DF

    方向标识(Direction Flag)

    11

    OF

    溢出标识(Overflow Flag)

    12-13

    IOPL

    I/O特权级别标识(I/O Privilege Level)

    14

    NT

    嵌入任务标识(Nested Task)

    15

    0

    保留(Reserved)

    16

    RF

    恢复标识(Resume Flag)

    17

    VM

    虚拟8086标识(Virtual-8086 Mode)

    18

    AC

    对齐检查/访问控制标识(Alignment Check / Access Control)

    19

    VIF

    虚拟中断标识(Virtual Interrupt Flag)

    20

    VIP

    虚拟中断挂起标识(Virtual Interrupt Pending)

    21

    ID

    身份标识(ID Flag)

    22-63

    0

    保留(Reserved)

    2.6 控制寄存器

    2.6.1 控制寄存器CR0

    标识

    描述

    0

    PE

    保护模式使能标识(Protected Mode Enable)

    1

    MP

    监控协处理器(Monitor Co-Processor)

    2

    EM

    枚举标识(Emulation)

    3

    TS

    任务切换标识(Task Switched)

    4

    ET

    扩展标识(Extension Type)

    5

    NE

    数字错误标识(Numeric Error)

    6-15

    0

    保留(Reserved)

    16

    WP

    写入保护标识(Write Protect)

    17

    0

    保留(Reserved)

    18

    AM

    对齐掩码标识(Alignment Mask)

    19-28

    0

    保留(Reserved)

    29

    NW

    非直写标识(Not-Write Through)

    30

    CD

    缓存禁用标识(Cache Disable)

    31

    PG

    分页标识(Paging)

    32-63

    0

    保留(Reserved)

    请注意,该寄存器是唯一可以通过 2 种方式读写的控制寄存器,而其他控制寄存器只能通过 MOV 指令访问

    2.6.2 控制寄存器CR2

    该控制寄存器包含触发页面错误的线性(虚拟)地址,可在页面错误的中断处理程序中使用。

    2.6.3 控制寄存器CR3

    标识

    标述

    条件

    0-11

    0-2

    0

    保留(Reserved)

    CR4.PCIDE = 0

    3

    PWT

    页级直写(Page-Level Write Through)

    5

    PCD

    页级缓存禁用(Page-Level Cache Disable)

    5-11

    0

    保留(Reserved)

    0-11

    PCID

    CR4.PCIDE = 1

    12-63

    PML4的物理基地址(Physical Base Address of the PML4)

    请注意,这必须是页面对齐的

    2.6.4 控制寄存器CR4

    标识

    描述

    0

    VME

    虚拟8086模式扩展(Virtual-8086 Mode Extensions)

    1

    PVI

    保护模式虚拟中断(Protected Mode Virtual Interrupts)

    2

    TSD

    仅0环时间戳启用(Time Stamp enabled only in ring 0)

    3

    DE

    调试扩展(Debugging Extensions)

    4

    PSE

    分页扩展(Page Size Extension)

    5

    PAE

    物理地址扩展(Physical Address Extension)

    6

    MCE

    主机检查异常(Machine Check Exception)

    7

    PGE

    分页全局使能(Page Global Enable)

    8

    PCE

    性能监控计数使能(Performance Monitoring Counter Enable)

    9

    OSFXSR

    操作系统支持fxsave fxrstor 指令(OS support for fxsave and fxrstor instructions)

    10

    OSXMMEXCPT

    操作系统支持未屏蔽的simd浮点异常(OS Support for unmasked simd floating point exceptions)

    11

    UMIP

    用户模式指令预防(User-Mode Instruction Prevention (SGDT, SIDT, SLDT, SMSW, STR在用户模式是禁用的))

    12

    0

    保留(Reserved)

    13

    VMXE

    虚拟机扩展使能(Virtual Machine Extensions Enable)

    14

    SMXE

    更安全的模式扩展使能(Safer Mode Extensions Enable)

    15

    0

    保留(Reserved)

    17

    PCIDE

    PCID 使能PCID Enable)

    18

    OSXSAVE

    XSAVE 和处理器扩展状态使能(XSAVE And Processor Extended States Enable)

    19

    0

    保留(Reserved)

    20

    SMEP

    监督模式执行保护使能(Supervisor Mode Executions Protection Enable)

    21

    SMAP

    监督模式访问保护使能(Supervisor Mode Access Protection Enable)

    22

    PKE

    用户模式分页使能保护密钥(Enable protection keys for user-mode pages)

    23

    CET

    控制流执行技术使能(Enable Control-flow Enforcement Technology)

    24

    PKS

    监督模式分页使能保护密钥(Enable protection keys for supervisor-mode pages)

    25-63

    0

    保留(Reserved)

    2.6.5 控制寄存器CR8

    CR8是64位模式下的一个使用REX前缀可访问的新的寄存器。CR8用于优秀处理外部中断,并且被称为是任务优先级寄存器(Task-priority register,简记为TPRAMD64架构允许软件定义最多15个外部中断优先类。优先分类标号从1到15,其中,1是最低级优先级分类,15是最高优先级分类。CR8使用低序4位来指定任务优先级,而将其余60位保留且必须都置为0。系统软件可以使用 TPR 寄存器临时阻止低优先级中断去中断高优先级任务。这是通过将对应的要被阻止的最高优先级中断的值载入TPR来达成的。例如,将一个值9(对应的二进制是1001)载入TPR屏蔽所有中断优先级小于等于9的所有中断,而允许中断优先级大于等于10的中断被识别。将0载入TPR则允许所有外部中断。将15(对应二进制1111)载入TPR则禁止所有外部中断。复位时,TPR被置为0

    目的

    0-3

    优先极

    4-63

    保留

    2.6.6 控制寄存器CR1CR5-7, CR9-15

    保留,当试图访问这些寄存器的时候,CPU将抛出一个#ud异常。

    2.7  模式指定寄存器(MSRs)(Model Specific Registers)

    2.7.1 IA32  EFER寄存器

    扩展特征使能寄存器(EFER)(Extend Feature Enable Register)是AMD K6处理器中加入的模式指定寄存器,允许启用SYSCALL/SYSRET指令,而后是为了进入和退出长模式(long mode),该寄存器在AMD64中成为体系结构,被已被Intel采用。它的它的 MSR 编号是 0xC0000080。

    标识

    描述

    0

    SCE

    系统调用扩展(System Call Extensions)

    1-7

    0

    保留

    8

    LME

    长模式使能(Long Mode Enable)

    10

    LMA

    长模式激活(Long Mode Active)

    11

    NXE

    非执行使能(No-Execute Enable)

    12

    SVME

    安全虚拟机使能(Secure Virtual Machine Enable)

    13

    LMSLE

    长模式段限制使能(Long Mode Segment Limit Enable)

    14

    FFXSR

    快速FXSAVE/ FXRSTOR( Fast FXSAVE/FXRSTOR)

    15

    TCE

    翻译缓存扩展(Translation Cache Extension)

    16-63

    0

    保留

    2.7.2  FS.base, GS.base

    地址为 0xC0000100(FS)和 0xC0000101(GS)的 MSR 包含 FS 和 GS 段寄存器的基地址。 这些寄存器通常用于用户代码中的线程指针和内核代码中的 CPU 本地指针。 安全地包含任何内容,因为使用段不会赋予用户代码额外的权限。

    在较新的 CPU 中,这些寄存器也可以使用任何特权级别的 WRFSBASE 和 WRGSBASE 指令编写。

    2.7.3  内核GSBase

    MSR地址为0xC0000102。 基本上是一个在执行swapgs指令后与 GS.base 交换的缓冲区。 通常用于分隔内核和用户使用的GS寄存器。

    2.8  调试寄存器(Debug Registers)

    2.8.1  DR0-DR3寄存器

    包括最多多4个断点的线性地址。假如启用了分页机制,它们将被转换为物理地址。

    2.8.2  DR6寄存器

    允许调试器确定那一个调试条件触发了调试。当启用了调试异常,在进入调试异常处理之前,低次序的0-3位将被设置。

    2.8.3  DR7寄存器

    描述

    0

    局部DR0断点(Local DR0 Breakpoint)

    1

    全局DR0断点(Global DR0 Breakpoint)

    2

    局部DR1断点(Local DR1 Breakpoint)

    3

    全局DR1断点(Global DR1 Breakpoint)

    4

    局部DR2断点(Local DR2 Breakpoint)

    5

    全局DR2断点(Global DR2 Breakpoint)

    6

    局部DR3断点(Local DR3 Breakpoint)

    7

    全局DR3断点(Global DR3 Breakpoint)

    16-17

    DR0触发条件(Conditions for DR0)

    18-19

    DR0断点大小(Size of DR0 Breakpoint)

    20-21

    DR1触发条件(Conditions for DR1)

    22-23

    DR1断点大小(Size of DR1 Breakpoint)

    24-25

    DR2触发条件(Conditions for DR2)

    26-27

    DR2断点大小(Size of DR2 Breakpoint)

    28-29

    DR3触发条件(Conditions for DR3)

    30-31

    DR3断点大小(Size of DR3 Breakpoint)

    局部断点位在硬件任务切换时停用,而全局则不会。 00b 条件表示执行中断,01b 表示写观察点,11b 表示 R/W 观察点。 10b 为 I/O R/W 保留(不支持)。

    2.9  测试寄存器(Test Registers)

    名称

    说明

    TR3 - TR5

    无证(Undocumented)

    TR6

    测试命令寄存器(Test Command Register)

    TR7

    测试数据寄存器(Test Data Register)

    2.10  保护模式寄存器(Protected Mode Registers)

    2.10.1  全局描述符表寄存器(GDTR)(Global Descriptor Table Registers)

    操作数大小

    标识

    描述

    64

    32

    0-15

    Limit

    GDT大小

    16-79

    16-47

    Base

    GDT起始地址

    2.10.2 局部描述符表寄存器(LDTR)(Local Descriptor Table Registers)

        存储局部描述符表的段选择子。

    2.10.3 任务寄存器(TR)(Task Registers)

    存储任务状态段TSS(Task Status Segment) 段选择子。

    2.10.4 中断描述符表寄存器(IDTR)(Interrupt Descriptor Table Registers)

    操作数大小

    标识符

    描述

    64-bit

    32-bit

    0-15

    Limit

     IDT大小

    16-79

    16-47

    Base

    IDT起始地址

    3.  X64架构调用约定

    与X86调用约定不同,C/C++编译器在64位平台上仅支持一种调用约定。这种调用约定利用了64位平台上可获得的新增寄存器数量:

    (1)前4个整数或者指针参数依次通过rcx,rdx,r8和r9传递。

    (2)前4个浮点参数通过通过前4个SSE寄存器xmm0-xmm3传递。

    (3)由调用者为寄存器中的参数传递保留栈上的空间(至少在运行栈上分配32字节的阴影空间(shadow space))。被调用函数可以访问这个栈空间来,将寄存器中的内容写回栈空间。

    (4) 任何多余4个参数的其它参数都使用栈来传递,并按照从左到右的次序(即,从第5个参数开始,使用栈传递参数)。

    (5) 任何调用返回的整数或者指针值都放在rax寄存器中(调用完成执行返回动作时放在rax寄存器中,例如,调用ret指令时),而浮点数的返回值放在寄存器xmmO中。

    (6) rax,rcx,rdx,r8-r11寄存器是易失性的(volatile)。

    (7) rbx,rbp,rdi,rsi,r12-r15 寄存器是非易失性的(nonvolatile)。

    这些调用约定与C++非类似:指针默认作为第一个参数传递,其它三个参数利用余下的3个寄存器,多出4个的参数则使用栈传递。

    (8) call指令从rsp(堆栈指针)寄存器中减去 8,表示空出8字节的栈空间用于存放返回值,因为地址是64位长(8字节)。

    (9) 当调用一个子过程(subroutine)的时候,规定指令指针(rip)必须在一个16字节的边界对齐(也就是128位,即16的倍数,这可能是在设计CPU时综合性能考量)。call指令将一个8字节的返回地址压入堆栈中,因此,调用程序必须从堆栈指针中减去8,除了32,它已经减去了阴影空间。

    4.  X64架构寻址模式

    X64架构的寻址模式与X86类似,但不完全等同:

    (1)引用 64 位寄存器的指令以 64 位精度自动执行。例如:

    mov rax, [rbx] 将rbx中的8个字节移动动rax中,8个字节即64位。

    (2)64位立即常量或常量地址已加入了一种特殊形式的 mov 指令。 对于其他所有指令,立即常量或常量地址仍然是 32 位。

    (3)X64架构提供了一种新的rip相对寻址模式(rip-relative),引用单常量地址的指令被编码为基于rip的偏移量(offsets)。例如:

    mov rax, [addr] 指令移动以 addr + rip为起始地址的8字节内容到rax寄存器。

    (4)隐式引用指令指针和堆栈指针的指令(例如 jmp、call、push 和 pop)将它们视为 X64 上的 64 位寄存器。

    参考资料:

    Intel和AMD官方文档

    微软开发文档:x64 Architecture - Windows drivers | Microsoft Docs

    其它网络资源:

    CPU Registers x86-64 - OSDev Wiki

    Assembly Language Tutorial => x86 Registers

    展开全文
  • 想通过ida逆向破除一个程序的时间限制,改限制比较简单,限定了一个固定的失效时间,比如2015年1月1日,只要改系统时间就能继续使用通过用ida将程序反汇编成...需要跳过该if判断对应汇编语句如下,因为对汇编不是...
  • 很简单,使用gcc即可,我们写如下程序:pop eax复制代码保存为文本文件,命名为test.s然后.../usr/bin/ld: /tmp/ccj87S8M.o: relocation R_X86_64_32S against undefined >symbol eax' can not be used when m...
  • 条件码就是一种简单的测试ALU状态标志位的方法。 比如: 立即数:3 第一个操作数:寄存器1 ...所以它的指令机器码就是:1110 0011 1010 0000 0001 0000 0000 0011 看一下keil编译的结果:(这里是16进制)E3A01003......
  • 汇编中call指令和其对应机器码

    千次阅读 2020-04-14 11:24:52
    call这个指令很神奇,他和别的指令不太一样 对比下,当我们执行 mov eax,1 的时候,他的对应机器码是 ...所以说,在对mov指令进行汇编时,里面的常数会被直接汇编机器码 然而call指令比较有意思 这个是一段很简单...
  • 汇编指令机器码对应列表

    千次阅读 2018-05-07 15:39:59
    **指令集依照机器操作汇编助记符和汇编操作数来描述指令,遵循下列约定: l reg8: 8位寄存器。 l reg16: 16位寄存器。 l mem8: 8位内存数值。 l mem16: 16位内存数值。 l immed8: 8位立即数值。 l immed16: 16位...
  • 虽然机器码和内存地址领证在一起了,但是俩个人都和汇编指令有着说不清的关系,机器码的前任是汇编指令,而汇编指令又与内存地址暗地相通,这究竟是道德的沦丧还是人性的扭曲,今天就让我来领大家细细分解这三者的...
  • x86-64 intel64 AMD64 IA-32e x64汇编语言

    千次阅读 2019-02-15 20:31:36
    概览 本文是X86-64汇编语言的简介,是写给使用GNU软件工具的编译器开发新手的。本文不是对体系结构的...X64, AMD64, Intel-64, and EMT64和X86-64这些叫法其实是指同一个东西,但IA64是不同的。维基百科中的X86-6...
  • 如何将汇编语言转化为hex机器码

    千次阅读 2020-04-05 21:48:21
    很简单,使用gcc即可,我们写如下程序: pop eax 保存为文本文件,命名为test.s .../usr/bin/ld: /tmp/ccj87S8M.o: relocation R_X86_64_32S against undefined >symbol eax' can not be used when ...
  • 一、反汇编二进制机器码、 二、打印反汇编数据、
  • 跳转指令与机器码

    千次阅读 2018-12-02 23:41:53
    跳转指令和对应机器码 0xE8 CALL 后面的四个字节是地址 0xE9 JMP 后面的四个字节是偏移 0xEB JMP 后面的二个字节是偏移 0xFF15 CALL 后面的四个字节是存放地址的地址 0xFF25 JMP 后面的四个字节是存放地址的地址 ...
  • 常用arm汇编指令 1.1 ldr,读地址指令 ldr R0,[R1] 假设R1的值是x,那么这条语句:读地址x上的数据(4字节),保存到R0中 1.2 str,写地址指令 str R0,[R1] 假设R1的值是x,把R0的值写到地址x(4字节) ...
  • 计算机系统--机器指令与汇编

    千次阅读 2019-10-30 22:58:07
    指令: 1:计算机中的指令有微指令、机器指令和伪(宏)指令之分;...机器指令和汇编指令一一对应,它们都与具体机器结构有关,都属于机器级指令 。 操作指计算机程序中所规定的要执行操作的那一部分指令...
  • shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言/汇编编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码...
  • 机器码 :' # 打印 本条汇编代码对应机器码 for i in range(line.size): text += '%02X ' % line.bytes[i] # 打印最终数据 print(text) pass # 关闭文件 file.close() pass if __name__ == '__main__': main() 二...
  • jmp指令对应机器码

    千次阅读 2015-07-31 16:31:04
    od随便打开一个记事本,汇编几条jmp指令,可以看到如下 地址 HEX 反汇编 010073B4 - E9 7B9E8787 JMP 88881234 010073B9 - E9 769E8787 JMP 88881234 010073BE - E9 719E8787 JMP 8888123
  • jvm(五):从源代码到机器码

    千次阅读 2021-02-26 19:21:14
    在上篇文章我们聊到,无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外。那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就是今天我们要聊的。如下图所示,编译器可以分为:...
  • 手把手教你汇编 Debug

    千次阅读 多人点赞 2021-11-22 10:45:54
    关于汇编的第一篇文章: 爱了爱了,这篇寄存器讲的有点意思 Hello大家好,我是程序员cxuan!我们上篇文章了解了一下基本的寄存器,这篇文章我们来进行实际操作一下。 原文链接:手把手教你汇编 Debug 我们以后将会...
  • i386平台和x86-64平台机器代码的区别

    千次阅读 2016-03-29 23:18:42
    i386平台和x86_64平台机器代码的区别  By Qianghaohao
  • 指令就是把机器码中特定的0和1序列,简化成对应的指令(一般为英文简写,如mov,inc等),可读性稍好 (由于不同的硬件平台,执行同一个操作,对应机器码可能不同,所以不同的硬件平台的同一种指令(比如mov),...
  • 汇编--编写z = |x-y|

    千次阅读 2018-12-24 14:54:24
    .model small .stack .data x db 1 y db 5 z db '?' .code start: mov ax,@data mov ds,ax xor ax,ax mov al,x cmp al,y jb xly ;(al)&lt;y 则转移 sub...
  • 程序入口 Start //测试代码,添加在以下位置即可,后面不再贴完整代码 mov r1,#0x80000001 OVER END 然后点击debug按钮,查看对应机器码: 得到mov r1,#0x80000001指令的机器码是E3A01106 我们来分析这个机器码...
  • 常用的DEBUG命令1.1 用R命令查看、改变CPU寄存器的内容1.2 用D命令查看内存中的内容1.3 用E指令修改内存中的内容1.4 用U命令查看内存中机器码的含义1.5 用T命令执行指令1.6 使用A命令以汇编指令的形式再内存写入...
  • nasm如我们所知是汇编器,汇编器就是把一个用汇编语言写好的文件,就像我们的hello-world.asm转换成机器码机器码告诉计算机执行什么操作,nasm生成的文件就叫做目标文件,在我们这个小例子中,nasm产生一个叫做...
  • 8086汇编语言精华笔记总结~

    千次阅读 多人点赞 2020-07-09 20:17:30
    汇编语言的基础知识1、计算机系统概述2、汇编语言介绍3、数据表示4、8086微处理器1、通用寄存器2、标志寄存器FLAGS3、指令指针IP4、段寄存器5、8086寻址方式1、指令的组成2、8086的机器代码格式3、立即数寻址方式4、...
  • 因为项目的一些需求,需要查看一些汇编指令对应的机器码是什么,也需要查看一些机器码对应汇编指令是啥,经过网上查找的一些资料,找到了一个比较轻量、方便、快捷的方法。 解决方法 首先第一步需要配置arm-linux-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,974
精华内容 9,189
热门标签
关键字:

x64汇编机器码对应表