Написание сборки 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