2009-10-24 2 views
6

인라인 어셈블러를 C와 유사한 언어로 함수에 삽입 할 때 스크래치에 사용할 수있는 레지스터에 대한 규칙은 무엇입니까? 컴파일러는 asm 블록을 입력하기 전에 저장해야하는 모든 레지스터의 값을 저장해야합니까? asm 블록을 종료하기 전에이 레지스터에 값을 저장하고 복원하는 것은 프로그래머의 책임입니까? 일반적인 규칙이 있습니까, 아니면 매우 구현 관련입니까?인라인 어셈블러 : 어떤 스크래치 레지스터를 사용할 수 있습니까?

답변

9

인라인 어셈블리는 정의에 따라 컴파일러에 따라 다릅니다.

인라인 어셈블리를 지원하는 대부분의 컴파일러에는 어셈블리에서 수정할 레지스터를 나타낼 수있는 구문이 있습니다. 그런 다음 컴파일러는 필요할 때 해당 레지스터를 저장하고 복원 할 수 있습니다.

2

일부 호출 규칙 here에서 레지스터 사용법을 읽을 수 있습니다.

7

매우 컴파일러마다 다릅니다. 그러나 현실적인 예제에서는 x86에서 gcc를 사용합시다. 형식은 다음과 같습니다

asm (assembler template 
    : output operands    (optional) 
    : input operands    (optional) 
    : list of clobbered registers  (optional) 
    ); 

는 "사방 레지스터의 목록은"당신은 당신의 코드가 사용하는 등록 컴파일러를 이야기입니다.

이 다음은 간단한 메모리 복사 코드의 이러한 방향을 감안할 때

asm ("movl $count, %%ecx; 
     up: lodsl;  
     stosl; 
     loop up;" 
    :   /* no output */ 
    :"S"(src), "D"(dst) /* input */ 
    :"%ecx", "%eax"); /* clobbered list */  

, GCC는 블록의 다른 것들에 대한 EAX와 ECX를 사용하지 않습니다.

자세한 정보 here.

관련 문제