【问题标题】:How to read data from absolute address in delphi XE2如何从delphi XE2中的绝对地址读取数据
【发布时间】: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


【解决方案1】:

你需要使用movabs指令。

movabs  rax, gs:[$30]

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

mov rax, gs:[dword $30]  #nasm, tasm
mov rax, gs:[abs $30]    #yasm

【讨论】:

  • 嗯,但编译器坚持:[DCC Error] Project1.dpr(20): E2003 Undeclared identifier: 'movabs'
  • 另外两种方法坚持:[DCC Error] Project1.dpr(21): E2105 Inline assembler syntax error
  • 感谢正确的方法是:mov rax, gs:[abs qword ptr addr] 但编译器使用长 64 位操作码 insted 短 32 位操作码。知道如何解决这个问题吗?
  • 不,编译器声明:[DCC Error] Project1.dpr(20): E2107 Operand size mismatch
  • 你为什么关心汇编器选择使用哪个操作码?如果您想在操作码中编程,然后使用db 将操作码字节直接插入代码中。否则,让汇编器选择它希望如何汇编您的代码。我看不出还有什么需要解决的。
猜你喜欢
  • 2021-12-15
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2023-03-23
  • 2021-03-27
相关资源
最近更新 更多