网络学堂mooc中《4.3 GCC内联汇编》一节中的一些疑问
匿名2023/07/31 19:50:27提问
    2018lecture4student
306

在4.3 GCC内联汇编一节中6:14处出现了这样的图像:

这个例子是陈渝老师用于说明在C语言代码中使用内联汇编。

针对这个例子,我在学习的时候主要有两个疑问:

  1. "a"表示的是%eax寄存器,所以"=a"(__res)应该是指将%eax的值赋给__res,那为什么例子中是将%edi的值赋给了__res
  2. C语言会将局部变量依次储存在栈中,arg1对应的位置为-28(%ebp),arg2对应的位置为-24(%ebp),所以__res得位置应该为-32(%ebp),与例子中的-12(%ebp)不符

我在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。

回答(2
    推荐问答
      Simple Empty
      暂无数据