囫囵学汇编

1 篇文章 0 订阅
1 篇文章 0 订阅

关于本文

最近在看U-Boot的代码,本文主要是记录下学习笔记,如果碰巧还能帮到你就更好了。 以下内容部分来自chatgpt,如寄存器的解释,请谨慎参考。

MIPS汇编

按我的理解,汇编语言就是机器语言的助记符,可以由汇编器汇编成为机器码。不同平台(arm、mips、x86)的汇编语言是不一样的,故而所用的汇编器也不一样。GNU汇编是GNU提供的汇编器支持的语法,有平台无关的,也有特定平台的,目前我只知道他的伪指令和原生汇编会不太一样,其他语法的不同以后知道再补充吧。

代码片段一

.set noreorder
.macro init_wr sel
MTC0	zero, CP0_WATCHLO,\sel
mtc0	t1, CP0_WATCHHI,\sel
.endm

.set noreorder

这是mips平台的特殊用法,和一般的.set symbol, expression的通用语法不同。
某些平台(如alpha、mips)的GNU汇编器可以重新排列指令,以优化执行效率。但是在某些情况下,指令的顺序可能是很重要的,需要保证指令的执行顺序。这时使用 .set noreorder 指令告诉编译器不要对之后的指令进行重排。

.macro

.macro是GNU提供的伪指令,是用于定义宏的。语法如下

.macro macname macargs ...
...
.endm

macname是宏名,macargus是参数(可以用=赋缺省值),在宏体里面用到参数在前面加\,.endm是结束标志。

MTC0

MTC0
MIPS的MTC0(Move To Coprocessor 0)指令是用于将数据从通用寄存器(GPR)移动到协处理器0(CP0)寄存器的指令。语法如下:

MTC0 rt, rd, sel

MTC0指令的作用是将rt寄存器的值复制到由rd和sel组合指定的协处理器0寄存器中。不是所有的协处理器0寄存器都有sel域,这时sel必须设置为0。由于MIPS处理器的CP0寄存器中存储了许多控制和状态信息,因此MTC0指令通常用于系统级编程,例如操作系统内核开发。 如果在用户态,使用MTC0指令会导致处理器产生异常

zero

zero 它是通用寄存器 $0 的别名。在 MIPS 处理器中,通用寄存器有 $0 至 $31 共 32 个,其中 $0 寄存器的值始终为 0,因此也被称为 zero 寄存器。需要注意的是,zero 寄存器不能被修改,因为任何试图将值写入 $0 寄存器的操作都会被忽略。

CP0_WATCHLO

在mipsregd.h里面定义了

#define CP0_WATCHLO $18
#define CP0_WATCHLO $19

在这里插入图片描述

$18是协处理器0(CP0)中的一个寄存器,用于设置和管理处理器的监视功能。$18寄存器是监视寄存器的低位寄存器,用于设置监视点的地址和触发条件。$19寄存器包含限定$18寄存器中指定的虚拟地址的信息:ASID、G(全局)位、可选的地址屏蔽和三个位(I、R和W),用于表示导致监视寄存器匹配的条件。$18和$19寄存器一起提供了一个监视点调试功能的接口,如果一条指令或数据访问匹配寄存器中指定的地址,则会触发监视点异常。因此,它们复制了EJTAG调试解决方案的某些功能。总的来说,就是调试、中断相关的寄存器。

等待更新

参考

MIPS架构之start.s汇编分析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值