임시 레지스터를 사용하는 작은 어셈블리 루틴을 작성하고 싶습니다. 임시 레지스터라고 할 때, asm
블록에 대한 제약 조건에서 입력 또는 출력 레지스터가 아니라는 의미입니다. 모든 레지스터를 고르고 clobber 목록에 포함시킬 수는 있지만 컴파일러가 선택할 수있는 것이 더 좋을 것이라고 생각했습니다. 이것을 처리하는 올바른 방법은 무엇입니까? 온라인에서 찾은 유일한 제안은 출력 레지스터로 나열한 다음 실제로 출력을 사용하지 않는 것입니다.인라인 어셈블리 블록의 임시 레지스터
답변
클로버 목록에서 r
(일반 레지스터) 제약 조건을 사용할 수 없습니다. 그리고 입력 전용 레지스터는 asm 문에 의해 수정되지 않은 것으로 가정됩니다. 가장 좋은 해결책은 임시 레지스터를 출력 레지스터로 지정하는 것인데, 이는 컴파일러에게 '결과'를 버리고 레지스터를 폐기 할 수있는 옵션을 제공합니다.
unsigned long tmp; /* register 'word' type. */
__asm__ ("..." : "=r" (tmp), ... : <inputs> : <clobbered>);
는 이제이 예제에서, %0
로 임시 레지스터를 참조 할 수 있습니다. tmp
변수를 사용하지 않으면 컴파일러는 결과를 무시하고 레지스터를 계속 (다시) 사용할 수 있습니다.
좋습니다. 컴파일러는 아마 내가 결코 사용자'tmp'를 본 적이 없다는 것을 알아 차릴 것이다. –
@MichaelMcLoughlin - 이것은 '% 0'을 (를) 사용하는 명령어가 그들이 사용할 수있는 레지스터에 대한 어떠한 제한도 없다고 가정합니다. 특정 x86 명령어에는 'q','Q' [constraints] (http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Machine-Constraints.html#Machine-Constraints)와 같은 단점이 있습니다. . –
어셈블리 코드의 유일한 포인트가'tmp'를 계산하는 것이라는 인상을 컴파일러에주지 않도록하십시오. 그렇지 않으면 아마 모든 것을 버릴 것입니다! – SamB
- 1. AVR 인라인 어셈블리 : 변수에 레지스터?
- 2. MIPS 어셈블리 언어 - 임시 레지스터 대 저장된 레지스터
- 3. 컨텍스트 스위칭을위한 gcc 인라인 어셈블리
- 4. 어셈블리 언어 레지스터
- 5. 어셈블리 및 레지스터
- 6. 어셈블리 레지스터 EAX와 피연산자
- 7. ASP.NET 레지스터 어셈블리 오류
- 8. 인라인 블록의 수직 위치
- 9. 인라인 어셈블리 오류
- 10. 인라인 어셈블리
- 11. 인라인 어셈블리
- 12. 블록, 인라인 및 인라인 블록의 차이점은 무엇입니까?
- 13. 어셈블리 : 데이터 세그먼트 레지스터 (DS)
- 14. 약 어셈블리 조건 코드 레지스터
- 15. 레지스터, 어셈블리 x8086의 인쇄 가치
- 16. 어셈블리 sp 및 bp 레지스터
- 17. 어셈블리 : Ja를 사용한 레지스터 비교
- 18. PIC 어셈블리 : 0으로 감소시키는 레지스터
- 19. Autofac 레지스터 어셈블리 유형 성에서
- 20. sparc 어셈블리 및 % y 레지스터
- 21. 매우 간단한 어셈블리 레지스터 비교
- 22. G ++ Asm 인라인 : 레지스터 clobbering
- 23. 인라인 블록의 텍스트 가운데 맞추기
- 24. 인라인 블록의 정렬도 수직으로 만드시겠습니까?
- 25. GCC 인라인 어셈블리
- 26. 인라인 어셈블리, SEHException
- 27. 문자열 인라인 어셈블리
- 28. Watcom 인라인 어셈블리 문서
- 29. 인라인 어셈블리 설명
- 30. 인라인 어셈블리, 인터럽트 들어가기
어떤 컴파일러를 사용합니까? 어떤 CPU/OS에서? –