Главная страница
Предыдущая страница (работа с флагами)

На этой странице мы рассмотрим строковые команды. Вообще, без них можно обойтись, используя циклы и условные переходы. Но их использование, во-первых, позволяет сэкономить регистры (иногда), во-вторых, увеличивает читабельность программы (программа становится понятнее). Иногда даже можно добиться выигрыша в скорости

Строковые операции


1) movsb|movsw|movsd – копирует байт|слово|двойное_слово из памяти по адресу esi в память по адресу edi. После выполнения команды регистры esi и edi увеличиваются на 1|2|4, когда флаг DF=0, и уменьшаются, когда DF=1. Команда movs с префиксом rep выполняет копирование строки байтов|слов|двойных_слов длиной ecx

2) cmpsb|cmpsw|cmpsd – сравнивает один байт | слово | двойное_слово из памяти по адресу esi с байтом | словом | двойным_словом по адресу edi и устанавливает флаги аналогично команде cmp. При этом esi и edi продвигаются. Команда cmpsb|mpsw|cmpsd с префиксами repne|repnz или repe|repz выполняет сравнение строки длиной в ecx байтов | слов | двойных_слов. В первом случае сравнение продолжается до первого совпадения в строках, во втором – до первого несовпадения

3) scasb|scasw|scasd – сравнивает al|ax|eax с байтом | словом | двойным_словом из памяти по адресу edi и устанавливает флаги аналогично команде cmp. При этом edi продвигается

4) lodsb|lodsw|lodsd – копирует байт|слово|двойное_слово из памяти по адресу esi в al|ax|eax. При этом esi продвигается. Команда lodsb|lodsw|lodsd с префиксом rep выполнит копирование строки длиной в ecx и в аккумуляторе (регистр al|ax|eax) окажется последний элемент строки. На самом деле lods используют без префиксов, часто внутри цикла в паре с командой stos

5) stosb|stosw|stosd – копирует al|ax|eax в память по адресу edi. При этом edi продвигается

6) insb|insw|insd – чтение строки байт|слов|двойных_слов из порта ввода-вывода, номер которого указан в dx, в память по адресу edi. При этом edi продвигается. Её можно заменить с помощью использования команды in, и организации циклов

7) outsb|outsw|outsd – запись в порт ввода-вывода, номер которого в dx, байт | слово | двойное_слово из памяти по адресу esi. Начиная с процессоров pentium проверяется готовность порта принять новые данные в ходе выполнения команды c rep. Поэтому данные не теряются. При этом esi продвигается. Команду можно заменить с помощью использования команды out, и организации циклов

Перед строковыми командами можно ставить префикс rep. Тогда команда будет повторяться столько раз, сколько указано в ecx (может быть ноль раз). Если указать префикс repe|repz – будет то же самое (ecx раз повторится), но при ZF=0 повторения будут прекращены. Но проверка ZF происходит после выполнения команды, так что, например, если ZF=0, и мы пишем repe movsb и при этом ecx<>0, то movsb выполнится один раз. Команды repne|repnz перестанут повторяться, если ZF=1. Префикс rep обычно используется с movs, stos, lods, ins, outs, а команды repe|repz|repne|repnz с cmps и scas. Поведение префиксов в других случаях не определено


Следующая страница (команды сдвига)