delphi XE2中如何从绝对地址读取数据
假设我想在 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位操作码(查看上面的操作码)而不是更长的64位操作码。
有什么方法可以告诉编译器使用短的 32 位地址操作码而不是长的吗?
Let's say that I want to read from absolute address gs:$30
in 64bit mode, so the asm code looks something like:
asm
mov rax, gs:[$30]
end;
...and compiler translate this code to...
65 48 8B 05 30 00 00 00 mov rax,gs:[rel $00000030]
But I don't want to use relative address (rip + $30)
. I want the compiler to use absolute address and compile in this way:
65 48 8B 04 25 30 00 00 00 mov rax,gs:[+$0030]
(It is the same, if I use gs:
prefix or not!)
How do I do this?
EDIT:
I know for work-around. I ask if exist any comand to tell compiler to address location as absolute instead relative.
EDIT
So far so good... :)
drhirsch helped me to find the command, and now the compiler translates:
mov rax, gs:[abs qword ptr $30]
or
mov rax, gs:[abs $30]
to this:
6548A13000000000000000 mov rax,[qword $0000000000000030]
Which is almost ok :) Because I want short 32bit opcode (look upper opcodes) instlonger long 64bit opcode.
Is there any way to tell compiler to use short 32 bit address opcode instead long?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要使用 movabs 指令。
编辑:rip 相对寻址是默认模式,在某些汇编器上,您可以强制使用 32 位绝对寻址
You need to use the
movabs
instruction.Edit: rip relative addressing is the default mode, on some assemblers you may be able to force 32 bit absolute addressing with