Толик Панков
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

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/

From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message:



Notice! This user has turned on the option that logs IP addresses of anonymous posters.