ХАНДЫФАР

Инструкция LODSB/LODSW


Загрузка из памяти в регистр AL или AX


LODSB - Загрузить байт по адресу DS:SI в регистр AL.

LODSW - Загрузить слово по адресу DS:SI в регистр AX.


Загружает байт или слово из исходного операнда в регистр al или ax. Исходный операнд - это ячейка памяти, адрес которой считывается из регистров ds:si. Сегмент ds может быть переопределен префиксом переопределения сегмента.


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


В качестве примера рассмотрим случай, когда у нас есть байтовый массив из чисел и нам необходимо выйти из цикла если значение загруженное в регистр al будет равно 510 и вернуть в регистре ax позицию найденного элемента. Если элемент в массиве не найден то, вернуть в регистре ax значение -1. Количество загружаемых данных указывается в регистре cx.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____array__db__1, 2, 3, 4, 5, 6, 8
  6. ____arrlen equ_($-array)
  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_____cx, arrlen
  14. ________lea_____si, ds:[array]
  15. ____FindAndQuitLoop:
  16. ________lodsb
  17. ________cmp_____al, 5
  18. ________loopnz__FindAndQuitLoop
  19. ________sub_____cx, ax
  20. ________neg_____cx
  21. ________inc_____cx
  22. ________cmp_____cx, ax
  23. ________ja______NoElementInArray
  24. ________xchg____cx, ax
  25. ________jmp_____Done
  26. ____NoElementInArray:
  27. ________mov_____ax, 0FFFFh
  28. ____Done:
  29. ________mov_____ax, 4C00h
  30. ________int_____21h
  31. ____main endp
  32. code ends
  33. end main

Инструкция LODSB/LODSW


Загрузка из памяти в регистр AL или AX


___________________________LODSB - Загрузить байт по адресу DS:SI в регистр AL.

___________________________LODSW - Загрузить слово по адресу DS:SI в регистр AX.


Загружает байт или слово из исходного операнда в регистр al или ax. Исходный операнд - это ячейка памяти, адрес которой считывается из регистров ds:si. Сегмент ds может быть переопределен префиксом переопределения сегмента.


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


В качестве примера рассмотрим случай, когда у нас есть байтовый массив из чисел и нам необходимо выйти из цикла если значение загруженное в регистр al будет равно 510 и вернуть в регистре ax позицию найденного элемента. Если элемент в массиве не найден, то вернуть в регистре ax значение -1. Количество загружаемых данных указывается в регистре cx.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____array__db__1, 2, 3, 4, 5, 6, 8
  6. ____arrlen equ_($-array)__________; Длина массива
  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_____cx, arrlen____——__; Устанавливаем счётчик равным длине массива array
  14. ________lea_____si, ds:[array]_——_; Загружаем адрес переменной array в регистр ds:si
  15. ____FindAndQuitLoop:
  16. ________lodsb_____________________; Загружаем байт по адресу ds:si в регистр al
  17. ________cmp_____al, 5_____________; Сравниваем загруженное значение в регистре al с числом 5
  18. ________loopnz__FindAndQuitLoop___; Выполняем цикл пока CX≠0 или ZF≠1
  19. ________sub_____cx, ax
  20. ________neg_____cx
  21. ________inc_____cx________________; Увеличиваем значение в cx на 1
  22. ________cmp_____cx, ax
  23. ________ja______NoElementInArray__; Если число в cx выше чем в ax, то прыгаем на NoElementInArray
  24. ________xchg____cx, ax____________; Меняем местами значения в cx и ax
  25. ________jmp_____Done______________; Выполняем безусловный переход на метку Done
  26. ____NoElementInArray:
  27. ________mov_____ax, 0FFFFh________; Копируем значение -1 в регистр ax
  28. ____Done:
  29. ________mov_____ax, 4C00h_________; Копируем значение функции завершения процесса в ah а значение в al
  30. ________int_____21h ______________; Вызываем прерывание DOS
  31. ____main endp ____________________; Конец процедуры main
  32. code ends ________________________; Конец сегмента кода
  33. end main _________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda