mips中的la指令

在pmon中判断当前的代码是在flash中运行,还是在ram运行如下:

bal locate /* Get cruuent execute address */
nop

uncached:
or ra, UNCACHED_MEMORY_ADDR
j ra
nop

locate:
la s0,uncached
subu s0,ra,s0


在这里我们假设uncached相对于代码开始的偏移为offset1,locate相对于代码开始的偏移为offset2。

现在我们是从spi-flash中启动,所以PC的地址是从0xbfc00000开始的,而代码链接的时候,地址则是从0x80100000开始的。

那么执行“bal   locate”跳转到“locate“之后,ra寄存器里的值是绝对地址的==(0xbfc00000+offset1),

而“la   s0,uncached”之后,s0==(0x80100000+offset1)。

所以再执行“subu   s0,ra,s0”之后,就可以算出链接代码与实际执行代码的偏移,这样当用到rdata段数据的时候,用标号的地址加上这个偏移就可以得到在spi-flash的数据。


总结:

la      寄存器,标号  ---->寄存器得到的是标号相对于链接地址的值;

而bal之后的ra寄存器保存的是当前存储介质的绝对地址。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MIPS的div指令是用于进行除法运算的,其具体格式为: ``` div rs, rt ``` 其,rs和rt是两个需要进行除法运算的寄存器。当执行div指令时,将rs寄存器的值除以rt寄存器的值,商存放在HI寄存器,余数存放在LO寄存器。 需要注意的是,当进行除法运算时,如果除数为0,会发生除数异常(Divide-by-zero Exception),程序会终止。为了避免这种情况,可以先进行除数是否为0的判断。 下面是一个MIPS汇编程序的例子,演示了如何使用div指令进行除法运算: ``` .data num1: .word 10 num2: .word 3 .text .globl main main: lw $t0, num1 # load num1 into $t0 lw $t1, num2 # load num2 into $t1 beq $t1, $zero, divide_by_zero # check if $t1 is zero, if it is, jump to divide_by_zero div $t0, $t1 # perform division, store quotient in HI, remainder in LO mfhi $t2 # move quotient from HI to $t2 mflo $t3 # move remainder from LO to $t3 li $v0, 1 # load system call for print int move $a0, $t2 # move quotient to $a0 for printing syscall # print quotient li $v0, 4 # load system call for print string la $a0, newline # load newline string for printing syscall # print newline li $v0, 1 # load system call for print int move $a0, $t3 # move remainder to $a0 for printing syscall # print remainder li $v0, 10 # load system call for exit syscall # exit program divide_by_zero: li $v0, 4 # load system call for print string la $a0, error # load error message string for printing syscall # print error message li $v0, 10 # load system call for exit syscall # exit program # data section newline: .asciiz "\n" error: .asciiz "Divide-by-zero Exception!" ``` 这个程序将两个整数num1和num2进行除法运算,并输出商和余数。如果num2为0,将会输出错误信息并退出程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值