Как стать программистом Как устроен компьютер. Что такое программа. Как написать свою программу. И многое другое узнаете вы из этой книги. Получить бесплатно! |
Команда CMPSB
Лучшие книги по Ассемблеру
Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится. Подробнее... |
Команда CMPSB в Ассемблере выполняет сравнение последовательности байтов из участка памяти, адрес которого указан в регистре ESI с другим участком, адрес которого указан в регистре DSI. Синтаксис:
CMPSB
Команда не имеет операндов. В зависимости от результата могут изменяться флаги OF, SF, ZF, AF, PF, CF.
ПРИМЕЧАНИЕ: Для процессора 8086 используются пары регистров ES:DI и DS:SI, как это показано в примере ниже.
Алгоритм выполнения команды CMPSB:
- DS:[SI] - ES:[DI]
- Установить флаги OF, SF, ZF, AF, PF, CF в соответствии с результатом
- Если DF = 0 то:
- SI = SI + 1
- DI = DI + 1
- Иначе:
- SI = SI - 1
- DI = DI - 1
Подробнее про флаг DF можете почитать здесь.
То есть с помощью команды REPE команда CMPSB выполняется до тех пор, пока флаг ZF равен 1. Однако команда вызывается не более, чем указано в СХ (а в этом регистре указана длина массива данных - количество байтов для сравнения).
То есть выполняется последовательное сравнение двух массивов данных побайтно. И если какая-то пара байтов в последовательности отличается, то флаг ZF будет сброшен в 0 и вызов команды CMPSB прекратится, даже если ещё не весь массив данных проверен. Таким образом выполняется поверка байтов на равенство до первого несовпадения.
Это также позволяет определить номер байта в массиве, где обнаружено несовпадение (этот номер будет в счётчике СХ после завершения сравнения, отсчёт начинается с нуля).
С помощью команды CMPSB в Ассемблере можно сравнивать, например, строки, как это показано в примере:
.model tiny .code ORG 100h ;Сбросить флаг направления CLD ;Загрузить источник (source) в DS:SI ;Загрузить цель (target) в ES:DI MOV AX, CS MOV DS, AX MOV ES, AX LEA SI, str1 LEA DI, str2 ;Установить счётчик для размера данных в словах MOV CX, size ;Сравнивать, пока равно REPE CMPSB JNZ NotEqual ;"yes" - равно MOV AL, 'y' MOV AH, 0Eh INT 10h JMP ExitHere NotEqual: ;"no" - не равно MOV AL, 'n' MOV AH, 0Eh INT 10h ExitHere: ;Ждать нажатия клавиши: MOV AH, 0 INT 16h RET ;Массивы данных должны иметь одинаковый размер: x1: str1 DB 'Test string' str2 DB 'Test string' size = ($ - x1) / 2
Напоследок, как всегда, о происхождении аббревиатуры CMPSB.
CMP - это сокращение от английского слова COMPARE, которое можно перевести как “сравнить”. Ну а SB - это Set Bytes - набор байтов.
А всё вместе это будет CMPSB - CoMPare a Set of Bytes - сравнить набор байтов.
Подписаться на Дзен-канал
Вступить в группу "Основы программирования" Подписаться на рассылки по программированию |
Первые шаги в программирование
Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься». У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение. Подробнее... |