어셈블리의 비트
읽은 다음 이 자물쇠를 무료로 버퍼에 대한 기사를하고 CAS의 사용 (비교 및 스왑)보고, 나는 동일한 기능을 수행할 어셈블리 코드를 게시하는 것 같은 느낌이 들었지. 네이티브 메소드를 작성하고 자바 (다시 1.5에서 자바의 동시 데이터 구조가 더 많거나 적은 존재하지 않은있을 때)에서 전화 있었을 통해 케이스를 사용합니다. 발표, 난 당신에 코드를 보여줄 게요
. 먼저 CAS위한 것이며 두 번째는 유클리드의 알고리즘 (이 하나뿐 아니라 여러 장소와 자습서에서 찾을 수있다)를 사용하여 컴퓨팅 GCD입니다.
컴파일하고 실행 지침 gcc file_name.c ; ./a.out
비교 및 스왑
# 포함# 포함 / / 교류 - newvalue, comperand이 예상 / 오래된 가치입니다 / * * 기능은 실제로 다음과 같은 일을 반복해 - * 이명 령의 값이 다른 newvalue 그것이 변하지두고으로 교체 후 oldvalue와 동일한 경우 : 않는 모든 atomically * * 리턴 값에 대한 두 가지 옵션이 있습니다 * 1.is 초기 * 이명 령의 가치와 oldval와 비교하기 위해 전화 fxn의 부담을 떠나 * 2. 이쪽으로 수행하고 0 또는 1을 반환,이보다 효율적이어야합니다 ** / / * 나중에 매크로로 변경 * / INT 카스 (INT * 이명 령, int는 oldvalue, INT newvalue) { printf ( "(% d 개, % D, % d 개)", * 이명 령, oldvalue, newvalue); / * int는 카스 (INT 이명 령, int는 oldvalue, INT newvalue) {* / / * int는 카스 (INT 이명 령, int는 newvalue, INT oldvalue) {* / int는 결과 = 1 ;/ * 카스가 성공했다는 한 공연하고 / *이 실패했음을 0 보여줍니다 / * btw 플래그가 clobbering에 대한 참조를 설정해야합니다! * / __asm__의 __의 volatile__ ( "movl % 2, %로 % eax \ N \ T" "movl % 3, % % ebx 명령이 \ N \ T" "movl %의 0, % % ecx에 \ N \ T" "LOCK \ N \ T" "%의 %를 ebx 명령, (% % ecx에)를 CMPXCHG 것은 \ N \ t"/ *는 같은 줄에 있어야 잠궈한다 * / "점프 온 제로는 \ N \ t를 완료" "movl 0달러, % 1 \ N \ T" "완료합니다 : \ n \ t" : "= m"(이명 령), "= g"(결과) : "G"(oldvalue), "G"(newvalue), "M"(이명 령) : "로 % eax", "% ebx 명령이", "ecx은", "CC" ); printf ( "(% d 개, % D, % d 개)", * 이명 령, oldvalue, newvalue); 결과를 반환; } / * TODO * 한동안 루프에 fxn 위에두고 다른 ASM fxn를 작성하고 * /를 성공하지 못한다면 계속 시도 int는 메인 () { INT = 5, B = 6; INT * C = (INT *) malloc (sizeof (INT)); * C = 6; / * int는 C = 6; * / printf ( "% d 개 \ N", 캐스 (C, B, B)); printf ( "% d 개 \ N", 캐스 (C, B, A)); printf ( "%는 D \ N", 캐스 (C,,)); printf ( "% d 개 \ N", 캐스 (C, B, B)); * C = 6; / * C = 5 * / printf ( "*의 변화하는 가치를 C %까지 D \ N", * C); printf ( "% d 개 \ N", 캐스 (C, B, B)); printf ( "% d 개 \ N", 캐스 (C, B, A)); printf ( "%는 D \ N", 캐스 (C,,)); printf ( "% d 개 \ N", 캐스 (C, A, B)); printf ( "% d 개 \ N", 캐스 (C, B, A)); 0을 반환; }
서식 노트 - WP 구문 형광펜 것 같아이 추가됩니다 결국, 그렇게 무시합니다.
GCD
# 포함정수 gcd (INT, B INT) { int는 결과; / 유클리드의 알고리즘을 사용하여 * 컴퓨트 최대 공약수 * / __asm__의 __의 volatile__ ( "movl % 1, %로 % eax;" "movl % 2, % % ebx 명령;" "CONTD : cmpl 0달러, % % ebx 명령;" "적 다;" "xorl % % edx가, %, % edx가;" "idivl % % ebx 명령;" "movl %의 %를 ebx 명령, %로 % eax;" "movl % % edx가, %의 %를 ebx 명령;" "jmp는 CONTD;" "완료 : movl %로 % eax, % 0;": "= g"(결과) : "G"(), "G"(B) ); 결과를 반환; } int는 메인 () { 먼저 두 번째 INT; printf ( "두 정수 입력 :"); scanf ( "% d 개 % d 개", & 먼저 및 초); printf ( "% d 개 & % d 개 중 GCD는 %입니다 d 개 \ N", 첫째, 둘째, gcd (두 번째, 첫 번째)); 0을 반환; }



































