Вопрос № 83304: добрый день. подскажите чем отличается запись:
lea dx, text
от записи:
mov dx, offset text
точнее что меняется если я использую lea вместо offcet и наоборот.
text это строка ascii символов....
Вопрос № 83.304
добрый день. подскажите чем отличается запись:
lea dx, text
от записи:
mov dx, offset text
точнее что меняется если я использую lea вместо offcet и наоборот.
text это строка ascii символов.
Отправлен: 19.04.2007, 16:53
Вопрос задал: Biggle (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Dr.Alex
Здравствуйте, Biggle!
Ничего не меняется. И той и другой командой ты в регистр dx загружаешь смещение на блок данных. Более того, некоторые ассемблеры транслируют первую запись во вторую.
Просто в первом варианте меньше пальцами набивать. :)
Ответ отправил: Dr.Alex (статус: 10-ый класс)
Ответ отправлен: 19.04.2007, 17:18
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Biggle!
Команда mov dx, offset text
запишет в dx непосредственный операнд, авляющийся адресом строки text
А команда lea dx, text
запишет "эффективный адрес" аргумента в dx, в данном случае это будет адрес строки text.
Т.о., в данном случае, результат один и тот же, хотя операции производятся разные
Чтобы уяснить, почему так получается, надо вникнуть в смысл "эффективного адреса".
Под которым понимается вычисленный адрес некоторого выражения.
При этом обращения к памяти не происходит.
Это можно, например, использовать для быстрого вычисления адреса чего-либо:
lea dx, text[bx+si+1]
Или, для 32-битных регистров, можно быстро умножить,например, на 5
lea EAX, [eax+eax*4]
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 19.04.2007, 17:20
Отвечает: Пашка
Здравствуйте, Biggle!
Суть одна у них. Пример.
char cW = 'W';
void main(){
_asm{
lea eax,cW
mov eax,offset cW
}
}
Как видно дело в размере команд. Но исходя из того что запись MOV EAX,ICEP.00405030 не даёт нам понять 405030 это число или это смещение. А вот при использовании lea мы прекрасно понимае что к чему. Хотя не факт что lea может работать только со смещениями:
lea eax,DWORD PTR DS:[1] ; eax == 1
Какаю команду использовать решать вам. Некоторые компиляторы даже если вы явно используете lea всё равно вставляют mov. Плюс исходный код будет выглядить лакончино сами посмотрите:
lea ax,L1
mov ex, offset L1 ;бяка
Да и ещё [] - взять что-то по адресу находящимся в этих скобках, НО! посмотрите на это:
LEA EAX,DWORD PTR DS:[405030] ; eax будет равен 405030, а не тому что будет находиться по адресу 405030. Хотя если выпить не много пиво, а видемо инженеры так и делали, можно понять.
Ответ отправил: Пашка (статус: 2-ой класс)
Ответ отправлен: 19.04.2007, 18:07
Отвечает: An42
Здравствуйте, Biggle!
Вашем случае ни чем, в регистр dx будет занесен адрес смещения относительно начала сегмента данных.
Удачи
Ответ отправил: An42 (статус: 2-ой класс)
Ответ отправлен: 20.04.2007, 10:55