关闭

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

标签: pmon
2426人阅读 评论(0) 收藏 举报
分类:

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

0
0

猜你在找
【直播】机器学习&深度学习系统实战(唐宇迪)
【直播】Kaggle 神器:XGBoost 从基础到实战(冒教授)
【直播回放】深度学习基础与TensorFlow实践(王琛)
【直播】计算机视觉原理及实战(屈教授)
【直播】机器学习之凸优化(马博士)
【直播】机器学习之矩阵(黄博士)
【直播】机器学习之概率与统计推断(冒教授)
【直播】机器学习之数学基础
【直播】TensorFlow实战进阶(智亮)
【直播】深度学习30天系统实训(唐宇迪)
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:134883次
    • 积分:1603
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:141篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论