2023-2024-1 20232818 《Linux内核原理与分析》 第二周作业

实验一  反汇编一个简单的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

AI工具使用

(1)gcc 命令的学习

(2)Linux中使用gdb设置断点的学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值