在4.3 GCC内联汇编一节中6:14处出现了这样的图像:
这个例子是陈渝老师用于说明在C语言代码中使用内联汇编。
针对这个例子,我在学习的时候主要有两个疑问:
我在mooc所指定的虚拟机中进行了实验:
// main.cpp int main(int argc, char* argv[]) { long __res, arg1=2, arg2=22, arg3=222, arg4=233; __asm__ volatile("int $0x80" : "=a"(__res) : "0"(11), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4));return 0;
}
执行命令:
gcc main.cpp -o main.exe -m32 objdump -d main.exe > main.s
在生产的汇编代码main.s中,找到了如下代码:
8048411: b8 0b 00 00 00 mov $0xb,%eax 8048416: 8b 5d e4 mov -0x1c(%ebp),%ebx 8048419: 8b 4d e8 mov -0x18(%ebp),%ecx 804841c: 8b 55 ec mov -0x14(%ebp),%edx 804841f: 8b 75 f0 mov -0x10(%ebp),%esi 8048422: cd 80 int $0x80 8048424: 89 45 f4 mov %eax,-0xc(%ebp)
从反汇编的结果来看可以解答我的疑问2,也就是说,编译器在生产最终代码的时候,可能由于某些原因,将__res的位置安排在了最后,所以-12(%ebp)是正确的。
但是疑问1依然没有解决:为什么"=a"(__res)会将%edi寄存器的值赋值给__res。