learningOS开源操作系统社区
  • 首页
  • 训练营
  • 明星学员
  • 共建单位
  • 项目实习
  • 问答论坛
登录
    Copyright © 2024 opencamp.ai All rights reserved.
    网络学堂mooc中《4.3 GCC内联汇编》一节中的一些疑问
    匿名2023/07/31 19:50:27提问
      2018lecture4student
    455

    在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
        暂无数据