Немного собраний
После прочтения этой статьи о блокировке свободных буферов и, видя использования CAS (сравнить и своп), я чувствовал себя проводки ассемблера сделать то же самое. Использование случае там должен был написать собственный метод, и призываем его от Java (еще в 1,5, при одновременной структуры данных в Java были более или менее, не существует). Без дальнейших церемоний, я раскрыть код на вас
. Первое заключается в КАС и второе для вычислительных НОД по алгоритму Евклида (это один можно найти во многих местах и учебники, а).
Скомпилируйте и запустите инструкции gcc file_name.c ; ./a.out
Сравнивайте и Swap
# Включить# Включить / / Обмен - NewValue, comperand старый / ожидаемое значение / * * Функция на самом деле делает следующие вещи - если значение по * Dest равна oldvalue затем заменить его на другой NewValue оставить его неизменным: все эти атомно- * * Есть два варианта возврата * 1.is начальное значение * Dest и оставить бремя вызова fxn сравнить его с oldval * 2. сделать это здесь и вернуть 0 или 1, то это должно быть более эффективным * * / / * Позже изменить его на макро * / Int (CAS Int * Dest, Int oldvalue, Int NewValue) ( Е ("(% D% D% D)", * НАЗНАЧЕНИЕ, oldvalue, NewValue); / * INT (CAS йезЬ Int, Int oldvalue, Int NewValue) (* / / * INT (CAS йезЬ Int, Int NewValue, Int oldvalue) (* / Int результат = 1 / * 1, показывает, что удалось и CAS 0 показывает, что она не * / / * Кстати нужно установить вв флага удалив! * / __asm__ __volatile__ ( "Movl% 2, EAX%% \ т \ п" "Movl% 3, EBX%% \ т \ п" "Movl% 0, ECX%% \ т \ п" "LOCK \ п \ т" "CMPXCHG%% EBX, (ЕКБ%%) \ п \ т" / * должен быть LOCK на той же строки * / "Совершено JZ \ п \ т" "Movl $ 0,% 1 \ п \ т" "DONE: \ т \ п" : "= Т" (эскадренный миноносец), "= г" (результат) : "G" (oldvalue), "г" (NewValue), "м" (эскадренный миноносец) : "% EAX", "% EBX", "ECX", "Копия" ); Е ("(% D% D% D)", * НАЗНАЧЕНИЕ, oldvalue, NewValue); возвращение результата; ) / * TODO * Написать еще АНМ fxn которая ставит выше fxn в то время как петли и стараться, если ей удастся * / п () ( Int = 5, B = 6; Int * с = (INT *) таНос (sizeof (INT)); * C = 6; / * INT с = 6 *; Е ("% й \ п", CAS (C, B, B)); Е ("% й \ п", CAS (C, B,)); Е ("% й \ п", CAS (C, A,)); Е ("% й \ п", CAS (C, B, B)); * C = 6; / * С = 5 *; Е ("Изменение значения * C% к \ п", * с); Е ("% й \ п", CAS (C, B, B)); Е ("% й \ п", CAS (C, B,)); Е ("% й \ п", CAS (C, A,)); Е ("% й \ п", CAS (C, A, B)); Е ("% й \ п", CAS (C, B,)); возврат 0; )
Форматирование отмечает, - кажется WP подсветку синтаксиса является добавление в конце концов, игнорировать это.
НОД
# ВключитьInt НОД (Int, Int б) ( Int результат; / * Compute наибольшего общего делителя с помощью алгоритма Евклида * / __asm__ __volatile__ ("movl% 1, EAX%%;" "Movl% 2,%% EBX;" "Прод.: cmpl $ 0, EBX%%;" "Совершено е;" "Xorl EDX%%,%% EDX;" "Idivl EBX%%;" "Movl EBX%%,%% EAX;" "Movl EDX%%,%% EBX;" "JMP прод.;" "DONE: movl EAX%%,% 0;": "= г" (результат): "G" (), "г" (б) ); возвращение результата; ) п () ( Int первый, второй; ("Введите два целых чисел:"); зсапЕ ("% D% D", и первая, и вторая); Е ("НОД% D и% D является% г \ п", первая, вторая, НОД (первый, второй)); возврат 0; )



































