Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

В чем разница?   Найти похожие ветки 

 
dmk ©   (2004-03-17 21:45) [0]

mov edx, [eax].FPlanes
и
mov edx, eax.FPlanes

Оба варианта компилятор воспринимает нормально.
Subj


 
Cobalt ©   (2004-03-17 21:56) [1]

Осталось только взглянуть в View\Debug Windows\CPU
И увидеть разницу.


 
dmk ©   (2004-03-17 22:49) [2]

Никакой разницы не заметил.


 
Andy BitOff ©   (2004-03-17 23:19) [3]

Никакой разницы нет, во всяком случае для дельфи, но принято (с незапамятных времен) писать mov edx, [eax.FPlanes], что в тексте сразу читается как, edx ИЗ ...


 
Andy BitOff ©   (2004-03-17 23:21) [4]

А вот при записи mov dl,byte ptr [eax.FPlanes] скопки обязательны. Или dx,word ptr [eax.FPlanes]


 
Defunct ©   (2004-03-17 23:52) [5]

dmk ©   (17.03.04 21:45)  

Смысл [eax] такой: ячейка памяти по адресу, записанному в EAX

Когда вы пишете EAX.FieldX, компилятор автоматически распознает, что речь идет о ячейке памяти, так как в процессоре нет никаких полей прикрепленных к регистру EAX, и автоматически подствляет []

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

Например.

Var S:ShortString

Mov EAX,S  


Компилятор точно знает, что S это область памяти, и точно знает, что разрядность регистра EAX - 32бита, отсюда вам сразу формирутся такая команда:

MOV EAX, Dword Ptr DS:[Offset S]

Согласитесь компилятор нам здорово помогает. Но нужно точно понимать, что происходит, иначе можно получить серьезные глюки.
Например, даже в приведенном примере, ведь не вся строка попадет в EAX.


 
dmk ©   (2004-03-18 00:25) [6]

Спасибо за разъяснение.


 
Defunct ©   (2004-03-18 00:46) [7]

Andy BitOff ©
Позвольте с вами не согласиться, длинна данных компилятору известна.

mov dl,byte ptr [eax.FPlanes]

вполне можно записать как:

Mov DL, EAX.FPlanes

Компилятор доподлино знает, что копируется 1 байт.


 
Andy BitOff ©   (2004-03-18 01:33) [8]

> Defunct ©
Да =) Я потом специально проверил. Согласен. Просто привычка, вторая натура. Как привык, так и не думая и пишешь, хотя, опять же хороший стиль (может я консервативен? =).
Хотя это до сих пор верно для Tasm"а.


 
Defunct ©   (2004-03-18 01:52) [9]

Andy BitOff ©   (18.03.04 01:33) [8]
> Как привык, так и не думая и пишешь, хотя, опять же хороший стиль (может я консервативен? =).


Привычка у вас полезная, позволяет избежать многих неявных ошибок. Но вот пример ситуации когда <Тип> Ptr [адрес] обязателен, был выбран немного неудачно.

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

Mov Word Ptr [ebp+55], 8Fh

В этой команде компилятор ну никак не сможет установить размер данных, если ее записать так:

Mov [ebp+55], 8Fh ; ОШИБКА
Mov ebp+55, 8Fh ; А это уже полный бред

Так что как видите есть моменты, где без <Тип> Ptr [] ну никак не обойтись.



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.057 c
14-1078687616
Proz
2004-03-07 22:26
2004.04.04
Тупая ошибка


7-1074492835
Dmitriy_G
2004-01-19 09:13
2004.04.04
Как мне проверить наличие сигнала CTS, в COM


6-1075289378
Zelius
2004-01-28 14:29
2004.04.04
Глюк в инди при работе с потоками?


1-1079177704
Vilux
2004-03-13 14:35
2004.04.04
Динамическое создание компонента


14-1078811223
ИМХО
2004-03-09 08:47
2004.04.04
Потрепаться - почтой