实验一 反汇编一个简单的C程序,分析汇编代码
1. 编写一个简单的c语言程序
2. 将20232818.c文件编译为汇编代码20232818.s
gcc -S 20232818.c -o 20232818.s
3. 查看得到的汇编文件,并对其进行精简操作
遇到问题及解决方法:
vi 20232818.s
:g/^\.d
4. 分析汇编代码(ARM下)
g:
sub sp, sp, #16 ;将当前栈指针的值减去16个字节,使栈指针向栈底方向移动,为新的数据分配空间
str w0, [sp, 12] ;将寄存器 w0 中的值存储到距离栈指针 sp 当前位置12个字节的内存地址处
ldr w0, [sp, 12] ;将栈指针 sp 当前位置加上12个字节的内存地址处的数据加载到通用寄存器 w0 中
add w0, w0, 7 ;将通用寄存器 w0 中的值与7相加,然后将结果存储回 w0 寄存器中
add sp, sp, 16 ;将当前栈指针的值增加16个字节,释放之前分配的栈空间
ret
f:
stp x29, x30, [sp, -32]! ;将寄存器 x29 和 x30 的值存储到栈指针 sp 当前位置减去32个字节的地址处,并且更新栈指针 sp 的值,使其指向新的栈顶位置
mov x29, sp ;将栈指针 sp 的当前值复制到通用寄存器 x29 中
str w0, [sp, 28] ;将通用寄存器 w0 中的值存储到距离栈指针 sp 当前位置28个字节的内存地址处
ldr w0, [sp, 28] ;从栈指针 sp 当前位置加上28个字节的内存地址处加载数据,并将加载的值存储到通用寄存器 w0 中
bl g ;允许程序跳转到函数 g 中执行,然后在函数完成后返回到原始的调用位置
ldp x29, x30, [sp], 32 ;从栈指针 sp 当前位置加载32个字节的数据到寄存器对 x29 和 x30 中,更新栈指针 sp 的值,使其指向加载后的新栈顶位置
ret
main:
stp x29, x30, [sp, -16]! ;将寄存器 x29 和 x30 的值存储到栈指针 sp 当前位置减去16个字节的地址处,并且更新栈指针 sp 的值,使其指向新的栈顶位置
mov x29, sp ;将栈指针 sp 的当前值复制到通用寄存器 x29 中
mov w0, 8 ;将整数值 8 移动到通用寄存器 w0 中
bl f ;允许程序跳转到函数 f 中执行,然后在函数完成后返回到原始的调用位置
add w0, w0, 1 ;将通用寄存器 w0 中的值与1相加,然后将结果存储回 w0 寄存器中
ldp x29, x30, [sp], 16 ;从栈指针 sp 当前位置加载16个字节的数据到寄存器对 x29 和 x30 中,更新栈指针 sp 的值,使其指向加载后的新栈顶位置
ret