· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Как правильно писАть lea edx, [edx+eax-1] или...

Посл.отвђт Сообщенiе


Дата: Мар 17, 2004 22:06:11

Как правильно писАть
lea edx, [edx+eax-1]
или
lea edx, [eax+edx-1]


Неожиданно обнаружил что если написать
lea edx, [edx+eax-1]
то TRW2000 покажет
lea edx, [eax+edx-1]


аналогично если написать
lea edx, [eax+edx-1]
то TRW2000 покажет
lea edx, [edx+eax-1]


Дата: Мар 18, 2004 02:56:41

Asterix
Это либо в ассемблере либо в TRW2000 баг.
А у меня что в fasm'е написано то TD32 и показывает.(По крайней мере в этом случае.)


Дата: Мар 18, 2004 03:08:49

Black_mirror
Юзаю в данном случае masm32.
Ну, а правильно то как писать, какой регистр на первое место ставить в скобках?


Дата: Мар 18, 2004 03:31:12

Проверил на fasm'е, всё как положено, что написано то и в дебаггере.
Выходит это очередной глюк Microsoft'а :-)


Дата: Мар 18, 2004 04:35:54

Глюк - не глюк, а какая разница?
Я не силён в математике, но, по-моему, математически разницы нет, выполняться будет одинаково правильно. А это главное, на мой взгляд. Пиши как хочешь.


Дата: Мар 18, 2004 05:31:38

FASM выбирает оптимальный вариант. В данном случае разницы в размере нет,
но в некоторых случаях, в MASM, будет разный размер опкода, в зависимости от порядка "слагаемых"


Дата: Мар 18, 2004 06:00:03

SolidCode

Опкоды получаются разные..
Может The Svin разъяснит, если заглянет ;-)


Дата: Мар 18, 2004 08:46:32 · Поправил: S_T_A_S_

8D5410 FF       lea     edx, [dword ds:eax+edx-1]
8D5402 FF       lea     edx, [dword ds:edx+eax-1]

Opcode      ModR/M                   SIB                Displacement
8Dh          54h                          02h                     FFh
          Mod  ,Reg  , R/M        Scale,Index,Base    disp8
8Dh     01b  ,010b,100b        00b , 000b,010b       FFh
LEA  +disp8,EDX ,SIB used -> *1 , EAX ,EDX      -1
lea         edx ,                    [ 1* EAX + EDX +   (-1)]

Opcode      ModR/M                   SIB                Displacement
8Dh          54h                          10h                     FFh
          Mod  ,Reg  , R/M        Scale,Index,Base    disp8
8Dh     01b  ,010b,100b        00b , 010b,000b       FFh
LEA  +disp8,EDX ,SIB used -> *1 , EDX ,EAX      -1
lea         edx ,                    [ 1* EDX + EAX +   (-1)]


Дата: Мар 18, 2004 14:49:19

S_T_A_S_

Ну и.., какие выводы?
"От перестановки мест слагаемых... ;-)" или
"На первое место нужно ставить..." ??


Дата: Мар 18, 2004 15:58:36

Asterix

Да кто его знает? Думаю разницы в данном случае нет никакой. Но, помню видел на board32, The Svin приводил какой-то пример когда MASM генерировал на байт более длинную команду, чем возможно.
Но там не зависило "От перестановки мест слагаемых"
Там нужо было *1 писать, что бы нормальный опкод получался.
Так что юзайте FASM - его граматный человек писал, а не [пропущено, т.к. Беспощадный Даос все равно поправит] ;-)


Дата: Мар 19, 2004 08:56:29

Для lea результат будет тот же. Однако при адресации если в поле базы в SIB будет EBP или ESP то адресоватся будет через селектор в SS в остальных случаях через DS. Понятно, что при пользовательском режиме Win32 по барабану, там в DS и SS одинаковые селекторы с нулевой базой, но в других случаях когда селекторы с разными базами, линейный результирующий адрес будет разным.
т.е mov eax,[eax][ebp] и mov eax,[ebp][eax] поместят переменные находящиеся по разным адресам.
По поводу же lea с использованием EBP+другой регистр в источнике есть тонкость - если базой будет EBP - опкод будет на 1 байт длинее (добавится нулевой дисплейсмент).
так, что в конструкциях типа
lea eax,[reg][ebp]
нужно заставить компилятор поместить ebp в индекс вместо базы. Средствами ассемблера в MASM это делается так
1. Для других операций (не lea) достаточно поместить DS перед [reg][reg]
т.е. например:
mov eax,DS:[eax][ebp]
вместо просто
mov eax,[eax][ebp]
При этом MASM не вставляет префикс переопределения сегмента, а просто меняет местами базу и индекс в SIB и необходимость в нулевом дисплейсменте отпадает.
2. Для lea такой трюк не проходит.
Для обоих вариантов
lea eax,[ebp][eax] и lea eax,DS:[ebp][eax]
MASM генерирует опкод с EBP в базе хоть ты тресни.
Чтобы заставить его засунуть EBP в индекс нужно написать множитель 1 перед ebp т.е:
lea eax,[ebp*1][eax]

Что касается арифметического результата - то в обоих случаях происходит сложение по модулю 2^32. И как сказано было от перестановки слогаемых сумма не меняется в том числе и сумма по модулю.


Дата: Мар 19, 2004 21:24:25

Че-то вы замудрили. Какая разница?


Дата: Мар 20, 2004 05:51:55

Да уж... зато это сообщение коротко и бесполезно.

Вы кого спросили и о чём?
Если меня, то как я ещё должен подробнее разность разжёвывать?
Я описал два случая, (две разницы как говорят в Одессе) в зависимости от положения кода регистров в блоке SIB (это известно что такое?) и того какой из них в поле индекс а какой в поле базы (известно что такие поля существуют в опкоде?).
В одном случае от их положения будет разница в рассчёте адреса, в другом - в размере опкода.

Или предыдущее сообщение простой короткий сетевой тролль?
Чтобы зафлудить непонятным вопросом топик?
Если это человек писал, пусть потрудится разъяснить что ему мудрённо и где он разницы не видит.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057