您尚未登录。

楼主 # 2021-06-22 21:02:51

March
会员
注册时间: 2021-05-28
已发帖子: 61
积分: 23

关于Xboot大佬的D1裸机程序的若干问题

看了xboot大佬的D1裸机程序,有几处看的很迷糊,由于学艺不精,所以来论坛提问,望解惑。
主要问题是在start.s文件中,有几处汇编代码不是很清楚,

1._20210622-2102.png

此处代码是为了判断当前运行地址是否是链接地址,根据代码:t0中存的是_start的地址,t1中存的是_image_start地址中的内容(8字节),请问是t0中存的链接地址,t1中存的是当前运行地址吗?为啥当前运行地址是存储在_image_start的地址中?


2._20210622-2058.png

此处拷贝ddr的bin文件,用到了函数memcpy,该函数的第三个参数是len,为什么a2是通过计算_ddr_bin_start和_ddr_bin_end地址中的内容的差来得到长度的呢?不应该是_ddr_bin_end的地址-_ddr_bin_start的地址吗?

离线

#1 2021-06-22 21:20:35

哇酷小二
管理员
所在地: 你猜
注册时间: 2020-04-22
已发帖子: 3,387
积分: 1902
个人网站

Re: 关于Xboot大佬的D1裸机程序的若干问题

1. t0是PC相关地址,和程序当前运行位置有关系
    t1是链接地址,数值来自 ld文件

请参考:
终于搞清楚汇编代码的重定位判断语句是怎么实现的了
https://whycan.com/t_6659.html





离线

#2 2021-06-22 21:26:50

哇酷小二
管理员
所在地: 你猜
注册时间: 2020-04-22
已发帖子: 3,387
积分: 1902
个人网站

Re: 关于Xboot大佬的D1裸机程序的若干问题

2. 没错,就是 end - start

sub rd, rs1, rs2

x[rd] = x[rs1] − x[rs2]

x[rs1]减去 x[rs2],结果写入 x[rd]。忽略算术溢出。

参考: https://www.cnblogs.com/truelycloud/p/10807398.html





离线

楼主 #3 2021-06-22 21:54:42

March
会员
注册时间: 2021-05-28
已发帖子: 61
积分: 23

Re: 关于Xboot大佬的D1裸机程序的若干问题

这里的la t1, _image_start不是已经取得_image_start的地址到t1寄存器中了吗?为什么后面还要加LREG t1, (t1)这一句呢?_20210622-2154.png

离线

#4 2021-06-22 22:47:21

哇酷小二
管理员
所在地: 你猜
注册时间: 2020-04-22
已发帖子: 3,387
积分: 1902
个人网站

Re: 关于Xboot大佬的D1裸机程序的若干问题

.align 3
_image_start:
    RVPTR __image_start

这个 __image_start 才是 link.ld 提供的, 汇编代码里面 _image_start 是指向 __image_start

所以需要把 t1 寄存器指向的地址值加载到 t1


相当于 C代码里面:

int a = *((int*)a);





离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn