打印
[STM32]

LDR伪指令是怎么实现的?

[复制链接]
2158|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
From_the_UESTC|  楼主 | 2013-12-8 00:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于ARM指令都是32位的,所以要想在一条指令里面包含一个32位立即数,那么这个32位立即数不能是任意32位立即数。以前只知用LDR R0,=lijishu这样的伪指令来搞定。但是我最近想到一个问题,汇编器在内部是怎么处理的呢?忘有大神告知,我汇编不是很懂啊。

相关帖子

沙发
From_the_UESTC|  楼主 | 2013-12-8 13:16 | 只看该作者
求解答啊

使用特权

评论回复
板凳
dirtwillfly| | 2013-12-8 19:14 | 只看该作者
不懂汇编,帮顶

使用特权

评论回复
地板
ayb_ice| | 2013-12-9 08:21 | 只看该作者
立即数被存在当前PC附近的内存里,然后通过基于PC的LDR指令加载进来,就这么简单

使用特权

评论回复
5
john_lee| | 2013-12-9 09:05 | 只看该作者
ldr 是一条实际的指令,形式是 ldr rd, [pc, #offset],指令的操作就是把以 pc 为基址,加上 offset 偏移量的地址中的数据,装载到 rd 寄存器。
汇编语言里使用了一个与 ldr 指令同名的伪指令,这个伪指令会生成一条实际的 ldr 指令,并把 =后的数据放在子程序末尾,然后算出这个数据与 ldr 指令的偏移量,作为 offset。

使用特权

评论回复
6
From_the_UESTC|  楼主 | 2013-12-9 12:47 | 只看该作者
ayb_ice 发表于 2013-12-9 08:21
立即数被存在当前PC附近的内存里,然后通过基于PC的LDR指令加载进来,就这么简单 ...

照这么说,地址偏移偏移量也应该是存在指令中的吧,万一程序很长,那么早晚也会出现指令中存不下地址偏移量的情况,这又如何解决呢?

使用特权

评论回复
7
From_the_UESTC|  楼主 | 2013-12-9 12:56 | 只看该作者
john_lee 发表于 2013-12-9 09:05
ldr 是一条实际的指令,形式是 ldr rd, ,指令的操作就是把以 pc 为基址,加上 offset 偏移量的地址中的数 ...

LDR,RD,[PC,#OFFSET]的偏移地址是存放在指令中的吧,指令中有多少位存地址偏移量呢?

使用特权

评论回复
8
ayb_ice| | 2013-12-9 13:44 | 只看该作者
From_the_UESTC 发表于 2013-12-9 12:47
照这么说,地址偏移偏移量也应该是存在指令中的吧,万一程序很长,那么早晚也会出现指令中存不下地址偏移 ...

看仔细了
都说了,当前PC

使用特权

评论回复
9
From_the_UESTC|  楼主 | 2013-12-9 14:06 | 只看该作者
ayb_ice 发表于 2013-12-9 13:44
看仔细了
都说了,当前PC

我看清楚了啊,就是当前PC,但是PC应该加多少呢,按照5楼的说法,数据应该是放到子程序的末尾,但是万一子程序很长呢?

使用特权

评论回复
10
ayb_ice| | 2013-12-9 14:14 | 只看该作者
From_the_UESTC 发表于 2013-12-9 14:06
我看清楚了啊,就是当前PC,但是PC应该加多少呢,按照5楼的说法,数据应该是放到子程序的末尾,但是万一 ...

如果不能实现,编译器会报错的
一般是放在子程序返回指令的后面,这样不会对流水线产生影响

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

216

帖子

0

粉丝