ХАНДЫФАР

Инструкция STOSB/STOSW


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


STOSB - Сохранить AL по адресу ES:DI.

STOSW - Сохранить AX по адресу ES:DI.


Сохраняет байт или слово из регистра al или ax в целевой операнд. Целевой операнд - это ячейка памяти, адрес которой считывается из регистра es:di. Сегмент es не может быть переопределен префиксом переопределения сегмента.


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


В качестве первого примера рассмотрим случай, когда у нас есть массив из чисел и нам необходимо заполнить этот массив определённым значением. Количество загружаемых данных указывается в регистре cx.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____array__dw__50 dup(?)
  6. ____arrlen equ_($-array) / 2_
  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, arrlen
  15. ________mov_____ax, 0CCCCh
  16. ________lea_____di, es:[bArray]
  17. ____rep stosw
  18. __
  19. ________mov_____ax, 4C00h
  20. ________int_____21h
  21. ____main endp
  22. code ends
  23. end main

В качестве второго примера рассмотрим случай, когда у нас есть массив из чисел и нам необходимо скопировать из него элементы в другой массив, при условии что, значение элемента больше или равно 5. Затем вернуть в регистре ax количество скопированных элементов. Количество загружаемых данных указывается в регистре cx.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____aArray__dw__6, 4, 7, 2, 5, 3, 1, 9, 8
  6. ____aArrlen equ_($-aArray) / 2
  7. ____bArray _dw__aArrlen dup(?)
  8. data ends
  9. code segment public
  10. ____assume ds:data, cs:code
  11. ____main proc
  12. ________mov_____ax, seg data
  13. ________mov_____ds, ax
  14. ________mov_____es, ax
  15. ________mov_____cx, aArrlen
  16. ________lea_____di, es:[bArray]
  17. ________lea_____si, ds:[aArray]
  18. ________xor_____bx, bx
  19. ____MainLoop:
  20. ________lodsw_
  21. ________cmp_____ax, 5
  22. ________jnge____Skip
  23. ________stosw
  24. ________inc_____bx
  25. ____Skip:
  26. ________loop____MainLoop
  27. ________mov_____ax, bx
  28. __
  29. ________mov_____ax, 4C00h
  30. ________int_____21h
  31. ____main endp
  32. code ends
  33. end main

Инструкция STOSB/STOSW


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


STOSB - Сохранить AL по адресу ES:DI.

STOSW - Сохранить AX по адресу ES:DI.


Сохраняет байт или слово из регистра al или ax в целевой операнд. Целевой операнд - это ячейка памяти, адрес которой считывается из регистра es:di. Сегмент es не может быть переопределен префиксом переопределения сегмента.


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


В качестве первого примера рассмотрим случай, когда у нас есть массив из чисел и нам необходимо заполнить этот массив определённым значением. Количество загружаемых данных указывается в регистре cx.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____array__dw__50 dup(?)
  6. ____arrlen equ_($-array) / 2_
  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, arrlen_______; Устанавливаем счётчик равным длине массива array
  15. ________mov_____ax, 0CCCCh_______; Копируем число которым хотим заполнить массив в ax
  16. ________lea_____di, es:[bArray]__; Загружаем адрес переменной array в регистр es:di
  17. ____rep stosw____________________; Копируем из ax в es:di увеличивая di на 2 пока CX≠0
  18. __
  19. ________mov_____ax, 4C00h________; Копируем значение функции завершения процесса в ah а значение в al
  20. ________int_____21h _____________; Вызываем прерывание DOS
  21. ____main endp ___________________; Конец процедуры main
  22. code ends _______________________; Конец сегмента кода
  23. end main ________________________; Конец файла. Точкой входа указывается процедура main

В качестве второго примера рассмотрим случай, когда у нас есть массив из чисел и нам необходимо скопировать из него элементы в другой массив, при условии что, значение элемента больше или равно 5. Затем вернуть в регистре ax количество скопированных элементов. Количество загружаемых данных указывается в регистре cx.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____aArray__dw__6, 4, 7, 2, 5, 3, 1, 9, 8
  6. ____aArrlen equ_($-aArray) / 2___; Длина массива aArray
  7. ____bArray _dw__aArrlen dup(?)___; Длина массива bArray равна длине массива aArray
  8. data ends
  9. code segment public _____________; Начало сегмента кода
  10. ____assume ds:data, cs:code
  11. ____main proc ___________________; Начало процедуры main
  12. ________mov_____ax, seg data_____; Получаем адрес сегмента памяти данных и сохраняем его в ax
  13. ________mov_____ds, ax___________; Передаём адрес сегмента памяти данных из регистра ax в ds
  14. ________mov_____es, ax___________; Передаём адрес сегмента памяти данных из регистра ax в es
  15. ________mov_____cx, aArrlen______; Устанавливаем счётчик равным длине массива aArray
  16. ________lea_____di, es:[bArray]__; Загружаем адрес переменной bArray в регистр es:di
  17. ________lea_____si, ds:[aArray]__; Загружаем адрес переменной aArray в регистр ds:si
  18. ________xor_____bx, bx___________; Обнуляем регистр bx
  19. ____MainLoop:
  20. ________lodsw____________________; Загружаем число по адресу si в регистр ax, увеличивая si на 2
  21. ________cmp_____ax, 5____________; Сравниваем значение в ax с числом 5
  22. ________jnge____Skip_____________; Если SF≠OF то, прыгаем на метку Skip
  23. ________stosw____________________; Сохраняем число в регистре ax в регистр di, увеличивая di на 2
  24. ________inc_____bx_______________; Увеличиваем регистр bx на 1
  25. ____Skip:
  26. ________loop____MainLoop_________; Выполняем цикл пока CX≠0
  27. ________mov_____ax, bx___________; Копируем bx в ax. AX := количество скопированных элементов
  28. __
  29. ________mov_____ax, 4C00h________; Копируем значение функции завершения процесса в ah а значение в al
  30. ________int_____21h _____________; Вызываем прерывание DOS
  31. ____main endp ___________________; Конец процедуры main
  32. code ends _______________________; Конец сегмента кода
  33. end main ________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda