主要问题:
一开始用mac编译的内容如下,发现很多指令和资料上存在不同。
比如bx lr都无法在传统指令上查到具体作用,后查阅资料发现,这是arm特殊的指令集。发现生成的汇编语言代码和具体的硬件有关,于是在云服务器上进行编译,终于得到和课程中相近的代码。
实验一:反汇编一个简单的C程序
实验步骤
创建main.c,并编辑main.c文件,全部创建过程如图:用 gcc 将main.c编译成汇编代码,代码如下:
由于main.s,源码繁琐,所以删除以点开头的,剩下则是纯汇编代码,如下就是程序执行的具体过程:
```
g:
pushl %ebp ;ebp入栈,保存g的栈底
movl %esp, %ebp ;edp=esp,生成新的堆栈
movl 8(%ebp), %eax ;将变址寻址ebp+8所指向内存的值存入eax
addl $3, %eax ;将eax的值加3
popl %ebp ;撤销函数堆栈
ret ;返回
f:
pushl %ebp ;ebp入栈,保存f的栈底
movl %esp, %ebp ;edp=esp,生成新的堆栈
pushl 8(%ebp) ;将变址寻址ebp+8所指向内存的值入栈
call g ;先将call指令的f指令的CS和IP入栈,就是操作与call对应的jmp指令
addl $4, %esp ;esp减4,增加一个存储空间
leave ;撤销函数堆栈
ret ;返回
main:
pushl %ebp ;ebp入栈,保存main的栈底
movl %esp, %ebp ;edp=esp,生成新的堆栈
pushl $2810 ;将常数2810入栈
call f ;先将call指令的f指令的CS和IP入栈,就是操作与call对应的jmp指令
addl $4, %esp ;esp减4,增加一个存储空间
addl $1, %eax ;将eax的值加1
leave ;撤销函数堆栈
ret ;返回
```