lea asm что делает

Команда LEA

Команда LEA в Ассемблере вычисляет эффективный адрес ИСТОЧНИКА и помещает его в ПРИЁМНИК. Синтаксис:

LEA ПРИЁМНИК, ИСТОЧНИК

После выполнения этой команды флаги не изменяются.

Что такое эффективный адрес

Прежде чем продолжить рассказ об инструкции LEA, напомню, что такое эффективный адрес.

Так вот, слово “эффективный” можно перевести на русский как “действенный”, “действующий”, “настоящий”. Что касается программистской терминологии, то в некоторых источниках вместо “эффективный адрес” встречается словосочетание “текущий адрес” или даже “виртуальный адрес”.

Слишком глубоко в адресацию погружаться не будем. Если вы совершенно далеки от этого, то можете изучить мою контрольную работу по этой теме университетских времён (эх, давно это было…)

БАЗА + СМЕЩЕНИЕ + ИНДЕКС

Любая из частей эффективного адреса может отсутствовать (например, необязательно указывать СМЕЩЕНИЕ или ИНДЕКС), но обязательно должна присутствовать хотя бы одна часть (например, только БАЗА).

Вычисление эффективного адреса

Ну а теперь чуть подробнее о самой команде LEA. Как уже было сказано, она выполняет вычисление адреса в Ассемблере. В итоге в ПРИЁМНИК записывается адрес памяти (точнее, только смещение).

С помощью команды LEA можно вычислить адрес переменной, которая описана сложным способом адресации (например, по базе с индексированием, что часто используется при работе с массивами и строками).

Команда LEA позволяет определить текущее смещение косвенного операнда любого типа. Так как при косвенной адресации может использоваться один или два регистра общего назначения, то приходится каким-то образом вычислять текущее смещение операнда во время выполнения программы.

Команду LEA также удобно применять для определения адреса параметра, находящегося в стеке. Например, если в процедуре определяется локальный массив, то для работы с ним часто необходимо загрузить его смещение в индексный регистр (что как раз таки можно сделать командой LEA).

Оператор OFFSET позволяет определить смещение только при компиляции, и в отличие от него команда LEA может сделать это во время выполнения программы. Хотя в остальных случаях обычно вместо LEA используют MOV и OFFSET, то есть

LEA ПРИЁМНИК, ИСТОЧНИК

это то же самое, что и

MOV ПРИЁМНИК, offset ИСТОЧНИК

При этом следует помнить об указанных выше ограничениях применения оператора OFFSET.

Команда LEA в арифметических операциях

Инструкция LEA часто используется для арифметических операций, таких как умножение и сложение. Преимущество такого способа в том, что команда LEA занимает меньше места, чем команды арифметических операций. Кроме того, в отличие от последних, она не изменяет флаги. Примеры:

Обратите внимание на то, что адресацию со смещением, где используется знак умножения (*), не поддерживает эмулятор emu8086 (возможно, некоторые другие эмуляторы тоже). Поэтому в данном эмуляторе первый пример не будет работать правильно. Второй же пример (сложение), будет работать.

Напоследок, как всегда, о происхождении аббревиатуры LEA.

Источник

Система команд x86

Влияние команды на флаги и форматы команды:

Вычислить эффективный адрес операнда m и поместить результат в r16

Вычислить эффективный адрес операнда m и поместить результат в r32

Описание:

Команда LEA вычисляет эффективный адрес (смещение) операнда-источника команды (который должен быть операндом в памяти) и сохраняет его в регистре — операнде-назначении команды. Атрибут размера операнда команды определяется выбранным регистром (16- или 32-битным). Атрибут размера адреса определяется атрибутом текущего кодового сегмента. Атрибуты размера адреса и размера операнда воздействуют на операцию, выполняемую командой LEA так, как это показано в таблице 6.65.

Таблица 6.65. Воздействие атрибутов размера операнда и размера адреса на действие команды LEA

Размер операнда

Размер адреса

Выполняемая операция

Вычисляется 16-битный эффективный адрес и сохраняется в 16-битном регистре-назначении

Вычисляется 32-битный эффективный адрес его младшие 16 бит сохраняются в 16-битном регистре-назначении

