汇编语言与计算机系统结构笔记18】MIPS指令集与汇编程序设计 & 异常处理

MIPS中的异常处理和系统调用 本文介绍mips体系结构中异常处理机制,并详细分析了系统调用异常的实现。 阅读详情

本次笔记内容:
28.MIPS指令集与汇编程序设计-2
补充:MIPS32异常处理

注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库。

本节课对应幻灯片:汇编语言程式设计-MIPS.pdf,第49页起。

在B站视频中,缺了一节课,即 ‘MIPS32异常处理’ ,感谢 UP 主 东南偏南2018 做的补充:汇编语言程序设计(清华大学张悠慧)P27。

我们讲 MIPS32 ,主要集中在其特色部分。

文章目录

 

P49 定长指令造成了一些困扰


如上。某些操作数的限制(如立即数宽度)增加了汇编编程难度。为降低难度,MIPS汇编器会做一些预处理。

如上,at 寄存器保留给汇编器专用,就用在了这里。因此一般情况下不要手动使用。

对于 li $3, -5 ,其意义其实就是因为 -5 不大,www.rsxedu.com因此直接用 addiu 装到 $3 中。

对于 li $4, 0x8000 正好放得下 16 位中,因此转换的方法较多,这里转换为 ori 或指令 ,是可以的。

对于 0x120000 ,把 12 拿出来,放到高 16 位对应的位置,低 16 位清零。

对于 0x12345 ,对于低 16 位不全为 0 的,转换为两条指令 lui 与 ori 。


在如上的例子中,对于第三条 lw $2, addr ,这个数宽度较大,至少得把这个指令拆成两条:

  • %hi 相当于汇编中的宏,取高的半字(16位);
  • %lo 则是取低的半字。

对于 sw $2, addr($3) ,在基址上加上偏移。

P51 指令编码


三种类型:I-Type、J-Type、R-Type。


Op 段编码如上。其他段编码不再复制,详见 ppt 。

最终,我们要把段编码总结成一个真值表,www.meimeitu8.com以此构建电路、控制信号。

P58 MIPS汇编指示(Directives)


注意这里的 word 是 32 byte 。

.data 是一般的数据段,存了 3 个 word ,初值分别是 1,2,3。

.text 定义了 func 的入口地址。

.bss 非初始化的变量在其中,还分为全局可见的和 local 。与 x86 类似。


数据类型定义如上。


这个 .extern 与 C 中的不太一样。

比如,对于 lw "offset" ,偏移量 16 位宽可能不太够。假设地址不够,我们可以如之前一样,换成 2 条指令。但是这样太麻烦了,MIPS32做了简化:

  • 有一个全局指针$gp;
  • 程序初始化时,$gp已经初始化好;
  • 我们把全局变量放在$gp附近,这样只要变动$gp一点,就可以访问全局变量了。
  • 相当于$gp是个轴base。

因此,用 .extern 定义了全局变量,让其在 $.gp 上下 64 byte 范围。

示例一:分别计算整数数组中正数、负数的和




先声明数据段;遍历一遍数据段;进入 main 。

这里的 syscall 是模拟器提供的 syscall 。在 SPIM 这么简单的一个模拟器中,做不到一个模拟一个 OS ,只是做了一个模仿。

这里与计组的“控制冲突”结合起来了,在跳转jal后要有nop或无关指令用于 delay slot 。

接着,老师操作了 SPIM 。

示例二:阶乘(delay slot关闭)




如上,在模拟器中还是尊重了MIPS的规范,建立了一个栈帧。

如上,把栈顶的地址$sp向下拉了 32 。

MIPS32异常处理

关于同步异常需要自己看 ppt 了解。

异步异常(中断)

由“外部事件”引起,往往是外设触发。如:IO中断、Hard Reset、Soft Reset。

重新执行当前指令或者下一条指令。

异常处理向量(Vectors)


每类异常都有其编号以及异常处理入口地址,往往在内存中构成一张地址表。所以称之为向量。

精确异常处理(MIPS支持)

精确异常指的就是——在处理异常时,产生异常指令之前的指令都应执行完毕;该指令之后(包括该指令本身)的指令则都不处理。

  • 需要精确记录异常的位置(指令)
    • Branch Delay Slot
  • 需要取消后续指令
  • 需要正确恢复执行

MIPS32的异常种类



MIPS异常处理基本过程

其实比较复杂,这里讲一个通用的情况。

  • 保存现场——在异常程序入口,硬件只记录了被打断程序的很少量的信息,因此需要保留相关的控制寄存器等值使得异常处理程序能够执行(k0 、k1寄存器专门保留给异常处理使用);
  • 判断不同的异常——查询Cause寄存器,根据其不同的异常原因来进行不同的处理流程;
  • 构造异常处理内存空间——异常处理程序可能由高级语言书写,需要保留通用寄存器,构造堆\栈存储区(可选);
  • 处理异常——……
  • 返回——恢复寄存器,清零Cause寄存器,将Status寄存器的相关位置1以开中断。

