Команда CMP
в ассемблере x86 используется для сравнения двух операндов. Она вычитает второй операнд из первого, но не сохраняет результат, вместо этого обновляет флаги процессора на основе результата этого вычитания.
Пример кода
mov ax, 5 ; загрузить 5 в регистр AX
mov bx, 3 ; загрузить 3 в регистр BX
cmp ax, bx ; сравнить AX с BX
Описание работы CMP
Команда cmp ax, bx
выполняет операцию ax - bx
(т.е. 5 - 3
), и обновляет флаги процессора, не сохраняя результат вычитания.
Флаги процессора, которые обновляются командой CMP
-
Zero Flag (ZF):
- Устанавливается в 1, если результат сравнения равен нулю.
- Сбрасывается в 0, если результат сравнения не равен нулю.
- В нашем примере
5 - 3 = 2
, поэтомуZF = 0
.
-
Sign Flag (SF):
- Устанавливается в 1, если результат сравнения отрицательный (старший бит результата равен 1).
- Сбрасывается в 0, если результат сравнения положительный (старший бит результата равен 0).
- В нашем примере
2
положительное число, поэтомуSF = 0
.
-
Overflow Flag (OF):
- Устанавливается в 1, если при вычитании произошел переполнение по знаковому разряду.
- Сбрасывается в 0, если переполнение не произошло.
- В нашем примере переполнения не происходит, поэтому
OF = 0
.
-
Carry Flag (CF):
- Устанавливается в 1, если произошло заимствование из старшего разряда при вычитании (т.е. если
ax < bx
). - Сбрасывается в 0, если заимствования не произошло.
- В нашем примере заимствования нет, поэтому
CF = 0
.
- Устанавливается в 1, если произошло заимствование из старшего разряда при вычитании (т.е. если
-
Parity Flag (PF):
- Устанавливается в 1, если число единичных битов в младшем байте результата четное.
- Сбрасывается в 0, если число единичных битов в младшем байте результата нечетное.
- В нашем примере результат
2
(в двоичном виде00000010
), и число единичных битов четное (1 бит), поэтомуPF = 0
.
-
Auxiliary Carry Flag (AF):
- Устанавливается в 1, если произошло заимствование из младших 4 битов в старшие 4 бита при вычитании.
- Сбрасывается в 0, если заимствования не произошло.
- В нашем примере заимствования нет, поэтому
AF = 0
.
Результаты в примере
После выполнения команды cmp ax, bx
(cmp 5, 3
), результат сравнения (5 - 3 = 2) приводит к следующим значениям флагов:
- ZF = 0: результат сравнения не равен нулю.
- SF = 0: результат сравнения положительный.
- OF = 0: переполнения не произошло.
- CF = 0: заимствования не произошло (5 больше 3).
- PF = 0: число единичных битов в младшем байте результата нечетное (1 бит).
- AF = 0: заимствования не произошло.
Эти флаги затем могут быть использованы в условных переходах для выполнения различных операций в зависимости от результата сравнения.