Linux操作系统分析实验1

Togyu 2023-03-13 18:47:56

实验内容:将一个简单的C程序汇编成LoongArch或RISC-V汇编代码,并逐步分析程序的执行过程,深入理解存储程序计算机和函数调用堆栈框架在执行过程中所起的作用。首先执行sudo apt-get install gcc-riscv64-linux-gnu安装RISC-V的交叉编译器
通过riscv64-linux-gnu-gcc -S -o test_riscv64.s test.c将以下test.c编译成risc-v代码
 

#include <stdio.h>

int add_test(int a,int b)
{
	return a+b;
}

int sub_test(int a,int b)
{
	return a-b;
}

int main()
{
    return add_test(2,sub_test(5,3));
}

汇编代码如下

.file "test.c"       ; 定义当前代码文件名

.option nopic       ; 不生成位置无关代码

.text               ; 代码段开始

.align 1            ; 对齐方式为2^1=2字节对齐

.globl add_test     ; 声明全局符号add_test

.type add_test, @function   ; 声明add_test为函数

add_test:           ; add_test函数开始
    add sp, sp, -32 ; 在栈上为局部变量分配32字节空间
    sd s0, 24(sp)   ; 将s0寄存器的值存入栈中
    add s0, sp, 32   ; 将s0寄存器的值设置为栈顶地址+32
    mv a5, a0       ; 将第一个参数移动到a5寄存器
    mv a4, a1       ; 将第二个参数移动到a4寄存器
    sw a5, -20(s0)  ; 将a5的值存入栈中
    mv a5, a4       ; 将a4的值移动到a5
    sw a5, -24(s0)  ; 将a5的值存入栈中
    lw a4, -20(s0)  ; 将栈中的第一个参数载入a4寄存器
    lw a5, -24(s0)  ; 将栈中的第二个参数载入a5寄存器
    addw a5, a4, a5 ; 将a4和a5寄存器中的值相加并存入a5寄存器
    sext.w a5, a5   ; 将a5寄存器的值进行符号扩展
    mv a0, a5       ; 将a5寄存器的值移动到a0寄存器
    ld s0, 24(sp)   ; 将栈中保存的s0寄存器的值恢复到s0寄存器中
    add sp, sp, 32   ; 释放栈空间
    jr ra           ; 返回调用者
.size add_test, .-add_test  ; 计算add_test函数的大小

.align 1            ; 对齐方式为2^1=2字节对齐

.globl sub_test     ; 声明全局符号sub_test

.type sub_test, @function   ; 声明sub_test为函数

sub_test:           ; sub_test函数开始
    add sp, sp, -32 ; 在栈上为局部变量分配32字节空间
    sd s0, 24(sp)   ; 将s0寄存器的值存入栈中
    add s0, sp, 32   ; 将s0寄存器的值设置为栈顶地址+32
    mv a5, a0       ; 将第一个参数移动到a5寄存器
    mv a4, a1       ; 将第二个参数移动到a4寄存器
	sw  a5, -20(s0)   ; 将a5的值存入地址s0-20的内存中
	mv  a5, a4        ; 将a4的值赋给a5
	sw  a5, -24(s0)   ; 将a5的值存入地址s0-24的内存中
	lw  a4, -20(s0)   ; 将地址s0-20的内存中的值加载到a4中
	lw  a5, -24(s0)   ; 将地址s0-24的内存中的值加载到a5中
	subw a5, a4, a5   ; 将a4的值减去a5的值,结果存入a5中
	sext.w a5, a5     ; 将a5的值符号扩展为32位
	mv  a0, a5        ; 将a5的值赋给a0
	ld s0, 24(sp)    ; 将地址sp+24的值加载到寄存器s0中
	add sp, sp, 32    ; 将sp加上32,回收栈空间
	jr ra            ; 从ra寄存器中取出返回地址,跳转到该地址
.align 1         ; 设置数据对齐方式为2的1次方,即2字节对齐
.globl main      ; 声明main函数是全局可见的
.type main, @function ; 声明main函数是一个函数
main:            ; main函数的入口
	add sp, sp, -16  ; 将栈指针减去16,开辟16个字节的栈空间
	sd ra, 8(sp)     ; 将ra寄存器的值存储到地址sp+8的内存中
	sd s0, 0(sp)     ; 将s0寄存器的值存储到地址sp的内存中
	add s0, sp, 16   ; 将s0的值设为sp+16,即指向当前栈帧的起始地址
	li a1, 3         ; 将立即数3存储到寄存器a1中
	li a0, 5         ; 将立即数5存储到寄存器a0中
	call sub_test    ; 调用sub_test函数
	mv a5, a0        ; 将sub_test函数的返回值存储到寄存器a5中
	mv a1, a5        ; 将a5的值赋给a1
	li a0, 2         ; 将立即数2存储到寄存器a0中
	call add_test    ; 调用add_test函数
	mv a5, a0        ; 将add_test函数的返回值存储到寄存器a5中
	mv a0, a5        ; 将a5的值赋给a0,作为main函数的返回值
	ld ra, 8(sp)     ; 将地址sp+8的内存中的值加载到ra寄存器中
	ld s0, 0(sp)     ; 将地址sp的内存中的值加载到s0寄存器中
	add sp, sp, 16   ; 将栈指针加上16,回收栈空间
	jr ra            ; 从ra寄存器中取出返回地址,跳转到该地址


 

