-
首先创建main.c文件,然后使用vim编辑代码。
-
然后使用如下命令编译成汇编代码文件main.s。
$ gcc –S –o main.s main.c -m32
- main.s删除“.”字符开头后的代码
g: pushl %ebp//ebp入栈 movl %esp, %ebp//ebp=esp,生成新的堆栈空间 movl 8(%ebp), %eax//将变址寻址ebp+8所指向内存的值存入eax addl $19, %eax//将eax的值加19 popl %ebp//ebp出栈,esp减去4,指向上一个位置 ret//返回,继续执行下一条指令 f: pushl %ebp//ebp压栈,esp指向下一个位置 movl %esp, %ebp//将ebp指向esp的位置 subl $4, %esp //esp减4,即指向下一个位置 movl 8(%ebp), %eax//ebp向上移动两位,eax=8 movl %eax, (%esp)//eax内容存入esp指向的内存 call g//eip入栈,调用g leave//包括movl %ebp,%esp和popl %ebp两条指令 ret//返回,继续执行下一条指令 main: pushl %ebp//ebp压栈 movl %esp, %ebp//将ebp指向esp所指向的栈地址。 subl $4, %esp//esp指向的位置向下移动一格 movl $19, (%esp)//立即数19放到esp所在位置 call f//执行pushl eip和movl f eip两个动作,eip压栈,ebp指向下一个位置,eip指向f。 addl $1, %eax leave//堆栈回到main函数最初的状态 ret//退出main总结
通过本次的学习和实验,对于C语言程序在计算机上具体是怎么工作的有了一个比较清晰的认识,了解到寄存器的作用和汇编指令的执行过程,遇到的问题是对于堆栈的理解不强,但通过实验加深了认识。



