2015-05-07 32 views
1

GNU汇编组装Intel语法代码时给出了一个意想不到的存储器操作数。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的)。

问题: 为什么会有一个额外的一个四字偏移量(8字节)的内存操作数QWORD PTR [RCX + 0x8中]?我期待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

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

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

+1

非常简单,这是有道理的,它的工作,thanx。这是一个真正的臭虫磁铁。应该有一些警告...... – HJLebbink