[STM32] LDR伪指令是怎么实现的?

[复制链接]
 楼主| 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指令加载进来,就这么简单
john_lee 发表于 2013-12-9 09:05 | 显示全部楼层
ldr 是一条实际的指令,形式是 ldr rd, [pc, #offset],指令的操作就是把以 pc 为基址,加上 offset 偏移量的地址中的数据,装载到 rd 寄存器。
汇编语言里使用了一个与 ldr 指令同名的伪指令,这个伪指令会生成一条实际的 ldr 指令,并把 =后的数据放在子程序末尾,然后算出这个数据与 ldr 指令的偏移量,作为 offset。
 楼主| From_the_UESTC 发表于 2013-12-9 12:47 | 显示全部楼层
ayb_ice 发表于 2013-12-9 08:21
立即数被存在当前PC附近的内存里,然后通过基于PC的LDR指令加载进来,就这么简单 ...

照这么说,地址偏移偏移量也应该是存在指令中的吧,万一程序很长,那么早晚也会出现指令中存不下地址偏移量的情况,这又如何解决呢?
 楼主| From_the_UESTC 发表于 2013-12-9 12:56 | 显示全部楼层
john_lee 发表于 2013-12-9 09:05
ldr 是一条实际的指令,形式是 ldr rd, ,指令的操作就是把以 pc 为基址,加上 offset 偏移量的地址中的数 ...

LDR,RD,[PC,#OFFSET]的偏移地址是存放在指令中的吧,指令中有多少位存地址偏移量呢?
ayb_ice 发表于 2013-12-9 13:44 | 显示全部楼层
From_the_UESTC 发表于 2013-12-9 12:47
照这么说,地址偏移偏移量也应该是存在指令中的吧,万一程序很长,那么早晚也会出现指令中存不下地址偏移 ...

看仔细了
都说了,当前PC
 楼主| From_the_UESTC 发表于 2013-12-9 14:06 | 显示全部楼层
ayb_ice 发表于 2013-12-9 13:44
看仔细了
都说了,当前PC

我看清楚了啊,就是当前PC,但是PC应该加多少呢,按照5楼的说法,数据应该是放到子程序的末尾,但是万一子程序很长呢?
ayb_ice 发表于 2013-12-9 14:14 | 显示全部楼层
From_the_UESTC 发表于 2013-12-9 14:06
我看清楚了啊,就是当前PC,但是PC应该加多少呢,按照5楼的说法,数据应该是放到子程序的末尾,但是万一 ...

如果不能实现,编译器会报错的
一般是放在子程序返回指令的后面,这样不会对流水线产生影响
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

216

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部