2009-11-04 2 views
6

_hypercall0here에서 오는이 인라인 어셈블리 코드를 이해하려고합니다.GCC 인라인 어셈블리 코드에서 % c의 의미는 무엇입니까?

asm volatile ("call hypercall_page+%c[offset]" \ 
     : "=r" (__res) \ 
     : [offset] "i" (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \ 
     : "memory", "edi", "esi", "edx", "ecx", "ebx", "eax") 

나는 문제가 첫 번째 줄에 %c이 무엇을 의미하는지에 대한 정보를 찾는 데. 나는 GCC manual의 가장 분명한 부분에서 어떤 정보도 찾지 못했고 %[name]을 설명하고 있지만 %c[name]은 설명하지 못했습니다. 보아야 할 다른 곳이 있습니까?

답변

12

:

'%의 C 자리는'보통 는 즉각적인 피연산자를 나타내는 구문없이 상수 값 인 피연산자를 대체하는데 사용될 수있다.

2

조립품 출력을 확인하십시오 (gcc -S 또는 오브젝트 파일을 분해 할 수 있음). 더 명확 할 수도 있습니다.

내 생각에 상수는입니다. hypercall_page은 각각이 시스템 호출을하는 지시 표처럼 보입니다. 아마 이것은 call hypercall_page + {constant based on the expression given}을 생성 할 것이고, 컴파일시에이 오프셋의 주소를 계산할 것입니다. 여담으로

__HYPERVISOR##name 물건은 정말 당신이 리눅스의 <ASM/unistd.h> 및 이와 유사한 장소에서 시스템 콜에 대한 참조 __NR_name_of_syscall 유형 규칙을 생각 나게한다. GCC internals documentation 가입일