Gnu 汇编程序给出了意外的内存操作数
Gnu assembler gives unexpected memory operand
GNU 汇编程序在汇编 Intel 语法代码时给出了意外的内存操作运行d。
我已将我的错误减少到一行代码,在过去的三天里,我尝试了任何方法来理解为什么 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')。
问题:
为什么在内存ope运行d 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
关于内存操作运行d,这是我所期望的。我怎样才能指示 GNU 做同样的事情?
你需要写mov rax, qword ptr [rcx]
。显然 qword
本身解析为大小,即。 8
,因此您的代码组装为 mov rax, 8[rcx]
。实际上,mov rax, qword
也可以汇编为 mov rax, 8
。
有趣的是你的 "cross check" 使用了正确的语法 :)
GNU 汇编程序在汇编 Intel 语法代码时给出了意外的内存操作运行d。
我已将我的错误减少到一行代码,在过去的三天里,我尝试了任何方法来理解为什么 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')。
问题: 为什么在内存ope运行d 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
关于内存操作运行d,这是我所期望的。我怎样才能指示 GNU 做同样的事情?
你需要写mov rax, qword ptr [rcx]
。显然 qword
本身解析为大小,即。 8
,因此您的代码组装为 mov rax, 8[rcx]
。实际上,mov rax, qword
也可以汇编为 mov rax, 8
。
有趣的是你的 "cross check" 使用了正确的语法 :)