Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
Assembler: проверка условий и переходы (jump)

Небольшая шпаргалка по условным и безусловным переходам.

Безусловный переход: выполняется командой JMP <метка>, может использоваться, как для перехода вперед, пропуская некоторые команды в коде, так и для возврата назад, для повторного выполнения инструкций:

1.

	...
	какой-то код
	...
	JMP	label1
	...
	какой-то код
	...
label1:
	...
	другой код
	выполняется после срабатывания
	инструкции JMP
	...

2.
	...
	какой-то код
	...
labelret:
	...
	какой-то код
	...
	JMP	labelret


Условный переход: Выполняется, если выполнено какое-либо условие, переход осуществляется командой Jxx <метка>, где xx - мнемоника, указывающая на проверяемое условие.

Инструкция CMP


Инструкция CMP сравнивает два операнда, в основном вычитая один операнд из другого для сравнения, равны ли операнды или нет, не изменяя целевой или исходный операнд. Инструкция CMP используется вместе с инструкцией условного перехода для принятия решения. CMP изменяет регистр флагов, который потом проверяет соответствующая инструкция условного перехода, и осуществляет (не осуществляет) переход по соответствующему адресу (метке).

Синтаксис:

CMP целевой_операнд, исходный_операнд

CMP сравнивает два числа. В качестве целевого операнда может использоваться значение в регистре или в памяти. Исходный операнд может быть константой (EQU), непосредственно числом, значением в регистре или памяти. Так же, оба операнда не могут быть одновременно значениями в памяти.

ПравильноНеправильноОшибка (MASM)
cmp eax, ecxMYVALUE1 dd 2
MYVALUE2 dd 5
...
cmp MYVALUE1, MYVALUE2
invalid instruction operands
cmp eax, 0cmp 0, eaximmediate operand not allowed
ERROR_FLAG EQU 16h
...
cmp eax, ERROR_FLAG
ERROR_FLAG EQU 16h
...
cmp ERROR_FLAG, eax
immediate operand not allowed
MYVALUE dd ?
...
cmp eax, MYVALUE
--
MYVALUE dd ?
...
cmp MYVALUE, eax
--
MYVALUE dd ?
...
cmp MYVALUE, 0
MYVALUE dd ?
...
cmp 0, MYVALUE
immediate operand not allowed
MYVALUE dd ?
ERROR_FLAG EQU 16h
...
cmp MYVALUE, ERROR_FLAG
MYVALUE dd ?
ERROR_FLAG EQU 16h
...
cmp ERROR_FLAG, MYVALUE
immediate operand not allowed
-cmp 0, 1immediate operand not allowed
-CONST1 equ 1
CONST2 equ 2
...
cmp CONST1, CONST2
immediate operand not allowed


Также нужно быть внимательным при сравнении значения в памяти и регистре, если их размерность будет не совпадать, это приведет к ошибке компиляции. Например, при сравнении регистра EAX, имеющего разрядность двойное слово (DWORD) с переменной, разрядность которой установлена, как байтовая (DB):

...
MYVALUE db 1
...
cmp eax, MYVALUE
...
;Ошибка: invalid instruction operands


Условные переходы


Результаты арифметических операции для знаковых чисел


ИнструкцияОписаниеПроверяемые флаги
JE/JZЕсли значения равны/Если значение 0ZF
JNE/JNZЕсли значения не равны/Если значение не 0ZF
JG/JNLEЕсли больше/Если не меньше или равноOF SF ZF
JGE/JNLЕсли больше или равно/Если не меньшеOF SF
JL/JNGEЕсли меньше/Если не больше или равноOF SF
JLE/JNGЕсли меньше или равно/Если не большеOF SF ZF


Результаты арифметических операции для беззнаковых чисел или логических операций

ИнструкцияОписаниеПроверяемые флаги
JE/JZЕсли значения равны/Если значение 0ZF
JNE/JNZЕсли значения не равны/Если значение не 0ZF
JA/JNBEЕсли больше/Если не меньше или равноCF ZF
JAE/JNBЕсли больше или равно/Если не меньшеCF
JB/JNAEЕсли меньше/Если не больше или равноCF
JBE/JNAЕсли меньше или равно/Если не большеAF CF


Прочие инструкции для условных переходов


Эти инструкции имеют специальное применение и проверяют значения отдельных флагов во флаговом регистре.

ИнструкцияОписаниеПроверяемые флаги
JXCZЕсли значение в регистре CX равно 0Нет
JCЕсли произошел перенос в результате арифметической операцииCF
JNCПеренос не произошелCF
JOПроизошло переполнениеOF
JNOПереполнение не произошлоOF
JP/JPEЧисло единичных бит четноеPF
JNP/JPOЧисло единичных бит нечетноеPF
JSЧисло со знаком (отрицательное)SF
JNSЧисло без знака (положительное)SF


Ссылки


Регистр флагов с описанием значений флагов (копия)

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2022/05/23/assembler-proverka-uslovij-i-perehody-jump/

Comments

На флаги создействует не только cmp.
Ты забыл рассказать о префексе длинного перехода на два байта для 386. Или там не префикс а другой код команды? Я не помню... А хорошо бы коды тоже...

>На флаги создействует не только cmp.
Согласен

>Ты забыл рассказать о префексе длинного перехода на два байта для 386. Или
>там не префикс а другой код команды? Я не помню... А хорошо бы коды тоже...
Дык он во FLAT-модели памяти и не используется особо, это если под DOS программировать, где FLAT или TINY для .com файлов используется, а для .exe можно выбирать. Если код в нескольких сегментах, используется модель LAGRE, тогда надо использовать длинный джамп (или зачем-то надо упрыгать к черту на рога из своего экзешника), а мнемоника была JMP для длинного, или JMPS/JMP SHORT для короткого, если конь-пилятор умный, то он смотрел, куда прыгаешь, и сам подставлял опкод для нужного джампа, а если конь-пилятор деревянный, то надо было строго указывать JMPS, а то он в любом случае генерил код для длинного, если даже оно нафик не нужно, и жрал лишние байты.

Для короткого джампа опкод EB??, где вместо ?? смещение, а для длинного FF25 и дальше вроде 4 байта под адрес, ЕМНИС. Но опкоды я на память не помню, так что тут могу накосячить.