异常返回

一般而言,异常处理代码工作在核心态,而被中断的程序是在用户态,所以异常返回意味着状态转换。

◦ 这个转换与指令返回必须“同时”完成,即用一条指令完成。

  • 为什么?加入一个当前程序是工作在核心态,标识位核心态;如果先把核心态标识去掉,变成用户态;后面再执行核心态的 ERET 指令,这就非法了。

ERET指令:

  • 返回EPC指向的地址:一般来说 EPC 或 EPC-4 是被中断的那个地址
  • Status寄存器修改

中断

中断是异步发生的,是来自处理器外部的I/O设备的信号引发的。

硬件中断不是由任何一条专门的指令造成的:

  • I/O设备,比如网络适配器,磁盘控制器等通过处理器芯片上的一个引脚发送信号,并将中断号放到系统总线上,用来触发中断,这个异常号标识了引起中断的设备。

MIPS处理器的中断控制设计

在中断发生时,如果指令已经完成了 MEM 阶段的操作,则需保证该指令执行完毕。

反之,则丢弃这条指令的工作。

除 NMI 外,所有的内部或外部硬件中断(Hardware Interrupt)均共用这一个异常向量(Exception Vector)。

P84 嵌套异常比较复杂,不细讲。

SPIM模拟器支持的异常处理流程

SPIM实现了部分CP0寄存器。

异常中断后,如果能够正常返回之前的指令,那么返回的地址存储在 EPC 中。

Status寄存器


SPIM 实现了 Status 寄存器的部分功能。

Cause寄存器

用于记录发生异常的原因。

Branch 来决定返回的指令地址是 EPC 还是 EPC-4 。

异常处理实例

这节课也给大家留了一个作业,关于异常处理。



为什么不存储在栈上?

因为问题可能出现在栈上,因此现在不能相信栈。

为什么把 Cause 右移两位?见 Cause寄存器 结构。

老师用 SPIM 做了些演示。

计算机三级嵌入式笔记(二)——嵌入式处理器 内核系列推出公司内核结构简单描述51IntelCISC哈佛结构8位字长,最早被称为单片机。其价格低,应用资料全,开发工具便宜,开发周期短,开发成本低,被广泛应用。AVRAtmelRISC哈佛结构8位、16位和32位三类字长的微控制器内核,主要特点是高性能、高速度、低功耗。PICMicrochipRISC哈佛结构8位、16位和32位三类不同字长的RISC微控制器内核。主要针对工业控制应用领域,应用最广的是电机控制、汽车电子等抗干扰要求比较高的场合。 阅读详情

相关推荐

【计算机组成】MIPS指令集介绍和MIPS模拟器使用

文章目录MIPSsim下载和使用Mars下载和使用 学习计算机组成,不学汇编语言,等于白学。对我来说,相当于把以后学的汇编课程移到现在开始学。 学习汇编的好处在于: 有助于深刻理解计算机的软硬件接口,理解编程语言的底层; 汇编的助记语法差不多,因此学了一门,其他种类就很容易吸收了。 我的目标是学3门汇编语言,分别是Computer Organization and Design: The Ha...

memcpy0的博客 3002

mips异常和中断

在mips体系结构中,中断、陷阱、系统调用和任何可以中断程序正常执行的情况都称作异常。mips的异常是精确异常,在发生任何异常时都指向一条指令,所有这条异常指令之前的指令都执行完成了,所有这条指令之后的指令都还没开始执行。 异常种类 异常相关寄存器: k0,k1 :通用寄存器,异常处理函数可以将异常返回地址放到这两个中的任何一个,然后使用jr跳转到造成异常的指令处继续执行。 SR :cp...

shliushliu的博客 5218

MIPS指令集:条件分支与异常处理详解

本文深入探讨了MIPS架构中的条件分支指令及其用法,包括比较和跳转指令以及如何处理特定的处理器异常。通过分析具体的指令示例,我们将理解如何在编程中实现条件逻辑,并且了解异常处理程序的构建与执行。...

weixin_35752122的博客 765

MIPS指令集及汇编

MIPS指令集及汇编 由于本人最近在看底层操作系统与汇编的有关书籍,故写此博文总结,以便后续本人及感兴趣朋友阅读。如有错误恳请指出,一起学习,一起进步!   目录 MIPS指令集及汇编 一、MIPS简介: 二、MIPS体系结构 1.寄存器特点: 2.整数乘法单元和寄存器 3.寻址方式 4.存储器和寄存器中的数据类型 三、MIPS指令与汇编 1.指令格式 2.寻址方式 3.指令...

老6 2万+

