首页 文章

Gnu汇编程序给出了意外的内存操作数

提问于
浏览
1

在组装英特尔语法代码时,GNU汇编程序会提供意外的内存操作数 .

我已经将我的错误减少到一个单独的代码行,并且在过去的三天里,我已经尝试过任何事情来理解为什么GNU汇编器会产生一些我无法理解的东西 . 我知道这必须(或应该)是微不足道的,但我不知所措 .

以下文本位于文件code.asm中:

.intel_syntax noprefix
.global somecode
somecode: 
    int 3
    mov        rax,qword [rcx]
    ret
.att_syntax

使用以下代码组装和反汇编code.asm:

as code.asm -o code1.obj -64 
objdump -Mintel -d code1.obj > code1.asm

code1.asm(包含反汇编代码)的内容是:

code1.obj:     file format pe-x86-64
Disassembly of section .text:
0000000000000000 <somecode>:
   0:   cc                      int3 
   1:   48 8b 41 08             mov    rax,QWORD PTR [rcx+0x8]
   5:   c3                      ret

我正在使用GNU汇编程序(GNU Binutils)2.25(`x86_64-pc-cygwin') .

Question :为什么内存操作数QWORD PTR [rcx 0x8]中有一个额外的qword偏移量(8字节)?我期待mov rax,QWORD PTR [rcx] .

我一定做错了什么 . 所以我和另一位受人尊敬的汇编Yasm交叉核对并跑了:

yasm -f x64 -o code2.obj --parser=gas code.asm
objdump -Mintel -d code2.obj > code2.asm

code2.asm的内容是:

code2.obj:     file format pe-x86-64
Disassembly of section .text:
0000000000000000 <somecode>:
   0:   cd 03                   int    0x3
   2:   48 8b 01                mov    rax,QWORD PTR [rcx]
   5:   c3                      ret

关于内存操作数,这是我的预期 . 我如何指示GNU做同样的事情?

1 回答

  • 1

    你需要写 mov rax, qword ptr [rcx] . 显然 qword 本身解析为大小,即 . 8 ,因此您的代码汇编为 mov rax, 8[rcx] . 实际上, mov rax, qword 也组装为 mov rax, 8 .

    你的“交叉检查”使用正确的语法:)这很有趣:)

相关问题