2014-03-12 3 views
0

임시 레지스터를 사용하는 작은 어셈블리 루틴을 작성하고 싶습니다. 임시 레지스터라고 할 때, asm 블록에 대한 제약 조건에서 입력 또는 출력 레지스터가 아니라는 의미입니다. 모든 레지스터를 고르고 clobber 목록에 포함시킬 수는 있지만 컴파일러가 선택할 수있는 것이 더 좋을 것이라고 생각했습니다. 이것을 처리하는 올바른 방법은 무엇입니까? 온라인에서 찾은 유일한 제안은 출력 레지스터로 나열한 다음 실제로 출력을 사용하지 않는 것입니다.인라인 어셈블리 블록의 임시 레지스터

+2

어떤 컴파일러를 사용합니까? 어떤 CPU/OS에서? –

답변

2

클로버 목록에서 r (일반 레지스터) 제약 조건을 사용할 수 없습니다. 그리고 입력 전용 레지스터는 asm 문에 의해 수정되지 않은 것으로 가정됩니다. 가장 좋은 해결책은 임시 레지스터를 출력 레지스터로 지정하는 것인데, 이는 컴파일러에게 '결과'를 버리고 레지스터를 폐기 할 수있는 옵션을 제공합니다.

unsigned long tmp; /* register 'word' type. */ 

__asm__ ("..." : "=r" (tmp), ... : <inputs> : <clobbered>); 

는 이제이 예제에서, %0로 임시 레지스터를 참조 할 수 있습니다. tmp 변수를 사용하지 않으면 컴파일러는 결과를 무시하고 레지스터를 계속 (다시) 사용할 수 있습니다.

+0

좋습니다. 컴파일러는 아마 내가 결코 사용자'tmp'를 본 적이 없다는 것을 알아 차릴 것이다. –

+0

@MichaelMcLoughlin - 이것은 '% 0'을 (를) 사용하는 명령어가 그들이 사용할 수있는 레지스터에 대한 어떠한 제한도 없다고 가정합니다. 특정 x86 명령어에는 'q','Q' [constraints] (http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Machine-Constraints.html#Machine-Constraints)와 같은 단점이 있습니다. . –

+0

어셈블리 코드의 유일한 포인트가'tmp'를 계산하는 것이라는 인상을 컴파일러에주지 않도록하십시오. 그렇지 않으면 아마 모든 것을 버릴 것입니다! – SamB