Главная страница
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.029 c
14-1078481722
TUser
2004-03-05 13:15
2004.04.04
Параметры


1-1079372833
Chcnger
2004-03-15 20:47
2004.04.04
Ошибка при закрытии


1-1079625757
shady
2004-03-18 19:02
2004.04.04
Кол-во строк


3-1078393275
Турчин
2004-03-04 12:41
2004.04.04
Btrieve и Pervasive


1-1079342197
Begin
2004-03-15 12:16
2004.04.04
Обработка сообщений главной формы