Разместите нашу кнопку!

Новые статьи:

Programming articles

Создание сайтов на шаблонах

Множество вариантов работы с графикой на канве

Шифруем файл с помощью другого файла

Перехват API функций - Основы

Как сделать действительно хороший сайт

Создание почтового клиента в Delphi 7

Применение паскаля для решения геометрических задач

Управление windows с помощью Delphi

Создание wap сайта

Операционная система unix, термины и понятия

SQL враг или друг

Возникновение и первая редакция ОС UNIX

Оптимизация проекта в Delphi

Ресурсы, зачем нужны ресурсы

Термины программистов 20 века

Советы по созданию собственного сайта с нуля

Шифруем файл с помощью пароля

Фракталы - геометрия природы

Crypt - Delphi программа для шифрования

Рассылка, зачем она нужна и как ее организовать?

Учебник по C++ для начинающих программистов

Уроки для изучения ассемблера

Загадочный тип PCHAR

Средства по созданию сайтов

Операторы преобразования классов is и as

Borland Developer studio 2006. Всё в одном

Создание базы данных в Delphi, без сторонних БД


Software engineering articles



Assembler&Win32. Курс молодого бойца. Урок 12.

Обработка блоков данных

     Загрузка и выгрузка данных.
     Команды lodsb, lodsw, lodsd нужны, для того чтобы загрузить байт (слово, двойное слово) из памяти, на которую указывает регистр ESI в регистр al,ax или eax. После присваивания значения регистру значение регистра ESI увеличивается на 1,2 или 4. Вот эквиваленты этих команд

     Lodsb    Mov al, byte ptr [esi]
                   Inc esi /dec esi
     Lodsw    Mov ax, word ptr [esi]
                   Add esi, 2h /sub esi, 2h
     Lodsd    Mov eax, dword ptr [esi]
                   Add esi, 4h / sub esi, 4h

     Следовательно, эти команды облегчают нам обработку данных, сразу увеличивая значение регистра esi для следующей порции данных. Регистр может также уменьшаться в зависимости от флага направления DF. Если он выставлен то регистр будет уменьшаться, а если он сброшен, то регистр esi будет увеличиваться.
     Абсолютно, противоположное делают команды stosb, stows и stosd. Они загружают регистр al, ax, eax в память, на которую указывает регистр edi. Изменение регистра edi зависит от того же самого флага направления DF. 

     movsb              Mov al, byte ptr [esi]
                             Mov byte ptr [edi], al
                             Inc edi /dec edi
                             Inc esi /dec esi
     stosw               Mov ax, word ptr [esi]
                             Mov word ptr [edi], ax
                             Add edi, 2h /sub edi, 2h
                             Add esi, 2h /sub esi, 2h
     stosd                Mov eax, dword ptr [esi]
                             Mov dword ptr [edi], eax
                             Add edi, 4h / sub edi, 4h
                             Add esi, 4h / sub esi, 4h


     Сравнение данных.
    Команды scasb, scasw и scasd сравнивают содержимое регистра al, ax, eax с содержимым памяти на которую указывает регистр edi. Разумеется с увеличением регистра edi. Более продвинутые команды cmpsb, cmpsw, cmpsd сравнивают значения памяти, на которые указывают регистры esi и edi соответственно. С соответствующим изменением регистра флагов.

     Префикс rep.
    Все вышеописанные команды предназначены удобно использовать в циклах, т.е. при повторяющихся операциях. Префикс rep нужен для повторения команды обработки блоков количество раз, которое указано в регистре ecx.
    Пример:

Mov ecx, 045h
Mov edi, 0422310h
Mov al, 088h
Rep stosb

    После этого память в диапазоне 0422310h-0422355h будет заполнена значениями 88h. Для команд cmps* и scas* префикс повторяет команду только до тех пор, пока флаг ZF установлен. Префиксы repe, repz это тоже самое. Если после очередного выполнения команды флаг ZF сбросился, то повторы прекращаются.
    Не менее полезен префикс repne, он будет повторять команду пока флаг ZF сброшен. Если после очередного выполнения команды флаг ZF установился, то повторы прекращаются. То же самое делает префикс repnz.

Str1 db 'qwerty'
Str2 db '111111'
……
Mov ecx, 06h
Mov esi, offset str1
Mov edi, offset str2
Rep movsb

    После всех этих манипуляций данные будут такими:

Str1 db 'qwerty'
Str2 db 'qwerty'


    Ещё пример:

Str1 db 'qwerty'
Str2 db 'qwe111'
……
Mov ecx, 06h
Mov esi, offset str1
Mov edi, offset str2
Rep cmpsb

    Это повторение закончится на 4 шаге при сравнении 'r' и '1' т.е. при сравнении 'r' и '1' флаг ZF сбросится и повторение прекратится. Тем самым можно сравнивать две строки а после Rep cmpsb проверять равен ли регистр ECX нулю, если он равен нулю, то строки равны.

Str1 db 'qwerty'
Str2 db '1111t1'
……
Mov ecx, 06h
Mov esi, offset str1
Mov edi, offset str2
Repne cmpsb


    Это повторение прекратится на 5 шаге при сравнении 't' и 't' т.е. при их сравнении флаг ZF установится и повторение прекратится.

     Вот и закончился этот урок. На этом уроке мы узнали команды для обработки блоков данных.