Немного сборки

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

После прочтения этой статьи о блокировки свободных буферов и, видя, использование ССС (сравните и своп), я чувствовал, что размещение сборки кода, чтобы сделать то же самое. Используйте случае там было написать собственный метод и вызывать его из Java (еще в 1.5, при одновременных структур данных в Java были более или менее несуществующие). Не мудрствуя лукаво, я раскрыть код на вас :) . Первая предназначена для КАС и второй для вычисления НОД по алгоритму Евклида (это могут быть найдены во многих местах и ​​учебных пособий, а).

Скомпилируйте и запустите инструкции gcc file_name.c ; ./a.out

Сравните и замены

   # Включить 
  # Включить 
 / / Обмен - NewValue, comperand стар / ожидаемое значение
 / *
  * Функция на самом деле делает следующую вещь - если значение в * Dest равно OldValue затем заменить его NewValue еще оставить его без изменений: делать все это атомарно
  *
  * Есть два варианта для возвращаемого значения
  * 1.is начальное значение * Dest и оставить бремя вызова FXN сравнить его с oldval
  * 2.  сделать это здесь и вернуть 0 или 1, то это должно быть более эффективным
  * * /

 / * Позже изменить его на макро * /
 Int CAS (Int * Dest, Int OldValue, Int NewValue) {
	 Е ("(% D,% D,% г)", * Dest, OldValue, NewValue);
	 / Внутр CAS (INT Dest, Int OldValue, Int NewValue) {* /
	 / Внутр CAS (INT Dest, Int NewValue, Int OldValue) {* /
	 Int результат = 1 / * 1 показывает, что CAS успешно и 0 показывает, что она не смогла * /
	 / * Кстати нужно установить флаг куб.см для затирания!  * /
	 __asm__ __volatile__ (
			 "Movl% 2,%% EAX \ п \ т"
			 "Movl% 3,%% EBX \ п \ т"
			 "Movl% 0,%% ECX \ п \ т"
			 "LOCK \ п \ т"
			 "CMPXCHG%% EBX, (%% ECX) \ п \ т" / * должен быть ЗАМОК на той же строке * /
			 "Совершено JZ \ п \ т"
			 "Movl $ 0,% 1 \ п \ т"
			 "Совершено: \ п \ т"
			 : "= Т" (Dest), "= г" (результат)
			 : "Г" (OldValue), "г" (NewValue), "м" (Dest)
			 : "% EAX", "% EBX", "ECX", "сс"
			 );
	 Е ("(% D,% D,% г)", * Dest, OldValue, NewValue);
	 возвращение результата;
 }

 / * TODO
  * Написать еще ASM FXN которая ставит выше FXN в то время цикла и продолжать пробовать, если он успешно * /

 Int основных () {
	 Int = 5, б = 6;
	 Int * с = (INT *) таНос (SizeOf (INT));
	 * С = 6;
	 / Внутр с = 6; * /
	 Е ("% г \ п", CAS (с, б, б));
	 Е ("% г \ п", CAS (с, б,));
	 Е ("% г \ п", CAS (с,,));
	 Е ("% г \ п", CAS (с, б, б));
	 * С = 6;
	 / * С = 5; * /
	 Е ("изменение значения с * к% г \ п", * с);
	 Е ("% г \ п", CAS (с, б, б));
	 Е ("% г \ п", CAS (с, б,));
	 Е ("% г \ п", CAS (с,,));
	 Е ("% г \ п", CAS (с, а, б));
	 Е ("% г \ п", CAS (с, б,));
	 возврат 0;
 }

Форматирование заметки - кажется WP подсветку синтаксиса добавляет в конце концов, игнорируйте это.

НОД

 # Включить 
 Int НОД (Int, Int б) {
     Int результат;
     / * Вычислить Наибольший общий делитель по алгоритму Евклида * /
     __asm__ __volatile__ ("movl% 1,%% EAX;"
                           "Movl% 2,%% EBX;"
                           "ПРОДОЛЖЕНИЕ: cmpl $ 0,%% EBX;"
                           "Совершено е;"
                           "Xorl%% EDX, EDX%%;"
                           "Idivl%% EBX;"
                           "Movl EBX%%,%% EAX;"
                           "Movl%% EDX, EBX%%;"
                           "JMP ПРОДОЛЖЕНИЕ;"
                           "Совершено: movl%% EAX,% 0;": "= г" (результат): "г" (), "г" (б)
     );

     возвращение результата;
 }

 Int основных () {
     Int первое, второе;
     Е ("Введите два целых числа:");
     зсапЕ ("% d.% d.", и первый, и второй);

     Е ("НОД г% &% d.% d. \ п", первый, второй, НОД (первый, второй));

     возврат 0;
 }

Комментарии

    комментарии блога двигались на большой скорости Diskus