어셈블리의 비트

에 의한 2009년 8월 29일 prashant · 댓글
: 아래 출원 기술

읽은 다음 자물쇠를 무료로 버퍼에 대한 기사를하고 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을 반환;
 }