6

假设我想以gs:$3064 位模式从绝对地址读取,所以 asm 代码如下所示:

asm
  mov   rax, gs:[$30]
end;

...和编译器将此代码翻译为...

  65 48 8B 05 30 00 00 00       mov rax,gs:[rel $00000030]

但我不想使用相对地址(rip + $30)。我希望编译器使用绝对地址并以这种方式编译:

  65 48 8B 04 25 30 00 00 00    mov rax,gs:[+$0030]

(无论我是否使用gs:前缀,都是一样的!)

我该怎么做呢?

编辑:

我知道解决方法。我问是否存在任何命令来告诉编译器将位置地址作为绝对地址而不是相对地址。

编辑

到现在为止还挺好... :)

drhirsch 帮我找到了命令,现在编译器翻译:

mov   rax, gs:[abs qword ptr $30]
or
mov   rax, gs:[abs $30]

对此:

6548A13000000000000000 mov rax,[qword $0000000000000030]

这几乎没问题 :) 因为我想要短的 32 位操作码(看上面的操作码)instlonger long 64bit opcode。

有没有办法告诉编译器使用短的 32 位地址操作码而不是长的?

4

1 回答 1

4

您需要使用该movabs指令。

movabs  rax, gs:[$30]

编辑:rip 相对寻址是默认模式,在某些汇编器上,您可以强制使用 32 位绝对寻址

mov rax, gs:[dword $30]  #nasm, tasm
mov rax, gs:[abs $30]    #yasm
于 2011-12-15T14:20:37.903 回答