Вычисляется 16-битный эффективный адрес, затем знакорасширяется и сохраняется в 32-битном регистре-назначении

Вычисляется 32-битный эффективный адрес и сохраняется в 32-битном регистре-назначении

Операция:

IF OperandSize = 16 AND AddressSize = 16

DEST = EffectiveAddress(SRC); (* 16- битный адрес *)

ELSE IF OperandSize = 16 AND AddressSize = 32 THEN

temp = EffectiveAddress(SRC); (* 32- битный адрес *)

DEST = temp[0..15]; (* 16- битный адрес *)

ELSE IF OperandSize = 32 AND AddressSize = 16 THEN

temp = EffectiveAddress(SRC); (* 16- битный адрес *)

DEST = ZeroExtend(temp); (* 32- битный адрес *)

ELSE IF OperandSize = 32 AND AddressSize = 32 THEN

DEST = EffectiveAddress(SRC); (* 32- битный адрес *)

Особые ситуации защищенного режима:

#UD, если второй операнд не является операндом в памяти.

Особые ситуации режима реальной адресации:

#UD, если второй операнд не является операндом в памяти.

Особые ситуации режима V86:

#UD, если второй операнд не является операндом в памяти.

Замечание:

Различные ассемблеры могут по разному интерпретировать команду в зависимости от атрибута размера и символической ссылки второго операнда.

Источник

Информация по команде LEA

Привет. Недавно наткнулся на такую хорошую команду. Часть информации по ней почерпнул отсюда (lea VS offset)

Но возник вопрос: зачем в данной команде квадратные скобки, то бишь разыменование адреса?

Команда интерпритируется так:
1) значение eax складывается со значением ebx
2) результат суммы разыменовывается (получается, что вычисленная ранее сумма является адресом)
3) в ecx заносится значение? ячейки памяти по адресу eax + ebx, а не их сумма

Можете это объяснить?

lea VS offset
В чем отличие lea bx,str от mov bx,offset str

lea asm что делает. Смотреть фото lea asm что делает. Смотреть картинку lea asm что делает. Картинка про lea asm что делает. Фото lea asm что делаетРабота с командой Lea
lea ax, ;такое вообще возможно?

lea asm что делает. Смотреть фото lea asm что делает. Смотреть картинку lea asm что делает. Картинка про lea asm что делает. Фото lea asm что делаетРазница Lds, les и lea
Объясните пожалуйста простым языком разницу между данными командами. Совсем не могу уловить их суть.

Запиши и сассемблируй, увидишь все сам.

Добавлено через 3 минуты
Или ты продолжаешь изучать ассемблер без написания кода?

Решение

Р.Марек. Команда LEA — не только вычисление адреса

Имя этой команды — это сокращение от «Load Effective Address».
Она вычисляет эффективный адрес второго операнда и сохраняет его в первом операнде, который может быть только регистром. Синтаксис этой команды требует, чтобы второй операнд был заключен в квадратные скобки, но фактически она не адресует память.

LEA полезна в тех случаях, когда мы не собираемся обращаться к памяти, а адрес нужен нам для другой цели:

Автор, ты для себя что-то новое прочитал? Ну, кроме «потому что такой синтаксис у команды»? Я тебе поражаюсь. Что ты вообще читаешь? Как ты ищешь информацию? Что за поколение инвалидов.

Источник

MS-DOS и TASM 2.0. Часть 18. Ещё раз об указателе.

lea asm что делает. Смотреть фото lea asm что делает. Смотреть картинку lea asm что делает. Картинка про lea asm что делает. Фото lea asm что делает

Указатель в программировании.

В статье MS-DOS и TASM 2.0. Часть 9. Указатель просто и понятно было рассмотрено, что такое указатель в программировании (pointer). Сейчас мы перейдём к вопросу практического использования указателя. Ещё раз напомним, что указатель в ассемблере — более широкое понятие, чем в Си и С++, где указатель определён как переменная, значением которой является адрес ячейки памяти. Указатель — не только переменная. Указатель в программировании на ассемблере — адрес определённой ячейки памяти. Жёсткой привязки к понятию «переменной» нет.

