x86_64汇编器的gcc错误(操作码0x83 cmp m64 / imm8)

问题描述 投票:1回答:1

当我尝试编译时

int main(void)
{
        __asm__("cmp  $0x1,0x555557e20b58");    

    return 0;
}

我知道

main.cpp: Assembler messages:
main.cpp:6: Error: operand type mismatch for `cmp'

编译命令为“ gcc main.cpp -o main”。它适用于m32值,例如“ asm(” cmp $ 0x1,0x555557e2“);”。

根据this X86 Opcode and Instruction Reference,有一个操作码为0x83,modrm_reg:7的命令,称为“ CMP”,第一个参数:r / m16 / 32/64,第二个参数:imm8,描述:“比较两个操作数”。为什么gcc找不到它?我尝试使用CMPQ,但无济于事。

我尝试编译此指令的原因是我想查看机器代码。

这是来自“英特尔®64和IA-32架构软件开发人员手册”:

REX.W + 83 /7 ib    CMP r/m64, imm8 MI  Valid   N.E.    Compare imm8 with r/m64.

因此,我希望获得机器代码

  • 第一个字节为0x48(REX.W)和
  • 第二个字节为操作码0x83。
  • 对于第三个字节(ModR / M),我迷路了:

手册说“ / digit —数字在0到7之间,表示指令的ModR / M字节仅使用r / m(寄存器或存储器)操作数。reg字段包含为该数字提供扩展名的数字。指令的操作码。”因此,据我所知,modrm_reg =7。那么r / m是什么呢?

  • 字节4-11将是8字节的值
  • 字节12比较imm8值
c assembly x86-64 inline-assembly
1个回答
0
投票

x86_64中没有指令格式,它指定64位绝对地址-在32位模式下指定32位绝对地址的编码用于RIP相对寻址-32位(带符号)指令指针的位移。

因此,如果您想在64位模式下执行此类操作,则需要执行以下操作

 __asm__("cmp  $0x1,symbol(%rip)");

并安排在链接器中,将代码链接到固定地址(无ASLR),并且将symbol定义为0x555557e20b58。

© www.soinside.com 2019 - 2024. All rights reserved.