Как читать данные с абсолютного адреса в delphi XE2 - PullRequest
6 голосов
/ 15 декабря 2011

Допустим, я хочу читать с абсолютного адреса gs:$30 в 64-битном режиме, поэтому код 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 64-битный код операции.

Есть ли способ сказать компилятору использовать короткий код операции с 32-битным адресом вместо long?

1 Ответ

4 голосов
/ 15 декабря 2011

Вам необходимо использовать инструкцию movabs.

movabs  rax, gs:[$30]

Редактировать: относительная адресация в режиме rip является режимом по умолчанию, на некоторых ассемблерах вы можете использовать 32-битную абсолютную адресацию с помощью

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