...全文
29 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
嵌入式系统开发圣经 大小为42M的书,给你提供详细的嵌入式开发知识,是学习的好资料 本书特色:详细的理论讲解,让你全面了解当前嵌入式开发系统的发展趋势。以信息家电、智能型手机、PDA产品为出发点,广泛深入地分析相关的嵌入式系统技术。适用于产品主管、系统设计分析人员及欲进入该领域的工程师。是一本开发嵌入式系统产品必备的入门圣经,进入嵌入式系统领域的宝典。 目录: 第1章 嵌入式系统的介绍 1-1 嵌入式系统概述 1-1-1 嵌入式系统的组成 1-1-2 典型的嵌入式系统 1-1-3 嵌入式系统的发展趋势 1-2 信息家电 1-2-1 信息家电的兴起 1-2-2 信息家电的产品 1-2-3 信息家电的研发状况 1-2-4 信息家电的未来 1-3 入门必学 1-3-1 系统集成能力 1-3-2 程序语言编写能力 1-3-3 市场应用导向 1-4 未来展望 1-4-1 集成服务导向 1-4-2 轻薄小型人性化 1-4-3 软硬件网络无线集成 1-4-4 创意产生与实现 1-5 本书导读 第2章 嵌入式SoC硬件系统概论 2-1 嵌入式系统微处理器的发展 2-1-1 4位以及8位嵌入式系统微处理器 2-1-2 16位以上的嵌入式系统微处理器 2-1-3 协同微处理器(Co-processor) 2-1-4 CISC与RISC 2-1-5 数字信号处理器(Digital Signal Process-DSP) 2-1-6 超长指令集微处理器(VLIW) 2-2 SoC嵌入式系统微处理器 2-2-1 什么是SoC嵌入式系统微处理器 2-2-2 SoC微处理器的设计开发 2-2-3 RISC结合DSP的SoC嵌入式系统微处理器 2-2-4 快速的SoC嵌入式系统微处理器设计与制造 2-3 ARM公司ARM RISC架构微处理器 2-3-1 ARM RISC嵌入式系统微处理器简介 2-3-2 ARM 7 Thumb嵌入式系统微处理器系列 2-3-3 Thumb指令集 2-3-4 ARM 9 Thumb嵌入式系统微处理器系列 2-3-5 ARM 10 Thumb嵌入式系统微处理器系列 2-3-6 ARM RISC嵌入式系统微处理器的应用 2-3-7 相关数据查询 2-4 Intel公司StrongARM微处理器 2-4-1 StrongARM架构 2-4-2 SA 1110/SA 1111模拟实验版 2-4-3 StrongARM嵌入式系统微处理器的应用 2-4-4 参考数据 2-5 德州仪器公司TMS320 DSP微处理器 2-5-1 TMS320 DSP微处理器简介 2-5-2 德州仪器公司C5X DSP微处理器系列 2-5-3 德州仪器公司C6X DSP微处理器系列 2-5-4 德州仪器公司TMS320DM310 DSP微处理器 2-5-5 DSP微处理器的应用 2-5-6 参考数据 2-6 Philips公司Trimedia微处理器 2-6-1 简介 2-6-2 Trimedia微处理器架构 2-6-3 软件开发工具 2-6-4 TM-1300模拟实验版 2-6-5 TM-1300嵌入式系统微处理器应用 2-6-6 参考数据 2-7 德州仪器公司OMAP架构微处理器 2-7-1 OMAP简介 2-7-2 OMAP架构 2-7-3 OMAP程序开发 2-7-4 OMAP微处理器在多媒体上的应用 2-8 Intel公司XScale架构微处理器 2-8-1 XScale微处理器简介 2-8-2 XScale微处理器硬件架构 2-8-3 XScale微处理器应用产品开发(PCA) 2-8-4 XScale微处理器-PXA210/250 2-8-5 参考数据 2-9 其他常见高端的嵌入式系统微处理器 2-9-1 MIPS RISC嵌入式系统微处理器 2-9-2 Hitachi SH系列嵌入式系统微处理器 2-9-3 Motorola嵌入式系统微处理器 2-9-4 Intel嵌入式系统微处理器 2-9-5 STMicroelectronics嵌入式系统微处理器 2-9-6 AMD嵌入式系统微处理器 2-9-7 三菱嵌入式系统微处理器 2-9-8 富士通嵌入式系统微处理器 2-10 存储器 2-10-1 可编程只读存储器 2-10-2 随机存储器(Random Access Memory) 2-11 通信接口 2-11-1 IEEE 1394 2-11-2 USB 2-11-3 红外线 2-11-4 蓝牙模块(Bluetooth) 2-11-5 IEEE 802.11 2-12 输出与输入装置 2-12-1 触摸屏 2-12-2 LCD显示器 2-13 扩展装置 2-13-1 PCMCIA扩展装置 2-13-2 CF扩展装置 2-13-3 SD扩展装置 2-13-4 Memory Stick 2-13-5 Springboard 2-14 便携式嵌入式系统电源系统 2-14-1 便携式嵌入式系统电源的要求 2-14-2 智能型电池系统 2-15 小结 第3章 嵌入式系统软件开发 3-1 嵌入式系统基本概述 3-1-1 系统规划与设计 3-1-2 开发平台与目标平台 3-1-3 开发环境与开发流程 3-2 开始您的第一步 3-2-1 目标平台 3-2-2 下载程序 3-2-3 开发考虑 3-3 嵌入式操作系统 3-3-1 操作系统的基本运作 3-3-2 开机 3-3-3 执行应用程序 3-3-4 系统移植 3-3-5 选择一个嵌入式操作系统 3-4 嵌入式软件的开发流程 3-4-1 系统开发 3-4-2 编译 3-4-3 链接 3-4-4 重新定位 3-4-5 下载 3-5 沟通软件与硬件的桥梁 3-5-1 由说明书认识硬件组件 3-5-2 驱动程序的编写 3-5-3 中断与异常处理 3-6 调试技术 3-6-1 仿真软件 3-6-2 目标平台上的调试 3-6-3 硬件辅助调试 3-7 您必须了解的事情 3-7-1 常见的错误处理 3-7-2 程序技巧 3-8 总览 第4章 信息家电软件的大趋势 4-1 多采多姿的Java世界 4-1-1 Java的概念 4-1-2 Java世界 4-1-3 企业版J2EE 4-1-4 标准版J2SE 4-1-5 袖珍版J2ME 4-1-6 Java Card 4-1-7 小结 4-2 移动装置的Java Virtual Machine-KVM(K Virtual Machine) 4-2-1 KVM的由来 4-2-2 KVM移植技术 4-2-3 KVM验证 4-2-4 小结 4-3 移动设备上的开发套件-MIDP 4-3-1 Java与无线通信 4-3-2 MIDP的由来 4-3-3 MIDP开发环境 4-3-4 MIDP开发实例 4-3-5 MIDP的移植 4-3-6 小结 4-4 Symbian Java Phone 4-4-1 Java Phone架构 4-4-2 JTAPI 4-4-3 应用实例 4-4-4 小结 4-5 Jini 4-5-1 Jini的架构 4-5-2 Jini的移植 4-5-3 小结 4-6 电信服务i-Mode与i-appli 4-6-1 i-Mode通信系统 4-6-2 Compact HTML 4-6-3 Java Enabled i-mode:i-appli 4-7 Java Chip让Java飞起来 4-7-1 Java Chip的诞生 4-7-2 各家的JavaChip 4-7-3 小结 4-8 总结 第5章 Smart Handheld Device软件系统设计 5-1 前言 5-2 嵌入式操作系统基本概念 5-2-1 嵌入式操作系统 5-2-2 软件组件 5-3 PDA产品面面观 5-3-1 Palm-PDA的创作先驱 5-3-2 WinCE Pocket PC多媒体的佼佼者 5-3-3 我国嵌入式操作系统发展概况 5-3-4 PDA发展趋势 5-4 针对产品定义选择系统软件 5-4-1 基本技术比较 5-4-2 产品应用 5-5 Symbian Platform:典型的智能型手机系统设计 5-5-1 功能结构介绍 5-5-2 GTv6基本组件 5-5-3 Framework 5-5-4 通信与网络 5-5-5 应用层 5-5-6 Java Phone 5-5-7 新一代智能型手机 5-5-8 持续创新的Symbian OS v7.0 5-5-9 系统开发环境 5-6 嵌入式Linux相关技术 5-6-1 嵌入式Linux概述 5-6-2 工作评估 5-6-3 Linux目录结构 5-6-4 工具链(Toolchain) 5-6-5 内核配置 5-6-6 编译内核 5-6-7 雏型板测试 5-6-8 选择嵌入式Linux图形接口 5-6-9 自己动手做Linux Based iPAQ 5-7 结束语

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