Преимущество указателя — простая возможность обращаться к определённой части исполняемого кода либо данных, избегая их дублирования. Например, один раз написав код функции, мы можем обращаться к нему неоднократно, осуществляя вызов указанной функции. Кстати, вызов функции — это переход исполнения кода по указателю, который для удобства «обозвали» понятным для человека названием (ну, например, «MyBestFunc»).

Указатель в программировании используется также для получения и передачи входных-выходных значений функций. С этим применением мы встретимся при Windows программировании.

Указатель — адрес ячейки памяти.

Указатель в программировании на ассемблере — адрес ячейки памяти, содержащей определённые последовательности цифр — блоки кода и данных. Блоки кода и данных называются значениями указателя, например: строка, массив, структура, функция, переменная, константа.

lea asm что делает. Смотреть фото lea asm что делает. Смотреть картинку lea asm что делает. Картинка про lea asm что делает. Фото lea asm что делает Указатель — адрес ячейки памяти, содержащей блоки кода и данных.

Указателю можно присвоить условное обозначение (const_a, const_b, my_mass_1, MY_STRUCT_1, BitMask, my_prnt_func), определив тип данных или кода, на которые он указывает (db, dd, STRUC, RECORD, proc). Практически мы уже проделывали эти операции, создавая исходники наших простейших программ:

Работа с указателями.

Основная проблема начинающего программиста — это различие между указателем и значением, расположенным по адресу памяти, на которую указывает указатель.

Получение значения, на которое указывает указатель в Си и C++ называется «разыменование указателя». Это понятие можно употреблять и в ассемблере.

Получать адрес ячейки памяти (значение указателя) при программировании на ассемблере можно двумя способами, назовём их «статический» и «динамический». Реализовано это с помощью инструкций OFFSET и LEA.

При «статическом» способе указатель будет вычислен во время компиляции. Он не меняется и не вычисляется в процессе выполнения программы. В очень упрощённой форме: его значение равно смещению в байтах от начала программы, спроецированной в память, плюс адрес в оперативной памяти — «точка входа», адрес загрузки программы в память, который задаётся во время компиляции и записывается в заголовке (в начале) файла. Таким образом полученное значение фактически является константой.

OFFSET (Offset — смещение).

Получить «статическим способом» указатель в программировании на ассемблере можно с помощью оператора OFFSET (оператор — команда компилятору — подпрограмме, которая собирает исполняемый файл из исходного кода, написанного языком программирование). Offset возвращает значение метки в памяти. Меткой является любое именованное значение кода и данных. Например, имя переменной, константы или массива (именованное обозначение блока данных). Имя функции — фактически также является меткой (именованным обозначением блока кода).

LEA (Load Effective Address — загрузить эффективный адрес).

При «динамическом» способе адрес вычисляется в процессе исполнения программы. Для этого используется команда LEA (Load Effective Address).

lea операнд1, операнд2

Операнд 1 — это регистр-приёмник (ax, bx, dx и т.д.), куда будет перемещён эффективный адрес (указатель) ячейки памяти, в которой расположен операнд2.

Для начала, необходимо усвоить, что результат оба способа дают одинаковый, но иногда компилятор не имеет возможности определить указатель во время сборки программы. Например, при выделении динамической памяти (столкнёмся в 32 битном Windows программировании), не известно, по какому адресу она будет выделена. Если по этому адресу у нас будет находиться структура, то определить указатель на поля структуры возможно с использованием команды LEA.

Источник

Учебники. Программирование для начинающих.

Все для начинающего программиста

Меню сайта

Информация

Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.

Приложение. Система команд процессоров Intel

LEA Загрузка исполнительного адреса

но у первой команды больше возможностей описания адреса интересующей нас ячейки. Команда не воздействует на флаги процессора.

; В полях данных:
nmb db ‘0123456789’
;В программном сегменте:
mov SI,7 ;Смещение символа ‘7’
lea DX,nmb[SI] ;ВХ=адрес символа ‘7’

; В полях данных:
nmb db ‘0123456789’
;В программном сегменте:
mov BX, off set msg
mov SI, 9 ;Смещение символа ‘9’
lea SI, [BX] [SI] ;31=адрес символа ‘9’

Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *