어셈블리의 비트
읽고 나면 이 자물쇠 무료로 버퍼에 대한 기사를하고 CAS의 사용을 (비교 및 스왑)보고, 나는 동일한 작업을 수행하기 위해 어셈블리 코드를 게시 느낌. 네이티브 메소드를 작성하고 (다시 자바 동시 데이터 구조가 더 많거나 적게 존재하지 않는되었습니다 1.5에서) 자바에서 전화가 발생했습니다 이상의 케이스를 사용합니다. 자세한 ADO없이, 난 당신에 코드를 쏴라 겁니다
. 먼저 CAS와 GCD 두번째는 컴퓨팅에 대한 유클리드의 알고리즘 (이 하나가 아니라 여러 장소 및 튜토리얼에서 찾을 수)를 사용입니다.
지침 컴파일하고 실행합니다 gcc file_name.c ; ./a.out
비교 및 스왑
# 포함# 포함 / / 교환 - newvalue는 comperand 가치 이전 / 예상됩니다 / * * 기능은 실제로 다음과 같은 일을 반복해 - * 이명 령의 가치가 변동 다른 newvalue하여 교체 후 oldvalue 같다면 : 어떻게 이러한 모든 atomically * * 리턴 값에 대한 두 가지 옵션이 있습니다 * 1.is 초기 * 이명 령의 가치와 fxn이 oldval와 비교하기 위해 호출의 부담을 떠나 * 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; / * 1 보여줍 카스는 * /를 실패 성공과 0 보여줍니다 / * btw이 플래그가 clobbering에 대한 CC를 설정해야합니다! * / __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, A, A)); 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, A, A)); printf ( "% d 개 \ N", 캐스 (C, A, B)); printf ( "% d 개 \ N", 캐스 (C, B, A)); 0 반환; }
서식 노트 - WP 구문 형광펜 것 같아이 추가됩니다 결국, 그렇게 무시합니다.
GCD
# 포함INT 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 "(A),"G "(B) ); 결과를 반환; } INT 주 () { 먼저 두 번째 INT; printf ( "두 정수 입력 :"); scanf ( "% d 개 % d 개", & 먼저 및 초); printf ( "% d 개 & % d 개의 GCD는 %입니다 D \ N '둘째, 첫째, gcd (첫째, 둘째)); 0 반환; }



































