文子池不能乱放

当LDR Rd,=指令要访问文字池中的常量时,汇编器先检查在当前文字池是否可以访问到,池中是否有所需要的常量。如果是,则对已存在的常量进行编址,否则试图把常量放到下一个文字池中。如果下一个文字池不可访问(因为不存在或者到它的距离超过4KB),则汇编器会报错,这时应该在LDR Rd,=指令后较近的地方放置一个LTORG伪指令。

请看下面的例子(作为注释列出的指令是汇编器产生的):

AREA Loadcon2,CODE

ENTRY

BL func1

BL func2

SWI 0x11

func1

LDR r0,=42 ======> MOV r0,#42

LDR r1,=0x55555555 ======> LDR r1,[pc,#offset 到文字池1]

LDR r2,=0xFFFFFFFF ======> MVN r2,#0

MOV pc,lr

LTORG ======> 文字池1包含字面常量0x55555555

func2

LDR r3,=0x55555555 ======> LDR r3,[pc,#offset 到文字池1]

;LDR r4,=0x66666666 ;注释掉这一句会发生错误,因为文字池2不可访问(距离超过4KB)一个文字池只可以放一个32位立即数同一段代码若出现两个32位无法通过移位得到的立即数,则将分两个文字池存放。

MOV pc,lr

LargeTable % 4200 ;从当前位置清除4200字节的内存,从而让END后面的文字池距离超过4KB

END

注意文字池必须放置在执行代码外面(应置于无条件分支指令后,也可以放置在子程序结束返回指令后),否则处理器会把它当作指令来执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值