【发布时间】:2011-12-15 13:51:06
【问题描述】:
假设我想在 64 位模式下从绝对地址 gs:$30 读取,所以 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 位地址操作码而不是长的?
【问题讨论】:
-
我手头没有 64 位 Delphi,只是猜测 - 使用寄存器而不是像这样的文字值:
mov RAX,$30; mov RAX,gs:[RAX] -
@Serg:当然,但这是一种变通方法!我问是否存在任何命令告诉编译器将位置地址作为绝对地址而不是相对地址。
-
你为什么不一开始就问这个
-
在任何地方都找不到它的文档。可能没有办法强制裸绝对偏移量。但是问问 Embarcadero 的人。
-
请单独询问您的操作码大小问题。你已经得到了你最初提出的问题的答案,在你已经得到有效的答案之后再改变这么多问题是不公平的。
标签: delphi assembly delphi-xe2 x86-64 basm