Превосходное обслуживание и передовые технологии от CMP
Команда cmp (сокращение от сравнения) используется для сравнения двух значений или переменных. Ее синтаксис выглядит так:
cmp arg1, arg2
где arg1 и arg2 могут быть регистрами, памятью или константами.
Результат выполнения cmp записывается в регистр флагов, который содержит информацию о последней операции. В частности, при сравнении двух операндов, устанавливаются флаги регистра флагов в зависимости от того, какой операнд больше. Если arg1 больше arg2, то флаги CF (Carry Flag) и ZF (Zero Flag) установлены в 0, а флаг SF (Sign Flag) устанавливается в значение знака arg1 - arg2. Если arg1 меньше arg2, то CF и ZF также устанавливаются в 0, а SF устанавливается в значение знака arg1 - arg2, но с обратным знаком. Если arg1 равен arg2, то CF устанавливается в 1, а ZF и SF - в 0.
Рассмотрим примеры кода на Ассемблере, демонстрирующие работу команды cmp.
Пример 1. Сравнение двух чисел.
section .data
num1 db 5
num2 db 7
section .text
global _start
_start:
mov al, num1 ; помещаем первое число в регистр al
cmp al, num2 ; сравниваем его со вторым числом
jge Greater ; если первое число больше или равно второму, переходим на метку Greater
jmp Less ; иначе переходим на метку Less
Greater:
mov eax, 4 ; выводим сообщение "Первое число больше или равно второму"
mov ebx, 1
mov ecx, message1
mov edx, 28
int 0x80
jmp Exit
Less:
mov eax, 4 ; выводим сообщение "Первое число меньше второго"
mov ebx, 1
mov ecx, message2
mov edx, 25
int 0x80
jmp Exit
Exit:
mov eax, 1 ; завершаем программу
xor ebx, ebx
int 0x80
section .data
message1 db 'Первое число больше или равно второму', 10
message2 db 'Первое число меньше второго', 10
В этом примере мы сравниваем два байта (5 и 7) и выводим сообщение в зависимости от результата сравнения.
Пример 2. Сравнение строк.
section .data
str1 db 'Hello'
str2 db 'World'
section .text
global _start
_start:
mov eax, str1 ; перемещаем адрес первой строки в eax
mov ebx, str2 ; перемещаем адрес второй строки в ebx
cmp eax, ebx ; сравниваем два адреса
je Equal ; если адреса равны, переходим на метку Equal
jg Greater ; если адрес первой строки больше, переходим на метку Greater
jl Less ; если адрес первой строки меньше, переходим на метку Less
Greater:
mov eax, 4 ; выводим сообщение "Первая строка больше второй"
mov ebx, 1
mov ecx, message1
mov edx, 28
int 0x80
jmp Exit
Less:
mov eax, 4 ; выводим сообщение "Первая строка меньше второй"
mov ebx, 1
mov ecx, message2
mov edx, 25
int 0x80
jmp Exit
Equal:
mov eax, 4 ; выводим сообщение "Строки равны"
mov ebx, 1
mov ecx, message3
mov edx, 15
int 0x80
jmp Exit
Exit:
mov eax, 1 ; завершаем программу
xor ebx, ebx
int 0x80
section .data
message1 db 'Первая строка больше второй', 10
message2 db 'Первая строка меньше второй', 10
message3 db 'Строки равны', 10
Здесь мы сравниваем две строки и выводим сообщение в зависимости от того, какая строка больше. При сравнении двух строк, cmp сравнивает адреса строк, а не их содержимое.
Это были примеры использования команды cmp в Ассемблере. Сравнение значений или переменных - это одна из часто используемых операций в программах на Ассемблере, поэтому знание команды cmp необходимо для работы с этим языком программирования.