以下是一个宏函数,包含了一段内联汇编,用于配置中断描述符表的中断门和陷阱门:
#define _set_gate(gate_selector_addr,attr,ist,code_addr) \
do \
{ unsigned long __d0,__d1; \
__asm__ __volatile__ ( "movw %%dx, %%ax \n\t" \
"andq $0x7, %%rcx \n\t" \
"addq %4, %%rcx \n\t" \
"shlq $32, %%rcx \n\t" \
"addq %%rcx, %%rax \n\t" \
"xorq %%rcx, %%rcx \n\t" \
"movl %%edx, %%ecx \n\t" \
"shrq $16, %%rcx \n\t" \
"shlq $48, %%rcx \n\t" \
"addq %%rcx, %%rax \n\t" \
"movq %%rax, %0 \n\t" \
"shrq $32, %%rdx \n\t" \
"movq %%rdx, %1 \n\t" \
:"=m"(*((unsigned long *)(gate_selector_addr))) , \
"=m"(*(1 + (unsigned long *)(gate_selector_addr))),"=&a"(__d0),"=&d"(__d1) \
:"i"(attr << 8), \
"3"((unsigned long *)(code_addr)),"2"(0x8 << 16),"c"(ist) \
:"memory" \
); \
}while(0)
请问这个内联汇编中输出部分的&修饰符是什么意思?在翻阅gcc手册时理解的是&修饰符表示修饰的操作数输入和输出不能使用同一个寄存器,但是看这个代码时候感觉理解错了,希望有人能仔细解释一下"=&a"(__d0),"=&d"(__d1)的意思。
另一个问题是输入部分的"3"和"2"是什么意思?是表示输入部分的第3个操作数吗?
最后希望能解释以下这段汇编的输入输出是什么,汇编代码在做什么?