Một chút lắp ráp
Sau khi đọc bài viết này về bộ đệm miễn phí khóa và nh́n thấy việc sử dụng của CAS (so sánh và trao đổi), tôi cảm thấy như đăng các mă lắp ráp để làm như vậy. Sử dụng trường hợp đó là viết một phương pháp bản địa và gọi nó từ Java (trở lại trong 1.5, khi cấu trúc dữ liệu đồng thời trong Java nhiều hơn hoặc ít hơn không tồn tại). Nếu không có thêm ado, tôi sẽ mở ra mă vào bạn
. Đầu tiên là cho CAS và thứ hai là cho máy tính GCD bằng cách sử dụng thuật toán Euclid (điều này có thể được t́m thấy ở nhiều nơi và hướng dẫn).
Biên dịch và chạy hướng dẫn gcc file_name.c ; ./a.out
So sánh và Trao đổi
# Bao gồm# Bao gồm / / Trao đổi - newvalue, comperand cũ / giá trị dự kiến / * * Chức năng thực hiện các điều sau đây nếu giá trị tại * dest là bằng oldvalue sau đó thay thế nó bằng cách newvalue khác để nó không thay đổi: làm tất cả những nguyên tử * * Có hai lựa chọn giá trị trả về * 1.is giá trị ban đầu * dest và để lại gánh nặng của fxn gọi để so sánh nó với oldval * 2. làm điều đó hơn ở đây và trở về 0 hoặc 1, điều này sẽ có hiệu quả hơn ** / / * Sau đó thay đổi nó thành vĩ mô * / 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 kết quả = 1; * 1 cho thấy cas thành công và 0 cho thấy rằng nó không thành công * / / * Btw cần phải thiết lập cc clobbering cờ! * / __asm__ __ volatile__ ( "Movl% 2,% eax \ n \ t" "Movl% 3,% ebx \ n \ t" "Movl% 0,% ecx \ n \ t" "Khóa \ n \ t" "CMPXCHG ebx%% (% ecx%) \ n \ t" / * KHÓA nên trên cùng một ḍng * / "Jz Làm \ n \ t" "Movl $ 0,% 1 \ n \ t" "Làm: \ n \ t" : "M" (dest), "g" (kết quả) : "G" (oldvalue), "g" (newvalue), "m" (dest) : "% Eax,% ebx, ecx", "cc" ); printf ("(% d,% d,% d)", * dest, oldvalue, newvalue); Kết quả trả lại; } / * TODO * Viết khác fxn asm đặt trên fxn trong một ṿng lặp trong khi và tiếp tục cố gắng, trừ khi nó thành công * / int main () { int a = 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, a)); printf ("% d \ n", cas (c, a, a)); printf ("% d \ n", cas (c, b, b)); * C = 6; / * C = 5; * / printf ("thay đổi giá trị của * c% d \ n", * c); printf ("% d \ n", cas (c, b, b)); printf ("% d \ n", cas (c, b, a)); printf ("% d \ n", cas (c, a, a)); printf ("% d \ n", cas (c, a, b)); printf ("% d \ n", cas (c, b, a)); trở về 0; }
Định dạng ghi chú - có vẻ như highlighter cú pháp wp được thêm cuối cùng, bỏ qua điều đó.
GCD
# Bao gồmint UCLN (int a, int b) { int kết quả; / * Tính toán Greatest Common Divisor bằng cách sử dụng thuật toán Euclid * / volatile__ __asm__ __ ("movl% 1,% eax; "Movl% 2,% ebx;" "CONTD: cmpl $ 0,% ebx;" "Je Làm; "Xorl%% EDX, EDX%%; "Idivl%% ebx;" "Movl%% ebx, eax%%; "Movl% edx,% ebx%; "Jmp CONTD; "DONE: movl% eax,% 0;": "= g" (kết quả): "g" (a), "g" (b) ); Kết quả trả lại; } int main () { int 1, thứ hai; printf ("Nhập hai số nguyên:"); scanf ("% d% d", và trước tiên, và thứ hai); printf ("GCD% d% d là% d \ n", đầu tiên, thứ hai, gcd (đầu tiên, thứ hai)); trở về 0; }



































