完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
LDR伪指令 LDR pseudo-instruction 功能:把一个32位立即数或一个32位的内存地址加载到一个寄存器中。 注意:这里描述的是LDR伪指令,而不是LDR指令 语法: LDR{cond}{.W} Rt, =expr * cond是一个可选的条件码 * .W是可选的指令宽度说明符 * Rt是要加载的寄存器 * expr是一个数字表达式 * label_expr是一个以标号加上或减去一个数字值形式出现的PC相对或外部地址表达式 举例: 汇编器就使用MOV或MVN指令。 * 如果不能使用MOV或MVN指令,或者使用了label_expr,汇编器就把这个常量放在文字池里, 然后使用一条PC相对形式的LDR指令从文字池里读取这个常量。 注意: --- 以这种方式加载的内存地址,其值是在链接时确定的,所以这里的代码不是位置独立的。 --- 不管链接器把包含LDR指令的节放在哪里,指向常量的地址仍然是有效的。 汇编器把label_expr的值放到一个文字池里,然后使用一条PC相对形式的LDR指令把这个值 从文 字池里读取到寄存器里。 如果label_expr是一个外部表达式,或不在当前节中,汇编器就在目标文件中放置一个重定位 指示符。链接器在链接时会产生具体的地址。 如果label_expr是一个局部的命名的(named)或数字标号,那么汇编器在目标文件中放置 一个 重定位指示符,同时为这个局部标号产生一个符号名。具体的地址也是在链接时产生的。如果 这个局部标号引用的是Thumb代码,则内存地址的Thumb位(bit 0)就会被设置。 从PC到内存池中常量值之间偏移量在ARM及32位Thumb编码中必须在 ±4K字节内,在16位Thumb 编码中必须在0到+1K字节范围 内。你必须自己确保在上述有效范围内有一个内存池。 如果被引用的标号是在Thumb代码中,那么LDR伪指令设置label_expr所代表的内存地址的 Thumb位(bit 0)。 注意: 在RealView Compilation Tools(RVCT) v2.2中,内存地址的Thumb位不会被设置。如果你有 依赖于这种行为的代码,请使用命令行选项--untyped_local_labels,强制汇编器不要设置被 引用的位于Thumb代码中的标号。 Thumb代码中的LDR伪指令 LDR in Thumb code 你可以使用指令宽度说明符 .W 强制汇编器在ARMv6T2及以上的处理器上把Thumb代码中LDR 伪指令编码为32位长。即使立即数的值能使用一个16位的MOV指令加载,或存在一个在16位PC相 对LDR指令范围内的内存池,LDR.W总是产生一条32位的指令。 |
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-CAN编程示例之开发板测试
922 浏览 0 评论
该问题是用APP给芯海科技的CST92F25芯片发指令是出现的
3070 浏览 1 评论
872 浏览 0 评论
1733 浏览 1 评论
2934 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 14:23 , Processed in 0.677405 second(s), Total 40, Slave 31 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号