本次实验内容:将一个简单的C程序汇编成x86或x86-64汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用。
我选择使用RISC-V汇编代码。
首先安装对应的gcc交叉编译环境:

sudo apt-get install gcc -riscv64-linux-gnu

安装成功:

然后编写一段简单的C语言代码:

执行编译指令:

riscv64-linux-gnu-gcc -S -o main_riscv64.s main.c

编译成功:

查看汇编代码:

 .file   "main.c"                                                                                                                                                             2     .option nopic3     .text4     .align  15     .globl  g6     .type   g, @function7 g:8     add sp,sp,-32 #sp=sp-32 为栈顶预留四个字节的存储空间9     sd  s0,24(sp)#store指令,s0为栈底指针,将s0的值存放到sp+24的位置10     add s0,sp,32#s0 = sp+32 构造g函数的栈空间,形成g函数的逻辑空栈11     mv  a5,a0#将a0的值赋给a5即a5 = a012     sw  a5,-20(s0)#store指令 将a5的值存放至s0-20的位置中13     lw  a5,-20(s0)#load指令,将s0-20的值存放至a514     addw    a5,a5,2023#a5 = a5 + 202315     sext.w  a5,a516     mv  a0,a5#a0 = a5 将g函数的返回值存放至a0中17     ld  s0,24(sp)#s0 = sp+24 将sp+24的值重新存储道s0栈底指针中,指向f函数的栈空间18     add sp,sp,32 #栈顶指针指向f函数栈空间的栈顶19     jr  ra#无条件跳转指令 函数返回20     .size   g, .-g21     .align  122     .globl  f23     .type   f, @function24 f:25     add sp,sp,-32#sp = sp -32 sp为栈顶指针预留出四个字节存储空间26     sd  ra,24(sp)#store指令,ra存放的是返回地址27     sd  s0,16(sp)#store指令 s0为栈底指针,将s0的值存放到sp+16指向的位置中28     add s0,sp,32#s0=sp+32,构造f函数的栈空间,形成f函数的逻辑空间29     mv  a5,a0#a5=a0,a0存放的是函数参数,此处保存一次参数的作用是用来给后面的g函数进行传递参数,此时a5中存放的是23,可以发现RISC-V使用 寄存器 进行参数传递30     sw  a5,-20(s0)#store指令,将a5的值存放到s0-20指向的位置中31     lw  a5,-20(s0)#load指令,将s0-20位置中的值存放到a5中32     mv  a0,a5#a0=a5,此时a0保存的是函数参数,为调用g(x)做准备33     call    g#调用g函数34     mv  a5,a0#a5=a035     mv  a0,a5#a0=a5,将f函数返回值保存在a0中36     ld  ra,24(sp)#ra=sp+24,获取main函数的返回地址37     ld  s0,16(sp)#s0=sp+16,将sp+16的值重新存储到s0栈底指针中,指向main函数的栈空间38     add sp,sp,32#sp,sp,32 ;指向main函数栈空间栈顶39     jr  ra#无条件跳转指令,返回main函数40     .size   f, .-f41     .align  142     .globl  main43     .type   main, @function
main:45     add sp,sp,-16#sp=sp-16,64位指令集,一条指令需要8个字节,这里预留16字节分别存储上一个程序的堆栈的返回地址和栈底指针46     sd  ra,8(sp)#store指令,ra存放的是返回地址,将ra存放到sp+8指向的位置中47     sd  s0,0(sp)#store指令,s0为栈底指针,将s0的值存放到sp指向的位置中48     add s0,sp,16#s0=sp+16,构造main函数的栈空间,形成main函数的逻辑空栈49     li  a0,23#保存f函数参数23,li是RISC-V中的一条伪指令,意思是load immediate,即将一个立即数加载到寄存器中50     call    f#调用函数f,返回值会保存在a0中51     mv  a5,a0#a5 = a052     addw    a5,a5,1#将寄存器 a5 的值加上 1,然后将结果作为一个 32 位的有符号整数写回 a5 中53     sext.w  a5,a5#将寄存器 a5 的值作为一个 32 位的有符号整数扩展到 64 位,然后写回 a5 中。这是一种伪指令,相当于 addiw a5,a5,0。54     mv  a0,a555     ld  ra,8(sp)#从栈指针 sp 加上 8 的地址处加载 64 位的数据,然后存入寄存器 ra 中。ra 是返回地址寄存器,用于保存函数调用的返回地址56     ld  s0,0(sp)#从栈指针 sp 的地址处加载 64 位的数据,然后存入寄存器 s0 中。s0 是一个被调用者保存的寄存器,用于保存函数内部的状态或者参数57     add sp,sp,16#将栈指针 sp 的值加上 16,然后将结果存回 sp 中。这样做的目的是为了释放栈上分配的空间,恢复原来的栈指针位置58     jr  ra#无条件跳转到寄存器 ra 的值所表示的地址处继续执行。这样做的目的是为了返回到函数调用者处,结束当前函数的执行59     .size   main, .-main60     .ident  "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
main_riscv64.s

