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

Вниз

Работа с XCHG и LOCK   Найти похожие ветки 

 
Тимохов_   (2009-06-01 15:11) [0]

Здравствуйте, коллеги!

Вопрос знатокам архитектуры процессоров и ассемблера.

Как вы думаете, почему в функции InterlockedExchange из sysutils.pas нет LOCK перед XCHG? Вроде как должно быть? Или нет? А если многопроцессорная машина?

function InterlockedExchange(var A: Integer; B: Integer): Integer;
asm
       XCHG    [EAX],EDX
       MOV     EAX,EDX
end;


Поясните, пожалуйста.


 
Pavia ©   (2009-06-01 15:20) [1]

Должен быть перфикс LOCK.


 
Rouse_ ©   (2009-06-01 15:25) [2]


> Должен быть перфикс LOCK.

Не должен быть... Читаем мануал:
The XCHG instruction always asserts the LOCK# signal regardless of
the presence or absence of the LOCK prefix.


 
Тимохов_   (2009-06-01 15:30) [3]

да вот мне знакомый говорит, что должен быть.

в quality central посмотрел - нет такого репорта.
а там ребята маститые - если бы была ошибка, то вероятней всего заметили бы.

или все-таки ошибка?


 
Тимохов_   (2009-06-01 15:31) [4]

т.е. ты хочешь сказать, Саша, что всегда выполняется с LOCK"ом?

приведи адрес цитаты, пожалуйста.


 
Игорь Шевченко ©   (2009-06-01 15:32) [5]


> да вот мне знакомый говорит, что должен быть.


в каком-то whats.new от какой-то версии Delphi было написано, что префикс убран, ибо незачем.


 
Rouse_ ©   (2009-06-01 15:32) [6]


> приведи адрес цитаты, пожалуйста.

® IA-32 Intel  Architecture Software Developer’s Manual, качай с сайта интела...


 
Тимохов_   (2009-06-01 15:33) [7]

Тогда зачем InterlockedExchange  из kernel32.dll сделан с LOCK"ом?


 
Игорь Шевченко ©   (2009-06-01 15:34) [8]


> Тогда зачем InterlockedExchange  из kernel32.dll сделан
> с LOCK"ом?


а он точно сделан с Lock-ом ?


 
Тимохов_   (2009-06-01 15:35) [9]


> а он точно сделан с Lock-ом ?

Правда тут cmpxchg. Ему нужен что-ли LOCK?

kernel32.InterlockedExchange:
7C80981E mov ecx,[esp+$04]
7C809822 mov edx,[esp+$08]
7C809826 mov eax,[ecx]
7C809828 lock cmpxchg [ecx],edx
7C80982C jnz $7c809828
7C80982E ret $0008
7C809831 nop


 
clickmaker ©   (2009-06-01 15:38) [10]

This instruction can be used with a LOCK prefix to allow the instruction to be executed atomi-cally. To simplify the interface to the processor"s bus, the destination operand receives a write cycle without regard to the result of the comparison. The destination operand is written back if the comparison fails; otherwise, the source operand is written into the destination. (The processor never produces a locked read without also producing a locked write.)


 
Игорь Шевченко ©   (2009-06-01 15:39) [11]


> Правда тут cmpxchg.


а зачем обманывать ?


 
Тимохов_   (2009-06-01 15:41) [12]

Слуште, коллеги, скажите мне, пожалуйста, тупому -

xchg и lock xchg - по семантике ОДНО и то же?

правда очень надо :)


 
Rouse_ ©   (2009-06-01 15:43) [13]


> Правда тут cmpxchg

В этом случае LOCK нужен.


 
Тимохов_   (2009-06-01 15:44) [14]

Да не нужен мне cmpxchg :) Ты про xchg скажи!
Саша, вопрос важен в том числе и для тебя...


 
Rouse_ ©   (2009-06-01 15:44) [15]


> xchg и lock xchg - по семантике ОДНО и то же?

Нет, это разные команды...


 
Игорь Шевченко ©   (2009-06-01 15:44) [16]


> xchg и lock xchg - по семантике ОДНО и то же?


что имеется в виду под семантикой ?


 
Rouse_ ©   (2009-06-01 15:45) [17]


> Саша, вопрос важен в том числе и для тебя...

Если ты про VMProtect - он не виртуализирует lock xchg, только XCHG


 
Тимохов_   (2009-06-01 15:46) [18]


> что имеется в виду под семантикой ?

поясняю вопрос

lock xchg блокирует шину данных, тем самым делая доступ к ясейке памяти последовательным в том числе из РАЗНЫХ процессоров.

Ведет ли себя также xchg?

(согласно цитате их [2] xchg неявно работает как lock xchg).


 
Pavia ©   (2009-06-01 15:47) [19]

Прочитал маны.
XCHG при обращении к памяти всегда выполняется атамарно. Согласно манам интел и АМД. А вот про регистр-регистр не сказанно. Но поверим что тоже.

LOCK это префикс код F0h

Перед cmpxchg нужно добовлять LOCK чтобы сделать ее атамарной.


 
Rouse_ ©   (2009-06-01 15:49) [20]

При xchg шина всегда блокируется независимо от префикса, таким образом команды XCHG и LOCK XCHG - абсолютно идеттичны, но имеют разные опкоды


 
Тимохов_   (2009-06-01 15:50) [21]


> А вот про регистр-регистр не сказанно.

Что-то я это не понял? Регистр же потоку принадлежит. Его то атомарить зачем.


 
oxffff ©   (2009-06-01 15:50) [22]


> Тимохов_   (01.06.09 15:11)


lock префикс автоматом для это интструкции


 
oxffff ©   (2009-06-01 15:56) [23]


> oxffff ©   (01.06.09 15:50) [22]


В смысле интструкция производит захват шины в вне зависимости от lock prefix.


 
Тимохов_   (2009-06-01 16:29) [24]

Всем спасибо! Как же хорошо, что есть такая группа товарищей, которые все знают!

Я вами всеми горжусь. У меня вот ничего в голове не держится, поэтому отвечаю редко, ибо если и знаю, то скорее знал, т.е. уже забыл.

Еще раз спасибо :)



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

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

Наверх




Память: 0.52 MB
Время: 0.014 c
4-1213778010
incm
2008-06-18 12:33
2009.08.02
Как в главном окне перехватывать сообщения WM_MDICREATE и т.п.


3-1225086355
hic
2008-10-27 08:45
2009.08.02
Передача данных из сохраненного отчета FastReport в Delphi


10-1159243302
Думкин
2006-09-26 08:01
2009.08.02
OWC.SpreadSheet


2-1244129220
Мелкий
2009-06-04 19:27
2009.08.02
Как перейти к n-ой записи ADOQuery?


15-1244147405
Юрий
2009-06-05 00:30
2009.08.02
С днем рождения ! 5 июня 2009 пятница