汇编代码解析

本文详细解析了MIPS汇编代码,包括设置mips32r2指令集、使用noreorder模式以控制指令执行顺序、宏定义以及异常处理函数。通过CLI和STI宏来设置CPU状态,同时展示了保存和恢复上下文寄存器的宏。异常处理总入口exception_entry调用异常处理函数,如handle_int,其中涉及中断处理、任务切换和FPU状态管理。
摘要由CSDN通过智能技术生成

#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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c2h5oh2012

有用记得给点打赏yo

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值