GCC 인라인 어셈블리 코드에서 %C는 무엇을 의미합니까?
-
16-09-2019 - |
문제
나는이 인라인 어셈블리 코드를 이해하려고 노력하고 있습니다. _hypercall0
여기.
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 매뉴얼, 설명합니다 %[name]
, 하지만 %c[name]
. 내가 봐야 할 다른 장소가 있습니까?
해결책
로부터 GCC 내부 문서:
`%c숫자'일반적으로 즉각적인 오페라를 나타내는 구문없이 일정한 값인 피연산자를 대체하는 데 사용될 수 있습니다.
다른 팁
어셈블리 출력을 확인하십시오 ( gcc -S
, 또는 객체 파일을 분해 할 수도 있고 더 명확 할 수 있습니다.
내 생각에 그것은 그것이 의지한다는 것입니다 끊임없는. hypercall_page
각각 syscall을 수행하는 지침 테이블처럼 보입니다. 어쩌면 이것은 a를 생성 할 것입니다 call hypercall_page + {constant based on the expression given}
, 본질적으로 컴파일 타임 에이 오프셋의 주소를 계산했습니다.
따로, 이것은 __HYPERVISOR##name
물건은 정말로 나를 생각 나게합니다 __NR_name_of_syscall
Linux의 SyScalls에 대해 볼 수있는 유형 컨벤션u003Casm/unistd.h> 그리고 비슷한 장소.
제휴하지 않습니다 StackOverflow