【问题标题】:Gnu assembler gives unexpected memory operandGnu 汇编器给出了意外的内存操作数
【发布时间】:2021-09-12 18:53:51
【问题描述】:

GNU 汇编器在汇编 Intel 语法代码时给出了一个意外的内存操作数。

我已将我的错误减少为一行代码,在过去的三天里,我尝试了任何方法来理解为什么 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')。

问题: 为什么内存操作数 QWORD PTR [rcx+0x8] 中多了一个 qword 偏移量(8bytes)?我期待 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 做同样的事情?

【问题讨论】:

  • qword 而不是 qword ptr 是 NASM 语法。不幸的是,GAS 没有出错,并且具有这种“故障模式”,因为它允许 123[reg] 作为地址语法。我认为也有一些关于 MASM 本身的 SO Q&A 有简单的 dword 是常数 4,这似乎也很糟糕。特别是对于 MASM,它具有像 typeof 这样的关键字来将类型名转换为 add edi, typeof foo 的大小。糟糕的设计 IMO。

标签: assembly x86-64 gnu gnu-assembler yasm


【解决方案1】:

你需要写mov rax, qword ptr [rcx]。显然qword 本身可以解析为大小,即。 8,所以你的代码组装成mov rax, 8[rcx]。事实上,mov rax, qword 也组装为mov rax, 8

有趣的是,您的“交叉检查”如何使用正确的语法:)

【讨论】:

  • 非常简单,这是有道理的,而且有效,thanx。这是一个真正的虫子磁铁。应该有一些警告......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多