Допустим, я хочу читать с абсолютного адреса 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-битный код операции (смотрите верхние коды операций), чтобы длиннее длинный 64-битный код операции.
Есть ли способ указать компилятору использовать короткий 32-битный адресный код операции вместо длинного?