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) КАК, по-видимому, использует . обозначить текущий адрес (адрес текущей инструкции), в отличие от большинства других ассемблеров.

Здесь есть крошечная страница, документирующая это здесь, в документации.

Другие вопросы по тегам