Немного собраний

29 августа 2009 по Prashant · Комментарии
Написано в рубрике: технологии

После прочтения этой статьи о блокировке свободных буферов и, видя использования 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;
 )