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

标签 assembly x86-64 gnu gnu-assembler yasm

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 偏移量(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 做同样的事情?

最佳答案

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

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

关于assembly - Gnu 汇编程序给出了意外的内存操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30106845/

相关文章:

windows - 如何诊断、调试 MinGW-get GUI (guimain.exe) 崩溃?

c - 硬故障处理 - Arm Cortex-M0

c - 如何解释 C 中的缓冲区溢出漏洞

c - GCC - 编译时出错

linux - 如何在没有系统调用的情况下在 x86-64 程序集 (NASM) 中将字符串打印到终端?

c++ - 使用读取 [ebp+4] 的 MSVC 内联 asm 移植到 64 位

performance - 为什么数据转发和停顿周期在处理负载使用风险方面比 NOP 更有效?

汇编,根据寄存器的值获取字符串中的特定字符

linux - gnu 联机帮助页,关于 "env"命令的两个版本的文档

gdb - 如何从终端使用 GDB(Gnu Debugger)和 OpenOCD 进行微 Controller 调试?