[QDS]从零开始,写第一个Qt Design Studio到程序调用的项目

最近在使用Qt Design Studio进行开发,但是简中网上要不就是只搜得到Qt Designer(Qt Creator内部库),要不就只搜得到一点营销号不知道从哪里搬来的账号,鉴于Qt Design Studio是一个这么强大的软件,自然是需要来进行一下小小的实践的。所以开了这篇文章,方便没有使用过Qt Design Studio 和 QML的开发者也可以快速上手QDS(Qt Design Studio)。在本文中,你将学会如何使用QDS开发一个简单的QML程序,与你的C++后端代码进行交流。

Andius的博客 8211

Unity适配Nintendo Switch平台开发

查看文档、下载SDK,都需要账号登录。

凝遥的笔记本 2098

第六讲-MIPS异常中断处理

上岸

宝藏Coder的空间 638

Sentaurus TCAD 修改字体

如题

努力学习的IC小白 5759

深入浅出MIPS 四 MIPS的异常与中断

MIPS的异常和中断,同其他体系结构,例如Intel的IA32架构下的中断/调用门/陷阱机制类似,其目的主要有三: 一,提供一个合法地从用户态到内核态的切换通道,使得程序能够访问如CP0、KSeg等平时被保护的资源; 二,处理一些非法的操作,如TLB Miss/Address Error等; 三,处理外部和内部的中断。与IA32架构区别的是,所有的中断均来自0号Exception。

视频通信,图像处理,嵌入式Linux,高清 7791

CKAD-CN考试之路----12

显然,对应的value都已经实现了加密.保存退出,等待pod重新创建。确认secret是否被加密。编辑secret文件。

Q先生 444

Ghost卷积原理与构建YOLOv11的GhostNet变体

本文探讨了在边缘设备部署YOLOv11时使用Ghost卷积进行模型轻量化的实践经验。针对Jetson Nano的4GB内存限制,作者通过替换Backbone中的3x3标准卷积为Ghost卷积,实现了参数减少28%、推理速度提升38%,仅损失1.1%mAP的优化效果。文章详细介绍了Ghost卷积的实现原理、在YOLOv11中的具体替换策略,以及训练调参和部署优化的关键技巧。作者强调轻量化是计算效率与模型性能的权衡,建议工程团队保留原模型和Ghost变体两个版本,根据实际需求灵活切换。Ghost卷积的核心价值在

as1225120794的博客 169

【汇编语言与计算机系统结构笔记18】MIPS指令集与汇编程序设计 & 异常处理

MIPS32 汇编指示与异常处理,以SPIM模拟器运行为例。

记录学习痕迹的公众号:Piper蛋窝 1073

Qt/C++音视频开发1-vlc解码播放

一、前言 最开始接触视频监控这块的时候,用的就是vlc作为解码的内核,主要是因为vlc使用简单方便,直接传入一个句柄即可,简单几行代码就可以实现一个视频流播放,很适合初学者使用,也推荐初学者用qt+vlc来做播放器,提供的接口还是非常友好的,而且门类特别多,想要获取媒体文件的各种信息比如宽高,设置宽高比等,直接调用接口函数传入参数就能设置。 所有用vlc做视频监控解码的人都会遇到一个问题,那就是鼠标事件被接管拦截了,不能识别鼠标事件,比如双击最大化等,这就很憋屈了,明明很好用的一个东西,怎么突然之间鼠标事件

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 4937

Sparc汇编指令介绍

SPARC是CPU指令集架构的一种,其设计的目标是优化的编译和易用的流水线硬件执行。 SPARC指令集有以下主要特点:     1. 线性的32位地址空间     2. 精简的指令格式 所有指令都是32位宽和以32为分界对齐排列的。只有3个基本指令的格式--它们是非统一的操作数位置和寄存器地址域。特别要注意的是:只有load和store指令能访问memory和I/O。     3. 很少

Macross的专栏 1万+

一、适配显示服务

基于rk3568适配显示服务,调动gpu;

XiaoC_Android的博客 1001

【论文复现】——基于欧式聚类的车载点云道路提取

针对车载激光点云道路信息提取的问题,提出了一种基于欧式聚类的道路提取方法。首先通过统计滤波去除噪点以免对后续处理结果产生影响,然后用坡度滤波去除路坎点,使道路边界与人行道、绿化带等与路坎相连的地物形成10~25 cm的高程阶跃,最后用欧式聚类将路面点云与其他地物点云聚类为一簇或多簇并保留道路簇,从而实现道路点云的精确提取。

点云侠的博客 1134

汇编基础

push 1.sp = sp +2   2.入栈  POP  栈地址由 SS 和 SP 给出   计算方式:ss左移后加SP command 加载 debug  加载EXE LOOP标识符 要在LOOP 的前面。CS 先减1  再判断CS 是否=零 汇编源程序中  数据的开头不能是数字。 CPU 先识别code段 若code段地址为13FA 再识别stac

