#include <asm/mipsregs.h>
#include <asm/regdef.h>
#include <asm/asm.h>
.set mips32r2 //设置mips32r2指令集
.set noreorder
默认汇编器处在reorder的模式下,该模式允许汇编器对指令进行重新排序,以避免流水线堵塞并获得更好的性能,在这种模式下,是不允许在代码中插入 nop指令的。反之,在noreorder模式下,指令的顺序不会被改变也不会对代码进行任何优化。这样做的优点是程序员可以完全控制代码的执行顺序,缺点是必须手工对指令排序,并在分支和加载指令的延迟槽中填上有用的指令或nop指令.比如:
.set noreorder
lw t0, 0(a0)
nop #加载指令延迟槽
sub t0, 1
bne t0, zero, loop
nop #分支指令延迟槽
.set reorder
.global exception_entry //全局函数
.global exception_handlers
/*
* 设置cp0可访问,其实应该不用设置
* 设置为kernel mode
* 非reset模式,异常可响应,但中断不能响应
*/
.macro CLI
mfc0 t0, CP0_STATUS
li t1, ~(ST0_IE | ST0_EXL | ST0_ERL | ST0_KSU)
and t0, t1
li t1, ST0_CU0
or t0, t1
mtc0 t0, CP0_STATUS
sll zero, zero, 3
.endm
整段类似于define
用.MACRO指令你可以定义一个宏,可以把需要重复执行的一段代码,或者是一组指令缩写成一个宏,在
程序调用的时候就可以直接去调用这个宏而使代码更加简洁清晰,此宏由以下3部分构成:
1. 头: 在这里可以指定这个宏的名称,别且定义形式参数
2. 体: 这里包含的是当这个宏被调用时所需要执行的指令或者语句。
3. 尾: 这里用.ENDM标识着这个宏的结束。
/*
* 设置cp0可访问,其实应该不用设置
* 设置为kernel mode
* 非reset模式,异常可响应,中断可响应
*/
.macro STI
mfc0 t0, CP0_STATUS
li t1, ~(ST0_EXL | ST0_ERL | ST0_KSU)
and t0, t1
li t1, ST0_IE | ST0_CU0
or t0, t1
mtc0 t0, CP0_STATUS
sll zero, zero, 3
.endm
/*
* 保存与cpu现场相关的32个通用寄存器+4个cp0寄存器
*/
.macro save_context_registers
.set noat
.set noreorder