inline asm "0" constraint 관련 질문

hongwoo의 이미지

x86이고 커널레벨에서 돌아가는 코드중 일부입니다.

 
...
#define __OP          "e"  /* Operand Prefix */
...
1: static inline struct cpu_info *get_cpu_info(void)
2: {
3:     struct cpu_info *cpu_info;
4:     __asm__ ( "and %%"__OP"sp,%0; or %2,%0"
5:               : "=r" (cpu_info)
6:               : "0" (~(STACK_SIZE-1)), "i" (STACK_SIZE-sizeof(struct cpu_info))
7:         );
8:     return cpu_info;
9: }

위의 코드가 대략 아래와 같은 코드로 만들어 지는것 같은데요...

 
...
and %esp, cpu_info;
or (STACK_SIZE-sizeof(struct cpu_info)), cpu_info; 
...

그렇다면, 여기서 9번째 줄의 "0" (~(STACK_SIZE-1)) 은 무슨 역할을 하는건지 알려주시면 감사하겠습니다.

grassman의 이미지

최종 어셈블리 코드를 보시면 inline assembly로 작성한 코드 위쪽에 다음과
같은 코드 한 줄이 더 추가되어 있을 겁니다.

movl $(~(STACK_SIZE-1)), <reg>

reg는 위에서 cpu_info로 해석해 놓은 레지스터가 됩니다.

자세한 내용은 이쪽을 참고 하시길.

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html