|
|
| Посл.отвђт | Сообщен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 |