Написание сборки AT&T для работы с флагом четности и смещениями

У меня есть определенный набор инструкций на x64, которые в конечном итоге либо устанавливают флаг четности, либо сбрасывают его. Я хотел бы написать некоторую сборку, которая пропускает инструкцию установленного флага четности. Из того, что я прочитал из руководств онлайн jpe это инструкция, которая выполняет переход, если установлен флаг четности и jpo это инструкция, которая выполняет переход, если флаг четности не установлен.

Мне требуется выполнение, чтобы перейти вперед на 3 байта, если установлен бит четности. Изначально я попробовал следующее, но он просто переходит на адрес 0x3 а не смещение от RIP.

jpe 0x3

Я понял, что если бы я использовал синтаксис Intel, я мог бы сделать следующее.

jpe $+0x3

Однако, это, кажется, не работает для AT&T, и я получаю следующее сообщение об ошибке.

test.c: Assembler messages:
test.c:46: Error: operand type mismatch for `jpe'

Как я могу это исправить?

1 ответ

Решение

ГАЗ всегда хочет контролировать прыжки, смотрите официальную документацию.

Как упоминал Джестер, вы можете использовать .+3 как своего рода метка, где точка обозначает адрес фактической строки (как "$" в других ассемблерах). GAS рассчитает относительное расстояние и соответствующий прыжок. Есть одно предостережение: хотя точка является адресом реальной строки, относительный переход вычисляется из адреса следующей инструкции. Так jpe .+3 производит 7A 01 знак равно jpe short 1,

Другим вариантом является использование метки. Я предлагаю местный лейбл, который даже можно переопределить:

mov $0b110, %eax        # Parity = even
test %eax, %eax         # Set PF
jpe 0f                  # Jump forward to the next "0:"
.byte 0,0,0
0:                      # Local label
Другие вопросы по тегам