문제

나는이 인라인 어셈블리 코드를 이해하려고 노력하고 있습니다. _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> 그리고 비슷한 장소.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top