Nedaudz pulcēšanās
Pēc rīdinga šo rakstu par slēdzeņu bez buferiem un redzēt izmantot CAS (salīdzināt un mijmaiņas), es jutos kā norīkošanu montāžas kodu do pats. Izmantot lietu tur bija uzrakstīt dzimtā metodi un sauc to no Java (atpakaļ 1.5, kad līdztekus datu struktūras Java bija vairāk vai mazāk nav vispār). Bez papildu ADO, es ņemšu atraisīt kodu uz jums
. Pirmā ir CAS un otrais ir par skaitļošanas GCD izmantojot Eiklida ģeometrija 's algoritmu (to var atrast daudzās vietās un konsultācijas, kā arī).
Apkopot un palaist instrukciju gcc file_name.c ; ./a.out
Salīdzināt un mijmaiņas
# Ietvert# Ietvert / / Apmaiņas - NewValue, comperand ir vecs / paredzamā vērtība / * * Funkcija faktiski ir šāda lieta - ja ir valodā * dest vērtība ir vienāda ar oldvalue tad to aizstāt ar NewValue cits atstāt to nemainītu: Vai visi šie atomically * * Ir divas iespējas atgriešanās vērtību * 1.is sākotnējā valodā * dest vērtība un atstāt slogu izsaucēja fxn salīdzināt to ar oldval * 2. darīt vairāk nekā šeit un atdod 0 vai 1, tas būtu efektīvāks ** / / * Vēlāk izmainīt to makro * / int CAS (int * dest, int oldvalue, int NewValue) { printf ("(% d,% d,% d)" * dest, oldvalue, NewValue); / * Int CAS (int dest, int oldvalue, int NewValue) {* / / * Int CAS (int dest, int NewValue, int oldvalue) {* / int rezultāts = 1 ;/ * 1 liecina, ka CAS izdevās un 0 rāda, ka tas neizdevās * / / * BTW jāiestata cc karogs clobbering! * / __asm__ __ volatile__ ( "Movl% 2,%% EAX \ n \ t" "Movl% 3,%% ebx \ n \ t" "Movl% 0,%% ECx \ n \ t" "LOCK \ n \ t" "CMPXCHG%% ebx (%% ECx) \ n \ t" / * būtu LOCK jābūt uz vienas līnijas * / "JZ DONE \ n \ t" "Movl 0 $,% 1 \ n \ t" "DONE: \ n \ t" : "= M" (dest), "= g" (rezultāts) : "G" (oldvalue), "g" (NewValue), "m" (dest) : "% EAX", "% ebx", "ECx", "CC" ); printf ("(% d,% d,% d)" * dest, oldvalue, NewValue); atgriezties rezultāts; } / * TODO * Rakstīt citu ASM fxn kas liek iepriekš fxn kādā kamēr cilpa un jāmēģina, ja vien tas izdodas * / int main () { int = 5, b = 6; int * c = (int *) malloc (sizeof (int)); * C = 6; / * Int c = 6; * / printf ("% d \ n", CAS (c, b, b)); printf ("% d \ n", CAS (c, b,)); printf ("% d \ n", CAS (c,,)); printf ("% d \ n", CAS (c, b, b)); * C = 6; / * C = 5; * / printf ("maiņas vērtība * c uz% d \ n", * c); printf ("% d \ n", CAS (c, b, b)); printf ("% d \ n", CAS (c, b,)); printf ("% d \ n", CAS (c,,)); printf ("% d \ n", CAS (c,, b)); printf ("% d \ n", CAS (c, b,)); atgriezties 0; }
Formatēšanas atzīmes - šķiet kā wp sintakses marķieris ir pievienot galu galā, ignorēt to.
GCD
# Ietvertint GCD (int, int b) { int rezultāts; / * Aprēķināt Lielākais kopīgais dalītājs, izmantojot Eiklida ģeometrija 's algoritmu * / __asm__ __ volatile__ ("movl% 1,%% EAX;" "Movl% 2,%% ebx;" "CONTD: cmpl 0 $,%% ebx;" "Je DONE;" "Xorl%% EDX,%% EDX;" "Idivl%% ebx;" "Movl%% ebx,%% EAX;" "Movl%% EDX,%% ebx;" "JMP CONTD;" "DONE: movl%% EAX,% 0;": "= g" (rezultāts): "g" (), "g" (b) ); atgriezties rezultāts; } int main () { int 1., 2.; printf ("Ievadiet divus naturālus skaitļus:"); scanf ("% d% d", & 1., un 2.); printf ("GCD no% d &% d ir% d \ n", pirmais, otrais, GCD (1., 2.)); atgriezties 0; }



