任课老师:孟宁老师

Linux操作系统分析孟宁Lab1相关推荐

  1. linux操作系统分析实验—基于mykernel的时间片轮转多道程序实现与分析

    linux操作系统分析实验-基于mykernel的时间片轮转多道程序实现与分析 学号384 原创作业转载请注明出处+中国科学技术大学孟宁老师的Linux操作系统分析 https://github.co ...

  2. Linux操作系统分析——课程总结报告

    一.Linux系统的启动过程 1.POST开机自检 linux开机加电后,系统开始开机自检,该过程主要对计算机各种硬件设备进行检测,如CPU.内存.主板.硬盘.CMOS芯片等,如果出现致命故障则停机, ...

  3. Linux操作系统分析-课程总结报告

    一.结合虚拟化技术分析Linux系统的一般执行过程 a. 一个 Linux 系统在虚拟化技术中的一般执行过程: 用户登录:当用户登录到 Linux 系统时,系统会创建一个用户会话. 系统启动:Linu ...

  4. 【Linux操作系统分析】设备驱动处理流程

    1 驱动程序,操作系统,文件系统和应用程序之间的关系 字符设备和块设备映射到操作系统中的文件系统,由文件系统向上提供给应用程序统一的接口用以访问设备. Linux把设备视为文件,称为设备文件,通过对设 ...

  5. Linux操作系统分析 | 深入理解系统调用

    Linux操作系统分析 | 深入理解系统调用 实验要求 1.找一个系统调用,系统调用号为学号最后2位相同的系统调用 2.通过汇编指令触发该系统调用 3.通过gdb跟踪该系统调用的内核处理过程 4.重点 ...

  6. Unix/Linux操作系统分析实验二 内存分配与回收:Linux系统下利用链表实现动态内存分配

    Unix/Linux操作系统分析实验一 进程控制与进程互斥 Unix/Linux操作系统分析实验三 文件操作算法: 实现在/proc目录下添加文件 Unix/Linux操作系统分析实验四 设备驱动: ...

  7. Unix/Linux操作系统分析实验四 设备驱动: Linux系统下的字符设备驱动程序编程

    Unix/Linux操作系统分析实验一 进程控制与进程互斥 Unix/Linux操作系统分析实验二 内存分配与回收:Linux系统下利用链表实现动态内存分配 Unix/Linux操作系统分析实验三 文 ...

  8. linux网卡配子接口,Linux 操作系统分析 中国科学技术大学计算机系 陈香兰( 0512 - 87161312 ) Autumn 2010....

    Linux 操作系统分析 中国科学技术大学计算机系 陈香兰( 0512 - ) Autumn 2010 11/23/09 Linux 操作系统分析 2/92 主要内容  进程描述符  进程切换  ...

  9. Linux操作系统分析------期末总结、感谢老师、祝我们越来越好

    王雪 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一.博客目录: 1.第一 ...

最新文章

  1. 项目实战---模拟亿邦动力网
  2. scss怎么引入到html,Sass 导入指令
  3. express利用nodemailer发送邮件(163邮箱)
  4. 链表创建为什么需要使用内存分配?
  5. 2020 COCO Keypoint Challenge 冠军之路!
  6. springmvc 静态资源 配置
  7. java 过滤js事件_java中的过滤器与监听器
  8. python中的递归思想_使用python语言表达分形与递归
  9. iphone模拟器_应用日报 | Xcode 现身 5.4 英寸 iPhone 模拟器,和平精英上线特斯拉皮肤...
  10. 新法规将处罚垃圾邮件制造者
  11. python编写代码实现一个循环双链表类_Python双向循环链表实现方法分析
  12. 关于QTTabBar的使用
  13. fw325r没有虚拟服务器,迅捷fw325r路由器设置完没有网怎么办?
  14. PX4代码学习系列博客(1)——开发环境配置
  15. Win8企业版如何升级至win10专业版
  16. unison 安装使用
  17. 阿里云服务器购买配置、环境部署、搭建网站教程(转载)
  18. 高企税务核查内容有哪些?
  19. 小学生5年级计算机书,小学五年级作文:眼镜、电脑、书
  20. 电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的

热门文章

  1. 【二】、使用游戏手柄驱动二轮差分底盘
  2. 地理信息软件属于计算机软件吗,地理信息系统试题名词解释1地理信息系统是在计算机硬软件...
  3. Centos7的KVM安装配置详解
  4. DeepMind创始人自述:我们的算法可以横扫一切棋类博弈
  5. 一、团队建设能力在管理中的应用(注重协作)
  6. windows7 小工具(win7桌面整理工具)
  7. 惠普道歉被指避重就轻
  8. 搭建一个自己的轻量级二维码生成接口
  9. 震惊,python二级真题答案流出
  10. signature=06a4313dd87c1b3dd1775e5b7855fa80,Hole capture by D‐center defects in 6H‐silicon carbide...