2011-10-30 2 views
2

디버깅 목적으로 내 assert 함수에 $ra (반송 주소) 레지스터를 인쇄하고 싶습니다. 나는 MIPS CPU에서 일하고있다. 나는 다음 코드를 시도했지만 컴파일러는 그것을 좋아하지 않는다 : 나는 인라인/확장 어셈블리에 관한 GCC 문서를 발견했습니다asm 명령을 사용하여 MIPS CPU 레지스터 읽기

unsigned int RA; 
unsigned int* pRA = &RA; 
asm volatile("sw $ra, %0" : "=r" (pRA)); 

또는

static volatile unsigned int RA; 
asm ("mov $ra, %0" : "=m"(RA)); 

를하지만 나에게 불분명 보인다 . 다음의

답변

4

어느 작동합니다 :

unsigned int x; 
asm volatile ("move %0, $ra" : "=r" (x)); 
asm volatile ("sw $ra, %0" : "=m" (x)); 

당신이 포인터 값 asm volatile ("sw $ra, %0" : "=m" (*pRA));를 사용하여 주장하는 경우 당신이 반환에 포인터를 끝낼 것 pRA을 얻을거야 역 참조하지 않고 (길을 가야하는 것입니다 주소가 아니라 RA에 저장된 값). 제약에 대한 자세한 내용은 GCC inline assembly HOWTO에서 확인할 수 있습니다.

+0

[공식 gcc 문서 인라인 asm] (https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html)에 링크 할 가치가 있습니다. 이 메뉴에는 gcc의 확장 된 asm 지원에 대한 세부 사항은 물론 제약 조건에 대한 링크가 포함되어 있습니다. 나는 OP가 그가 "GCC 문서를 찾았습니다."라고 말했지만 정확히 무엇을 발견했는지, 어디에서 발견했는지 정확히 모릅니다. –