ХАНДЫФАР

Инструкция LES


____LES reg16, mem16:16 - Загрузить ES:reg16 с дальним указателем из памяти.


Загружает дальний указатель (селектор сегмента и смещение) из второго операнда (операнд источника) в регистр сегмента и первый операнд (операнд назначения). Код операции инструкции и целевой операнд определяют пару сегментный регистр/регистр общего назначения. 16-разрядный селектор сегментов из исходного операнда загружается в регистр сегментов, указанный с помощью кода операции (DS, SS, ES).


В следующем примере мы создадим массив слов в сегменте данных data. Затем мы создадим дополнительный сегмент extr и создадим в нём буфер dstnum и указатель dstptr который будет указывать на буфер dstnum. Затем мы в цикле будем выполнять копирование массива слов из сегмента данных data в массив dstnum который находится в дополнительном сегменте extr.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____srcnum dw _1, 2, 3, 4, 5, 6, 7
  6. ____srclen equ ($-srcnum) / 2
  7. ____srcptr dd _srcnum
  8. data ends
  9. extr segment public
  10. ____dstnum dw srclen dup(0FFFFh)
  11. ____dstptr dd dstnum
  12. extr ends
  13. code segment public
  14. ____assume ds:data, es:extr, cs:code
  15. ____main proc
  16. ________mov_____ax, seg data
  17. ________mov_____ds, ax
  18. ________mov_____ax, seg extr
  19. ________mov_____es, ax
  20. ________mov_____cx, srclen
  21. ________les_____di, es:[dstptr]
  22. ________lds_____si, ds:[srcptr]
  23. ____CopyLoop:
  24. ________mov_____ax, ds:[si]
  25. ________mov_____es:[di], ax
  26. ________add_____si, 2
  27. ________add_____di, 2
  28. ________loop____CopyLoop
  29. __
  30. ________mov_____ax, 4C00h
  31. ________int_____21h
  32. ____main endp
  33. code ends
  34. end main

Инструкция LES


____LES reg16, mem16:16 - Загрузить ES:reg16 с дальним указателем из памяти.


Загружает дальний указатель (селектор сегмента и смещение) из второго операнда (операнд источника) в регистр сегмента и первый операнд (операнд назначения). Код операции инструкции и целевой операнд определяют пару сегментный регистр/регистр общего назначения. 16-разрядный селектор сегментов из исходного операнда загружается в регистр сегментов, указанный с помощью кода операции (DS, SS, ES).


В следующем примере мы создадим массив слов в сегменте данных data. Затем мы создадим дополнительный сегмент extr и создадим в нём буфер dstnum и указатель dstptr который будет указывать на буфер dstnum. Затем мы в цикле будем выполнять копирование массива слов из сегмента данных data в массив dstnum который находится в дополнительном сегменте extr.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____srcnum dw _1, 2, 3, 4, 5, 6, 7
  6. ____srclen equ ($-srcnum) / 2
  7. ____srcptr dd _srcnum
  8. data ends
  9. extr segment public
  10. ____dstnum dw srclen dup(0FFFFh)
  11. ____dstptr dd dstnum
  12. extr ends
  13. code segment public _____________; Начало сегмента кода
  14. ____assume ds:data, es:extr, cs:code
  15. ____main proc ___________________; Начало процедуры main
  16. ________mov_____ax, seg data_____; Получаем адрес сегмента памяти данных и сохраняем его в ax
  17. ________mov_____ds, ax___________; Передаём адрес сегмента памяти данных из регистра ax в ds
  18. ________mov_____ax, seg extr_____; Получаем адрес дополнительного сегмента данных и сохраняем его в ax
  19. ________mov_____es, ax___________; Передаём адрес дополнительного сегмента данных из регистра ax в es
  20. ________mov_____cx, srclen_______; Копируем длину массива srcnum в регистр cx
  21. ________les_____di, es:[dstptr]__; Загружаем дальний указатель dstptr в регистр es:di
  22. ________lds_____si, ds:[srcptr]__; Загружаем дальний указатель srcptr в регистр ds:si
  23. ____CopyLoop:
  24. ________mov_____ax, ds:[si]______; Копируем элемент из сегмента data ds:si в регистр ax
  25. ________mov_____es:[di], ax______; Копируем значение регистра ax в сегмент extr es:di
  26. ________add_____si, 2____________; Увеличиваем индекс di на 2
  27. ________add_____di, 2____________; Увеличиваем индекс si на 2
  28. ________loop____CopyLoop_________; Выполняем цикл пока CX≠0
  29. __
  30. ________mov_____ax, 4C00h________; Копируем значение функции завершения процесса в ah а значение в al
  31. ________int_____21h _____________; Вызываем прерывание DOS
  32. ____main endp ___________________; Конец процедуры main
  33. code ends _______________________; Конец сегмента кода
  34. end main ________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda