实验楼上配套实验一
1.创建main.c文件
touch main.c
vim main.c
2.将main.c文件编译成汇编代码
gcc –S –o main.s main.c -m32
这条命令的含义是:
gcc
: 调用 GCC 编译器。-S
: 只生成汇编代码,不生成可执行文件。-o main.s
: 指定输出文件名为main.s
。main.c
: 输入的 C 源文件。-m32
: 生成 32 位架构的代码。
3.查看汇编代码main.s的内容
vim main.s
汇编代码main.s的内容为:
这段代码的含义如下:
函数 g
:
- 从第6行开始定义的函数
g
,是一个简单的函数:pushl %ebp
和movl %esp, %ebp
: 这些指令将栈指针保存到ebp
寄存器,设置栈帧。movl 8(%ebp), %eax
: 读取调用者传递的参数,将其从栈中加载到eax
寄存器中。8(%ebp) 表示栈中ebp
寄存器偏移量为8的位置,这是函数的第一个参数。addl $2, %eax
: 将寄存器eax
中的值加2。popl %ebp
: 恢复ebp
的值,撤销栈帧设置。ret
: 返回eax
中的值。
这个函数实际上实现的是一个简单的将输入参数加2并返回的功能。
函数 f
:
- 第24行开始定义的是函数
f
,它实现了对函数g
的调用:- 逻辑与
g
类似,设置栈帧。 movl 8(%ebp), %eax
: 从栈中加载参数到eax
中。movl %eax, (%esp)
: 将这个参数传递给g
,即将它存入栈中。call g
: 调用函数g
,并获取其返回值。leave
和ret
: 清理栈帧并返回结果。
- 逻辑与
函数 f
的主要作用是接收一个参数并将其传递给 g
,再返回 g
的结果。
函数 main
:
- 第45行开始定义的是
main
函数:- 这个函数传递常量值
$3
给函数f
。 movl $3, (%esp)
: 将常量值3压入栈中,作为参数传递给f
。call f
: 调用函数f
,获取返回值。addl $4, %eax
: 这一行的操作是将f
返回的结果加上4。
- 这个函数传递常量值
因此,main
函数最终返回的是 f(3)
加4的结果。
总结:
- 函数
g
实现了将传入的参数加2。 - 函数
f
调用了g
,并传递了从调用者获取的参数。 main
函数调用了f
,传递参数3,最终将结果加上4。
这个代码的大致逻辑是:main
传递3给 f
,f
再传递给 g
,g
将3加2并返回5,f
传回5,main
再加4,最后返回9。