x86-64 Синтаксис Intel для немедленного операнда rel8?
Первая форма JMP в x86-64:
Opcode Instruction Description
EB cb JMP rel8 Jump short, RIP = RIP + 8-bit displacement sign
Так например JMP rel8=-2
является eb fe
, fe
является однобайтовым 2-комплиментом со знаком -2.
Как мне выразить это rel8 немедленно в синтаксисе Intel?
Я попробовал следующее:
test.s:
.intel_syntax noprefix
.global _start
_start:
jmp -2
Компилировать с:
$ gcc -nostdlib test.s
$ objdump -d -M intel
Но я получаю:
e9 00 00 00 00 jmp 5 <_start+0x5>
Не eb fe
по желанию.
(В целом, где документируется синтаксис Intel? Я не смог найти в руководстве Intel ничего об этом. Руководство Intel объясняет, как кодировать операнды, но не дает синтаксиса языка ассемблера.)
Обновить:
Решение:
.intel_syntax noprefix
.global _start
_start:
jmp .
.
должен представлять адрес текущей инструкции. Сборка и разборка дает:
4000d4: eb fe jmp 4000d4 <_start>
eb fe
по желанию. RIP-относительная адресация относится к следующей инструкции, поэтому ассемблер должен отрегулировать размер текущей инструкции для вас.
1 ответ
(G) КАК, по-видимому, использует .
обозначить текущий адрес (адрес текущей инструкции), в отличие от большинства других ассемблеров.
Здесь есть крошечная страница, документирующая это здесь, в документации.