Hi 635

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MIPS指令与MIPS汇编语言

1 MIPS简介 MIPS是(Microcomputer without interlocked pipeline stages)的缩写,含义是无互锁流水级微处理器。MIPS采用的是精简指令系统计算结构(RISC结构)(与之对应的:(复杂指令集)CISC结构)。RISC比CISC的设计更加简单,由于其授权费用低,被INTEL外的大多数厂商使用。同时在设计理念上MIPS强调软硬件协同提高计算机性能,并简化硬件设计。 MIPS 是最早的,最成功的RISC处理器之一,MIPS处理器广泛的应用于:数字电视、

夜飘凌的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MIPS汇编练习

【问题描述】输入一个高精度的大正整数S(S最长可达240位),去掉其中任意N位数字后剩下的数字按原次序组成一个新的正整数S’。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数S’最小。 【输入形式】输入有两行: 1.第一行是大整数S。其中S最长可达240位。 2.第二行是整数N。S、N均以非0数字开头。 【输出形式】输出有一行,是在S中删除N位后所得的最小数字S’。 【样例输入1】 178

爱吃紫菜汤的懒小猪的程序小屋 1439

mips 异常处理

原文网址:http://blog.chinaunix.net/uid-26817832-id-3146385.html 一、硬件完成的工作 1、set epc 2、set EXL 表示进入内核模式和禁止中断 3、set cause寄存器;有的异常也需设置BadVaddr寄存器 4、跳到异常入口执行 二、软件工作 1、区分不同的异常,Cause寄存器的ExcCode域

junmuzi的专栏 2526

MIPS异常入口点

转自  : http://mips.eefocus.com/article/10-11/2467421291101225.html 异常向量:异常处理开始的地方 大多数CISC理器由硬件(或微代码)来分析异常,根据发生的异常类烈把CPU发送到不同的入口点。甚至连中断都根据哪个中断输入信号激活而在不同的入口点处理时,就叫做向量化中断(vectored interrupts)。历史上,MIPS C

LonlyGod的专栏 1907

32位汇编语言helloworld_MIPS架构深入理解7汇编语言理解

本章旨在帮助读者阅读MIPS汇编代码。本文中专注于32位MIPS指令集。本文主要的目标读者是习惯于C语言编程,但是,有时候不得不读懂一些汇编代码甚至做一些小范围的改动的开发者,比如操作系统移植时启动代码start.S文件的阅读与修改。如果想要深入研究汇编程序如何编写,请参考所使用的MIPS工具链的说明文档。阅读MIPS汇编代码,不仅仅需要熟悉各个机器指令,因为它还包括许多MACRO,这些...

weixin_39953244的博客 856

MIPS32 CPU 模拟器:深度探索与实践

MIPS32 CPU 模拟器:深度探索与实践 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个基于 JavaScript 开发的开源项目,它实现了 MIPS32 架构的指令集模拟器。此项目旨在帮助软件开发者、计算机科学学生和硬件爱好者理解计算机体系结构,特别是 MIPS(Microprocessor without Interlocked Pipelined St...

gitblog_00001的博客 516

MIPS 字节对齐问题

一,概述 在MIPS 体系结构中,正常的加载和存储必须对齐,半字必须从2个字节的边界加载,字必须从4个字节的边界取出,加载一个非对齐的地址会导致CPU 陷入异常。例如,lh 读取一个半字时,存储器的地址必须是2 的整数倍,lw读取一个字时,存储器的地址必须是4的整数倍,sd 写入一个双字时,存储器的地址必须是8 的整数倍。 Mips 提供非对齐访问的伪指令,uld, 在非对齐的地址上加载64位的数据。 Ulh 在非对齐的地址上加载半字。ulhu, ulw, usd, ush, usw。一条伪指...

u013076893的专栏 3247

【汇编语言程序设计 张悠慧老师】80X86计算机组织结构简述

目录 1.计算机系统 1.1总体概括(现细节已有改变) 1.2玩具程序helloworld的执行步骤 1.2.1 将程序从磁盘装载到内存中 1.2.2 CPU将指令逐条读入,一遍读取一遍执行 1.2.3.CPU对显卡进行操作然后输出 2.存储器主存 3.80X86处理器与保护模式 3.1 8086/8088 3.2 80186/80286 3.3 80386 3.3.1 简介 3.3.2三种工作模式 3.3.3 保护模式下的80X86 3.3.4 内存地址的组成 3.3.5.

Edidaughter的博客 500

汇编语言程序设计 张悠慧老师】第5讲 80X86汇编语言与C语言-1

1.汇编程序员眼中的系统结构

Edidaughter的博客 621
下一篇: Java RMI机制讲解
陈萍萍儿
博客等级 码龄5年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值