![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
从汇编层看计算机
介绍汇编层面看计算机的架构。
十三香炖猪肉
当我用关爱智障的眼神看您时,您也正用关爱智障的眼神看我。
展开
-
ARMV7-M 的栈空间
通常,寄存器R4~R8(V1~V5),R10(V7)和R11(V8)被用来保持常规的局部变量。通常,寄存器R4~R8(V1~V5),R10(V7)和R11(V8)被用来存储局部变量。栈的生长方式为:向下生长(即:栈底高地址,栈顶低地址),栈顶地址存放在SP(R13)寄存器中。栈的实现方式为,向下生长,当前栈顶指针存放在SP(R13)寄存器中,通常栈空间由栈底和栈长度决定,但是应用程序不保证SP指针在它俩之间。子程序返回后,必须保证下列寄存器的值,与刚进入该函数时相同:R4~R8,R10,R11和SP。原创 2024-07-15 22:31:08 · 224 阅读 · 0 评论 -
ARMV7-M 的例外和启动流程
我个人见过的硬件设计,系统上电 全都伴随着复位,因此 ARMV7-M 上电启动后,会触发复位例外,内核也许会装模作样的现场保护(也可能做了特殊处理,装都不装一下),然后到中断向量里取得 Reset 例外的入口地址,放入程序计数器(PC),然后取指,程序就运行起来了。ARMV7-M 的例外处理流程是:如果例外无法屏蔽(非屏蔽中断)或者没有屏蔽(可屏蔽中断),例外触发后,首先进行现场保护,然后根据例外编号到中断向量里找到相应中断入口地址,放入PC寄存器。修改 VTOR的值,就可以改变中断向量的值。原创 2024-07-11 22:18:45 · 199 阅读 · 0 评论 -
ARMV7-M 的两个栈顶寄存器
在“线程模式”下,R13对应的物理寄存器,由 CONTROL.SPSEL 决定,当 CONTROL.SPSEL == 0 时,使用MSP;栈顶指针(SP),分为主要栈寄存器和进程栈寄存器。当前的栈依赖运行模式,在线程模式下由CONTROL.SPSEL 来决定,复位完成后默认使用 PSP。由于ARMV7-M复位后运行在“线程模式”下,且 CONTROL.SPSEL == 0,因此,ARMV7-M复位后R13对应的物理寄存器是 MSP。),因而此时,R13对应的物理寄存器是MSP。原创 2024-06-30 22:53:47 · 211 阅读 · 0 评论 -
ARMV7-M 的工作模式和特权等级
以上是说:线程模式(Thread mode)是ARMV7-M 的复位后的运行模式。线程模式又分为“用户等级”(直译“无特权级”,unprivileged)和“有特权级”(privileged)。线程模式下可以使用SVC指令,来触发 SVCall 例外,该例外能将运行模式改为“管理者模式”(Hander mode);由上表可以知道,只有当线程模式下且CONTROL.nPRIV == 0时,ARM内核处于“无特权级”。CONTROL.nPRIV 用来配置,线程模式下内核的特权等级。原创 2024-06-25 22:39:01 · 341 阅读 · 0 评论 -
ARMV7-M 核心寄存器的约定用法
R0~R1:函数返回时,存放函数返回值。当返回值的长度小于32位时,放在R0中,当返回值的长度超过32位不超过64位时,第32位放在R0,高32位放在R1。R9(SB、TR)、R11(FP)、R12(IP),看起来好像也有约定的用法,但是没太看懂要怎么用,如果有这方面的专家,欢迎留言指教。当C去调用一个汇编函数时,也一样,C会把参数放到R0~R3,函数返回后读取R0和R1来获取返回值。R13(SP):栈顶寄存器,指向栈顶元素的地址(此处要注意:是栈顶元素,不是栈顶元素的下一个)剩下的寄存器,没有约定用法。原创 2024-06-24 21:52:03 · 237 阅读 · 0 评论 -
内核入门——4 龙芯架构——4.2 ~ 4.
本文,包括《龙芯架构参考手册》,在介绍中断、例外时,还会用到一个概念,就是“指令的PC值”。唯一能确定的是进入例外、中断后,“指令的PC值”所指向的指令,并没有执行,例外、中断返回后,需要重新取指。由于流水线结构的存在,这个“当前指令”是“当前取指的指令”,还是“当前译码的指令”,或者是“当前执行的指令”。如果是例外,就比较麻烦了,因为例外可以发生在取指阶段,也可以发生在译码阶段,还可以发生在执行阶段,所以发生例外“指令的PC值”,不一定是当前的PC值,由于跳转指令的存在,不能肯定就是PC值减去一个常数。原创 2023-08-18 18:09:47 · 313 阅读 · 1 评论 -
ARMV7 CortexM 协处理器
ARMV7一共定义了编号0到15,共16个协处理器,分别命名为CP0到CP15。CP8到CP15为ARM保留使用;CP0到CP7为各厂家自定义。协处理器CP10和CP11用于 ARMV7-M的浮点扩展。一个支持浮点的ARMV7-M核心,应能访问CP10和CP11。所以,由于ARMV7-M 没有CP14,因此ARMV7-M 不会有CACHE,也不会有性能监控、MMC等等。的 ARMV7-M 有协处理器 CP10 和CP11。浮点 ARMV7-M 没有协处理器。原创 2024-06-23 22:13:50 · 109 阅读 · 0 评论 -
ARMV7的通用寄存器(核心寄存器、Core Register)
单就通用寄存器而言,可以分为两类:CortexA和CortexR是一类;CortexM是另一类。ARMV7 分为三类:CortexA、CortexR和CortexM。图1 CortexA和CortexR 的通用寄存器。图2 CortexM的通用寄存器。原创 2024-06-20 22:22:06 · 236 阅读 · 0 评论 -
内核入门——4 龙芯架构——4.1 龙芯架构的地址分布
可以看出来,通用寄存器,是其余各部件之间数据转移的中介。除了通用寄存器、浮点寄存器、外部存储三者之间可以互相直接转移数据,其余部件之间要转移数据,必须通过通用寄存器。如图 4‑1,方框表示独立编址的部件,箭头表示数据流。4‑1 龙芯架构的地址分布和数据流。原创 2023-08-15 21:19:23 · 125 阅读 · 0 评论 -
内核入门——3.4一切至少有一个地址
从汇编语言的角度,所有的部件(或存储),不管内部还是外部,都会有至少一个地址。通常设计时,还会对这些部件(或存储)分成几类,每一类都独立编址。计算机从逻辑上是分层,通常底层给上层提供接口,上层只负责调用底层提供的接口,无需知晓实现细节。独立编址是说,每一类的部件(或存储)的地址都分别从0开始递增,并分别用不同的指令访问。原创 2023-08-15 21:16:32 · 54 阅读 · 0 评论 -
内核入门——外设不一定在芯片外面
大体而言,CPU从存储器或高速缓存Cache中取出指令,放入指令寄存器,对指令进行译码,执行,再将指令结果(不是每条指令都会有写回)写回存储器或Cache中,运行大致可以分为四个阶段:取指(Fetch Instruction),译码(Decode Instruction),执行(Execute),写回(WriteBack)。在芯片设计过程中,通常会将内核与外设集成在同一个芯片中,此时,虽然内核、外设在同一个芯片上,但是再内核看来,外设依然在外面,所以依然是外设。通常情况下,“内”与“外”都是内核视角的。原创 2023-08-15 21:15:26 · 189 阅读 · 0 评论 -
内核入门——3.2汇编
(计算机体系结构的发展,指令端出现了微代码,汇编出现了宏代码,大体上仍然是一一映射的,只是不再是单指令的一一对应而已)。据我所知(在哪看的忘了),最早的汇编,跟机器码是严格一一映射的关系。基本就是:把机器码中的操作码,起一个人类好记的名字,通常是一个英语中的动词——助记符。由助记符和寻址方式,确定了一条汇编指令。除了极少量指令指令,绝大多数汇编指令,都有确定的寻址方式,只不过有的寻址方式,是显式的(比如加法指令),有的寻址方式是隐式的(比如中断返回指令),有的寻址方式是显式 + 隐式(比如相对跳转指令)。原创 2023-08-15 21:14:34 · 37 阅读 · 0 评论 -
内核入门——3.1机器码
比如有孔的地方表示1,没孔的地方表示0,计算机运行的程序,就是这一系列的0和1组成的二进制数串。但是我要说,工业标准摆在那里,也许不是最好的,你非要在工业标准之外圈地自萌,让大家重新习惯你的标准,当然也不是不可能成功,除非你的东西不可替代,否则成功概率很小。因为存在立即寻址方式(指令中包含操作数本身),所以这里的是地址,而不是地址码,再强调一次,操作数的地址,可以是地址码,也可以隐含在操作码里。字节,是计算机单次操作数据的最小单位,计算机单次操作的数据,必然是字节的整数倍。的机器码,是4个字节。原创 2023-08-15 21:13:03 · 60 阅读 · 0 评论 -
内核入门——名词解释
Virtually Address Length虚拟地址的位宽。Physical Address Length物理地址的位宽。本文中提到的自然数包含0,是0和正整数的并集。2.1 自然数。原创 2023-08-15 21:09:54 · 67 阅读 · 0 评论 -
内核入门——前言
当然,也没必要吧以上课程都很精通,只要能做到:遇到某个概念,知道在那本书里找,翻开目录后,知道在那一节,就行了。原创 2023-08-15 21:07:55 · 77 阅读 · 0 评论