Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ассемблерная операция операции OR в Delphi


Автор: Lexicss 6.9.2006, 00:24
Очень важно знать как в ассемблерном представлении выглядит операциия OR. 
Частный случай.
Код

var i : Cardinal   //-  глобальная переменная
i := 0;
i := i or 1;

Очень важно узнать во сколько ассемблерных операций раскладывается i := i or 1;
делфи говорит что в одну  "dword ptr [i],08"  
Но вот код операции состовляет 830D.401F.1D01.08   
Почему он такой грамоздский? Тут явно не одна, а несколько пераций. 
Может кто точно подскажет кто разбирается?

Автор: Alexeis 6.9.2006, 00:34
у меня 83 0D D4 FB 44 00 01
 "or dword ptr [i],$01"
все нормально   
01 - число 1
D4 FB 44 00 - четырех байтовый адрес
83 0D - вероятно код операции OR

Автор: Alexeis 6.9.2006, 00:54
не обманывает вот весь код процедуры полученый из WinHeX
33 С0 (xor eax, eax)
     A3 D4 FB 44 00      (mov [i], eax)
83 0D D4 FB 44 00 01 (or dword ptr [i],$01)
C3 (ret)
90 (nop)

100% совпадает с указаным в делфи

Автор: Snowy 6.9.2006, 01:01
Код

or     d,[0011D1F40],008

Автор: Alexeis 6.9.2006, 01:04
чет не то адресс 4,5 байта

Автор: Snowy 6.9.2006, 01:04
Цитата(alexeis1 @  6.9.2006,  00:54 Найти цитируемый пост)
не обманывает вот весь код процедуры полученый из WinHeX
Это процедуры. А без её обёртки и остаётся чистый or.

Добавлено @ 01:05 
Цитата(alexeis1 @  6.9.2006,  01:04 Найти цитируемый пост)
чет не то адресс 4,5 байта
Это не я 0 спереди дописал smile
Это hiew smile

Добавлено @ 01:08 
Вобщем смысл понятен - столько байт из-за того, что or производится не над регистром, а над памятью, что требует 4-хбайтового указателя.

Автор: dumb 6.9.2006, 01:10
аа.. вот он где, "источник зла". smile
для начала, Lexicss, не надо добавлять точки - эта "отсебятина" меняет смысл.

Цитата(Lexicss @  6.9.2006,  00:24 Найти цитируемый пост)
Очень важно знать как в ассемблерном представлении выглядит операциия OR. 

в ассемблерном представлении операция OR выглядит так:
Код

or


а в остальном - и количество инструкций и, соотв-но, их длина зависят от "настроения" компилятора(имеется ввиду оптимизация). а почему тебя этот вопрос так заинтересовал?

Автор: Snowy 6.9.2006, 01:10
А сам or двухбайтовый из-за того, что тип данных dword. Для word и byte - он однобайтовый.
Игого 2 байта or + 4 байта адрес + 1 байт значение (если оно байтовое, а не двордовое smile )

Автор: oleg1973 6.9.2006, 01:12
Код

or eax,eax
or eax,0xffffffff
or [eax],dword 0xffffffff
or [0xffffffff],dword 0xffffffff   


имеем

Код

09С0
83С8FF
8108FFFFFFFF
810DFFFFFFFFFFFFFFFF


Автор: Lexicss 6.9.2006, 08:35
Цитата(dumb @ 6.9.2006,  01:10)
аа.. вот он где, "источник зла". smile
для начала, Lexicss, не надо добавлять точки - эта "отсебятина" меняет смысл.

Цитата(Lexicss @  6.9.2006,  00:24 Найти цитируемый пост)
Очень важно знать как в ассемблерном представлении выглядит операциия OR. 

в ассемблерном представлении операция OR выглядит так:
Код

or


а в остальном - и количество инструкций и, соотв-но, их длина зависят от "настроения" компилятора(имеется ввиду оптимизация). а почему тебя этот вопрос так заинтересовал?

У меня эта операция выполняется в нескольких потоках, поэтому мне обязательно надо убедится, что эта команда в ассемблере выполняется в 1 одну команду ассемблера. Иначе если это не так, то будет лажа - тогда придётся применять синхронизирующмй объект.  И деляю я всё БЕЗ оптимизации компилятора. 
Например, вот у меня была команда 
Код

i := i or $8;

delphi её машинным кодом распознаёт как 830D401F1D0108
Я набрал эту строку в интерпретаторе и мне выдало три команды. Не помню что, на работе это было, но было чё-то такое...
or ....40
pop ...
sbb ...08

Ну всё же, Народ, спасибо, что подсказали, не оставили без внимания. 

Автор: dumb 6.9.2006, 10:44
Цитата(Lexicss @  6.9.2006,  08:35 Найти цитируемый пост)
У меня эта операция выполняется в нескольких потоках, поэтому мне обязательно надо убедится, что эта команда в ассемблере выполняется в 1 одну команду ассемблера. Иначе если это не так, то будет лажа - тогда придётся применять синхронизирующмй объект.  И деляю я всё БЕЗ оптимизации компилятора. 

если это единственное обращение к данной переменной, и оптимизация выключена, то можешь быть спокоен. smile с тем, что это единичная инструкция, мы уже определились.

Цитата(Lexicss @  6.9.2006,  08:35 Найти цитируемый пост)
delphi её машинным кодом распознаёт как 830D401F1D0108

"delphi генерирует такой машинный код..." - так правильнее говорить... smile

Цитата(Lexicss @  6.9.2006,  08:35 Найти цитируемый пост)
Я набрал эту строку в интерпретаторе и мне выдало три команды. 

"интерпретатор" был в 16-битном режиме. но об этом ты уже догадался, почитав дублирующую тему в Asm. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)