어셈블리의 비트

에 의해 2009년 8월 29일 prashant
: 아래에 제출한 기술

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

댓글

    Disqus에 의해 전원 블로그 코멘트