ХАНДЫФАР

Инструкция LEA


Загрузить эффективный адрес


LEA reg16, mem - Сохранить эффективный адрес в reg16.


Вычисляет эффективный адрес второго операнда (исходного операнда) и сохраняет его в первом операнде (целевом операнде). Исходный операнд - это адрес памяти (часть смещения), указанный в одном из режимов адресации процессора; целевой операнд - регистр общего назначения.


В качестве примера рассмотрим случай, когда в сегменте данных создана переменная string со значением "Hello World$". Затем установим значение регистра si равным 6. После чего загрузим эффективный адрес переменной string в регистр ds:bx к которой прибавим значение регистра si, регистр si будет служить индексом. После чего указатель будет указывать на 6-й элемент в переменной string, то есть на "World$".


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Hello World$"
  6. data ends
  7. code segment public
  8. ____assume ds:data, cs:code
  9. ____main proc
  10. ________mov_____ax, seg data
  11. ________mov_____ds, ax
  12. ________mov_____si, 6
  13. ________lea_____bx, ds:[string+si]
  14. __
  15. ________mov_____ax, 4C00h
  16. ________int_____21h
  17. ____main endp
  18. code ends
  19. end main

С помощью инструкции lea можно выполнить сложение, но при условии что, регистры должны быть базовыми или индексными, например si, di, bx, bp. Результат можно сохранить в любом регистре общего назначения.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public
  5. ____assume cs:code
  6. ____main proc
  7. ________mov_____bx, 1
  8. ________lea_____bx, [bx+1]
  9. ________mov_____bx, 8
  10. ________mov_____di, 6
  11. ________lea_____ax, [bx+di]
  12. ________mov_____si, 4
  13. ________mov_____bp, 2
  14. ________lea_____di, [si+bp+3]
  15. ________mov_____bp, 3
  16. ________mov_____si, 5
  17. ________lea_____bx, [bp+si-1]
  18. __
  19. ________mov_____ax, 4C00h
  20. ________int_____21h
  21. ____main endp
  22. code ends
  23. end main

Инструкция LEA


Загрузить эффективный адрес


LEA reg16, mem - Сохранить эффективный адрес в reg16.


Вычисляет эффективный адрес второго операнда (исходного операнда) и сохраняет его в первом операнде (целевом операнде). Исходный операнд - это адрес памяти (часть смещения), указанный в одном из режимов адресации процессора; целевой операнд - регистр общего назначения.


В качестве примера рассмотрим случай, когда в сегменте данных создана переменная string со значением "Hello World$". Затем установим значение регистра si равным 6. После чего загрузим эффективный адрес переменной string в регистр ds:bx к которой прибавим значение регистра si, регистр si будет служить индексом. После чего указатель будет указывать на 6-й элемент в переменной string, то есть на "World$".


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Hello World$"
  6. data ends
  7. code segment public ________________; Начало сегмента кода
  8. ____assume ds:data, cs:code
  9. ____main proc ______________________; Начало процедуры main
  10. ________mov_____ax, seg data________; Получаем адрес сегмента памяти данных и сохраняем его в ax
  11. ________mov_____ds, ax______________; Передаём адрес сегмента памяти данных из регистра ax в ds
  12. ________mov_____si, 6_______________; Копируем значение 6 в регистр si; Указатель указывает на букву W
  13. ________lea_____bx, ds:[string+si]__; Загружаем адрес string в bx со смещением указанном в si
  14. __
  15. ________mov_____ax, 4C00h___________; Копируем значение функции завершения процесса в ah а значение в al
  16. ________int_____21h ________________; Вызываем прерывание DOS
  17. ____main endp ______________________; Конец процедуры main
  18. code ends __________________________; Конец сегмента кода
  19. end main ___________________________; Конец файла. Точкой входа указывается процедура main

С помощью инструкции lea можно выполнить сложение, но при условии что, регистры должны быть базовыми или индексными, например si, di, bx, bp. Результат можно сохранить в любом регистре общего назначения.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public ___________; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _________________; Начало процедуры main
  7. ________mov_____bx, 1__________; Копируем значение 1 в регистр bx
  8. ________lea_____bx, [bx+1]_____; Увеличиваем значение в bx на 1
  9. ________mov_____bx, 8__________; Копируем значение 8 в регистр bx
  10. ________mov_____di, 6__________; Копируем значение 8 в регистр di
  11. ________lea_____ax, [bx+di]____; Вычисляем 8 + 6
  12. ________mov_____si, 4__________; Копируем значение 4 в регистр si
  13. ________mov_____bp, 2__________; Копируем значение 2 в регистр bp
  14. ________lea_____di, [si+bp+3]__; Вычисляем 4 + 2 + 3
  15. ________mov_____bp, 3__________; Копируем значение 3 в регистр bp
  16. ________mov_____si, 5__________; Копируем значение 5 в регистр si
  17. ________lea_____bx, [bp+si-1]__; Вычисляем 3 + 5 - 1
  18. __
  19. ________mov_____ax, 4C00h______; Копируем значение функции завершения процесса в ah а значение в al
  20. ________int_____21h ___________; Вызываем прерывание DOS
  21. ____main endp _________________; Конец процедуры main
  22. code ends _____________________; Конец сегмента кода
  23. end main ______________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda