ХАНДЫФАР

Инструкция SCASB/SCASW


Сравнить память с регистром AL или AX


SCASB - Сравнить AL с байтом в ES:DI, затем установить флаги состояния.

SCASW - Сравнить AX со словом в ES:DI, затем установить флаги состояния.


Эта инструкция сравнивает байт или слова, определённые с помощью операнда памяти, со значением в al или ax. Затем она устанавливает флаги состояния в EFLAGS, записывающие результаты. Адрес операнда памяти считывается из регистра es:di. Обратите внимание, что es не может быть переопределен префиксом переопределения сегмента.


После сравнения регистр di увеличивается или уменьшается автоматически в соответствии с установкой флага DF в регистре FLAGS. Если флаг DF равен 0, регистр di увеличивается; если флаг DF равен 1, регистр di уменьшается. Регистр увеличивается или уменьшается на 1 для операций с байтами и на 2 для операций со словами.


В качестве примера рассмотрим случай, когда у нас есть байтовая строка "Hello World!" и нам необходимо проверить нахождение символа 'W'. Если символ 'W' не найден, то вернуть в регистре ax значение -1. Если символ 'W' найден, то вернуть индекс этого символа в строке в регистре ax. Длина байтовой строки указывается в регистре cx.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db__"Hello World!"
  6. ____strlen equ_($-string)
  7. data ends
  8. code segment public
  9. ____assume ds:data, cs:code
  10. ____main proc
  11. ________mov_____ax, seg data
  12. ________mov_____ds, ax
  13. ________mov_____es, ax
  14. ________mov_____cx, strlen
  15. ________lea_____di, es:[string]
  16. ________mov_____al, 'W'
  17. __repnz scasb
  18. ________jnz_____NotFound
  19. ________dec_____di
  20. ________mov_____ax, di
  21. ________jmp_____Done
  22. ____NotFound:
  23. ________mov_____ax, 0FFFFh
  24. ____Done:
  25. ________mov_____ax, 4C00h
  26. ________int_____21h
  27. ____main endp
  28. code ends
  29. end main

Инструкция SCASB/SCASW


Сравнить память с регистром AL или AX


__________________SCASB - Сравнить AL с байтом в ES:DI, затем установить флаги состояния.

__________________SCASW - Сравнить AX со словом в ES:DI, затем установить флаги состояния.


Эта инструкция сравнивает байт или слова, определённые с помощью операнда памяти, со значением в al или ax. Затем она устанавливает флаги состояния в EFLAGS, записывающие результаты. Адрес операнда памяти считывается из регистра es:di. Обратите внимание, что es не может быть переопределен префиксом переопределения сегмента.


После сравнения регистр di увеличивается или уменьшается автоматически в соответствии с установкой флага DF в регистре FLAGS. Если флаг DF равен 0, регистр di увеличивается; если флаг DF равен 1, регистр di уменьшается. Регистр увеличивается или уменьшается на 1 для операций с байтами и на 2 для операций со словами.


В качестве примера рассмотрим случай, когда у нас есть байтовая строка "Hello World!" и нам необходимо проверить нахождение символа 'W'. Если символ 'W' не найден, то вернуть в регистре ax значение -1. Если символ 'W' найден, то вернуть индекс этого символа в строке в регистре ax. Длина байтовой строки указывается в регистре cx.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db__"Hello World!"
  6. ____strlen equ_($-string)
  7. data ends
  8. code segment public _____________; Начало сегмента кода
  9. ____assume ds:data, cs:code
  10. ____main proc ___________________; Начало процедуры main
  11. ________mov_____ax, seg data_____; Получаем адрес сегмента памяти данных и сохраняем его в ax
  12. ________mov_____ds, ax___________; Передаём адрес сегмента памяти данных из регистра ax в ds
  13. ________mov_____es, ax___________; Передаём адрес сегмента памяти данных из регистра ax в es
  14. ________mov_____cx, strlen_______; Устанавливаем счётчик равным длине строки
  15. ________lea_____di, es:[string]__; Загружаем адрес переменной string в регистр es:di
  16. ________mov_____al, 'W'__________; Копируем значение 'W' в регистр al
  17. __repnz scasb____________________; Выполняем поиск символа 'W' в es:di пока CX≠0 или флаг ZF≠0
  18. ________jnz_____NotFound_________; Если ZF=0 то, прыгаем на метку NotFound
  19. ________dec_____di_______________; Уменьшаем значение di на 1 что бы он указывал на найденный элемент
  20. ________mov_____ax, di___________; Копируем значение di в регистр ax
  21. ________jmp_____Done_____________; Выполняем безусловный переход на метку Done
  22. ____NotFound:
  23. ________mov_____ax, 0FFFFh_______; Копируем значение -1 в регистр ax
  24. ____Done:
  25. ________mov_____ax, 4C00h________; Копируем значение функции завершения процесса в ah а значение в al
  26. ________int_____21h _____________; Вызываем прерывание DOS
  27. ____main endp ___________________; Конец процедуры main
  28. code ends _______________________; Конец сегмента кода
  29. end main ________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda