У меня есть определенный набор инструкций для 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'
Как я могу это исправить?
jpe .+3
должно работать. - person Jester   schedule 08.10.2015jpe .+3
производит7A 01
=jpe short 0x01
. Вы должны добавить количество байтов, потребляемыхjpe
(=2). - person rkhb   schedule 08.10.2015$+0x3
тоже производит это (в ассемблере, который использует$
, такой какnasm
), в любом случае, я надеюсь, что он сможет разобраться с этим сам :) - person Jester   schedule 08.10.2015jp
/jnp
для одних и тех же инструкций могут сделать ваш код более понятным, если ваше условие четности на самом деле не отражает четность/нечетность чего-либо. (например, если флаг установлен SAHF). - person Peter Cordes   schedule 09.10.2015