Как стать программистом Как устроен компьютер. Что такое программа. Как написать свою программу. И многое другое узнаете вы из этой книги. Получить бесплатно! |
Команда CMPSW
Лучшие книги по Ассемблеру
Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится. Подробнее... |
Команда CMPSW в Ассемблере выполняет сравнение последовательности слов из участка памяти, адрес которого указан в регистре ESI, с другим участком, адрес которого указан в регистре DSI. Синтаксис:
CMPSW
Команда не имеет операндов. В зависимости от результата могут изменяться флаги OF, SF, ZF, AF, PF, CF.
ПРИМЕЧАНИЕ: Для процессора 8086 используются пары регистров ES:DI и DS:SI, как это показано в примере ниже.
Алгоритм выполнения команды CMPSW:
- DS:[SI] - ES:[DI]
- Установить флаги OF, SF, ZF, AF, PF, CF в соответствии с результатом
- Если DF = 0 то:
- SI = SI + 2
- DI = DI + 2
- Иначе:
- SI = SI - 2
- DI = DI - 2
Подробнее про флаг DF можете почитать здесь.
То есть с помощью команды REPE команда CMPSW выполняется до тех пор, пока флаг ZF равен 1. Однако команда вызывается не более, чем указано в СХ (а в этом регистре указана длина массива данных - количество слов для сравнения).
То есть выполняется последовательное сравнение двух массивов данных по каждому слову. И если какая-то пара слов в последовательности отличается, то флаг ZF будет сброшен в 0 и вызов команды CMPSW прекратится, даже если ещё не весь массив данных проверен. Таким образом выполняется проверка слов на равенство до первого несовпадения.
Это также позволяет определить номер слова в массиве, где обнаружено несовпадение (этот номер будет в счётчике СХ после завершения сравнения, отсчёт начинается с нуля).
Пример:
.model tiny .code ORG 100h ;Сбросить флаг направления CLD ;Загрузить источник (source) в DS:SI ;Загрузить цель (target) в ES:DI MOV AX, CS MOV DS, AX MOV ES, AX LEA SI, data1 LEA DI, data2 ;Установить счётчик для размера данных в словах MOV CX, size ;Сравнивать, пока равно REPE CMPSW 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: data1 DW 1234h, 5678h, 9012h, 3456h data2 DW 1234h, 5678h, 9012h, 3456h size = ($ - x1) / 4
Напоследок, как всегда, о происхождении аббревиатуры CMPSW.
CMP - это сокращение от английского слова COMPARE, которое можно перевести как “сравнить”. Ну а SW - это Set Words - набор слов.
А всё вместе это будет CMPSW - CoMPare a Set of Words - сравнить набор слов.
См. также описание команды CMPSB.
Подписаться на Дзен-канал
Вступить в группу "Основы программирования" Подписаться на рассылки по программированию |
Первые шаги в программирование
Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься». У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение. Подробнее... |