Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2016, 12:21   #1
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию Атомарность присвоения

У меня тут вопрос возник: будет ли обычное 32-битное присвоение (mov [X],eax), если переменная не выровнена по границе памяти, атомарным? Т.е. переменная 32-битная находится, скажем, по адресу 00FFFFFFh. Причём, прикол в том, что за-lock-ить её нельзя.
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 18.09.2016, 12:40   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не факт.
не спроста есть целое семейство Interlocked* функций.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.09.2016, 12:48   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Еще и от проца зависит...
p51x вне форума Ответить с цитированием
Старый 19.09.2016, 12:44   #4
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Пепел Феникса, функции InterlockedAssign нет. Более того, даже lock mov сделать нельзя! Не потому ли, что такая операция по любому атомарна. Или предполагается, что такие данные должны всегда быть выровнены?

p51x, вот тут хотелось бы поподробнее, плиз
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 19.09.2016, 13:10   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
функции InterlockedAssign нет.
InterlockedExchange возьмите, вы можете игнорировать старое значение.
(потому Assign и нету)
Цитата:
Или предполагается, что такие данные должны всегда быть выровнены?
вообще да.

lock префикс он для read-modify-write инструкций.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2016, 13:11   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Ну, например, у армов есть конвеер. И вполне возможна ситуация, что, если не аккуратно сделать, то mov положит переменную на конвеер, а другой поток будет читать из памяти другое значение.
p51x вне форума Ответить с цитированием
Старый 19.09.2016, 13:47   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну, например, у армов есть конвеер. И вполне возможна ситуация, что, если не аккуратно сделать, то mov положит переменную на конвеер, а другой поток будет читать из памяти другое значение.
К атомарности это отношения не имеет.
Даже без всякого конвейра вы можете прочитать "старые" данные.
"Атомарность" в данном контексте означает, что не получится ситуация, когда mov в одном потоке изменил часть переменной а в другом потоке mov прочитал ее. Гарантируется, что считывается либо старое значение, либо новое. Другое дело, при каких условиях это гарантируется - для х86 для этого требуется, чтоб данные были выровнены. Собственно, об этом прямым текстом написано в мануалах по InterlockedXXX вызовам.
waleri вне форума Ответить с цитированием
Старый 19.09.2016, 13:50   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Тогда причем тут lock из первого поста?
p51x вне форума Ответить с цитированием
Старый 19.09.2016, 13:51   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Всё ниже моё гипотетическое, теоретическое предположение.
Нет не будет атомарной. Железо не обманешь. Оно вынуждено читать за 2 приема. А механизма защиты нет, по крайней мере интел пишет, что только выравненные на границе 4 байта. Хотя честно там так мутно это всё написано! майкрософт на 16 байт выравнивает мьютексы.
Цитата:
Более того, даже lock mov сделать нельзя!
Думаю что можно и он сработает. Но! Не на два участка памяти, а только на один. Поэтому для нас это бесполезно. Да и на разных машинах lock работает по разному.

Лично я для свой библиотеке сделал так. Мьютекс выравнен на границе 32 бит. В Delphi все 32 битные переменные так выровнены.
Для захвата использую.

Код:
lock  XCHG  DWord PTR [mutex],edx
А вот если хотите пропатчить код, то там данные не выровнены. Там либо использовать машинную команду cmpxchg8b (AtomicCompareExchange64) или медленный метод через средства ОС VirtualProtect(Addr, 5, PAGE_EXECUTE_READWRITE, OldProtect);.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.09.2016, 14:34   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Тогда причем тут lock из первого поста?
lock требуется для инструкций типа XCHG поскольку они выполняют и чтение и запись. Собственно lock можно выполнять с любой инструкцией, только смысла нет. lock посылает всем остальным процессорам сигнал "всем ждать, пока я закончу". Соотвественно lock инструкция блочится, пока остальные процы не скажут "мы ждем, о повелитель".
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объяснение. операторы присвоения.С valodu Помощь студентам 7 12.03.2016 04:54
перегрузка операции присвоения (С++) Sterben Помощь студентам 2 11.10.2015 21:01
Формула присвоения (дописывание текста из ячейки) SweetOpium Microsoft Office Excel 0 28.02.2013 15:53
алгоритм присвоения минимального значения max_scotch Помощь студентам 3 11.05.2012 19:25
последовательность присвоения значения переменным Maincore Общие вопросы Delphi 2 06.02.2012 13:10