实验一 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
使用touch命令创建main.c,并使用vim编辑
输入示例代码并做小幅修改,并输入:wq保存并退出
使用$ gcc –S –o main.s main.c -m32将代码编译成汇编代码并写入main.s
查看main.s
使用g/.s*/d命令获得更纯净的汇编代码
分析汇编代码执行过程
main函数
指令 | 作用 |
---|---|
pushl %ebp | EBP寄存器的值压栈 |
movl %esp,%ebp | EBP寄存器指向标号1的位置 |
subl $4,%esp | ESP寄存器向下移动一个标号 |
movl $6, (%esp) | 把立即数7放入ESP寄存器指向的位置 |
call f | EIP寄存器跳转到f函数的位置 |
addl $3,%eax | EAX寄存器加立即数3 |
leave | 撤销main函数的堆栈 |
ret | 函数返回 |
f函数
指令 | 作用 |
---|---|
pushl %ebp | EBP寄存器的值压栈 |
movl %esp, %ebp | EBP寄存器指向标号4的位置 |
subl $4,%esp | ESP寄存器减4,指向标号5的位置 |
movl 8(%ebp), %eax | EBP寄存器加8 |
movl %eax,( %esp) | 将EAX寄存器中存储的立即数8放到ESP寄存器现在所指位置上 |
call g | 调用函数g |
leave | 撤销f函数的堆栈 |
ret | 函数返回 |
g函数
指令 | 作用 |
---|---|
pushl %ebp | EBP寄存器的值压栈 |
movl %esp, %ebp | EBP寄存器指向标号7的位置 |
movl 8(%ebp), %eax | EBP寄存器加8,指向标号5的位置,将标号5的内容放到EAX寄存器中 |
addl $17,%eax | 把立即数17加到EAX寄存器中 |
pool %ebp | 把标号7的内容放回到EBP寄存器 |
ret | 函数返回 |
总结
本周的实验一是通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的。
在本实验中我学会了使用gcc -S -o * * -m32命令将一个C程序编译成汇编语言并写入指定文件,并通过分析汇编代码更深刻的理解了代码运行的过程。代码工作过程中会使用到EBP基址指针寄存器和ESP栈顶指针寄存器来进行堆栈操作,所有出栈入栈的操作都要靠这两个寄存器完成。
计算机的工作过程本质上就是执行程序的过程,而程序是由若干条指令组成的,计算机逐条执行程序中的指令,就可完成一个程序的执行,从而完成一项特定的工作。