mips bal和la 分别对ra和寄存器值的区别

原创 2012年12月17日 16:10:55

在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寄存器保存的是当前存储介质的绝对地址。

相关文章推荐

mips指令简单入门

MIPS Architecture and Assembly Language Overview MIPS架构及其汇编初步   (开始之前稍微再提下,整体分为4个结构:)   ...

mips中的la指令

在pmon中判断当前的代码是在flash中运行,还是在ram运行如下: bal locate /* Get cruuent execute address */ nop uncached: ...

MIPS中的跳转/分支指令

本文节选自《See MIPS run2rd》/《MIPS体系结构透视》中的部分章节,结合个人理解,对部分译文有所改动。 1.5.2 编址及内存访问 1.5.4 程序员可见的流水线效果 8.7.8 跳转...
  • phunxm
  • phunxm
  • 2013年05月11日 11:27
  • 30846

常用汇编指令

1、加减指令 2、adr指令 adr是小范围的地址读取伪指令,ldr是大范围的读取地址伪指令。可实际上adr是将基于PC相对偏移的地址值或基于寄存器相对地址值读取的为指令,而ldr用于加载32为立...

MIPS架构之start.s汇编分析

一、mips架构通用寄存器命名 二、mips汇编指令操作 实例: #example  .data  array1:  .space  12    #  declare 12 bytes of...

RA, 寄存器分配

寄存器分配1. 如何计算D-U链(1) 首先遍历整个routine,保存所有def值; 问题: 你如何去保存这些def值呢?要保证能快速的得到每个def值,因为每一 个 def 值不仅...

09RS08LA8寄存器介绍

  • 2010年06月13日 14:22
  • 409KB
  • 下载

ARM MIPS寄存器对比

  • 2015年12月01日 14:43
  • 824KB
  • 下载

mips的32个寄存器

MIPS comes with 32 general purpose registers named $0. . . $31 Registers also have symbolic names r...

MIPS32的内部寄存器

MIPS32的内部寄存器 基础知识介绍:   MIPS32的内部寄存器。 最简单的办法就是通过GDB的命令,可以获得下面的列表 (gdb) info re...
  • dayancn
  • dayancn
  • 2013年11月03日 09:46
  • 1031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mips bal和la 分别对ra和寄存器值的区别
举报原因:
原因补充:

(最多只允许输入30个字)