完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
今天在温习SDRAM程序代码,看到了以下两段代码
复制代码
复制代码 第一段代码使用mov指令将4KB=4*1024=0x1000这个立即数放到r3寄存器中 第二段代码使用 add r3, r1, #52 是将r1+52放到r4寄存器中即MEM_CTL_BASE+52=0x48000000+52=0x48000034 放在r4寄存器中 那么自己就想到直接用mov指令替代这句 mov r3 ,#(MEN_CTL_BASE+52) 但是编译的时候发现错误 然后询问了南方,南方解释0x48000034不是个立即数。 add r3, r1, #52 可以等效ldr r3, =(MEN_CTL_BASE+52) 给出的理解: 一个32位的指令里,这32位里含有指令码,那么存数字的位数就少于32位。那么这少于32位的空间,肯定不能表示任意32位数,能表示的数,被称为立即数。 然后再去看立即数的定义。 百度了一下,有人这样解释: 1.看所有的bit位为1的是否在一个字节中 2.若1条件满足,则看是否可以经过偶数位左移得到 满足这两个条件的就是合法的立即数 看的不是太明白,就到QQ群里询问群里的朋友,群里朋友 FWW和AI觞答案 给出一些解释了 步骤 1. 判断两个1之间的距离是否大于8 即两个1之间最大允许只有6个0,如果不满足这个要求就可以当即否定 步骤2.然后再判定其是否满足右移偶数位构成的的这个数,是否是有那个数。 在这里感谢群里朋友的热心和耐心支持。:share: add r3, r1, #52 |
|
相关推荐
2个回答
|
|
碰到比较复杂的数时,我一般都用:
ldr r0, =A 有“=”号的指令是“伪指令”,即CPU并不认得这条指令,编译器会把它转换为真正的汇编指令。 如果这个数是立即数的话,编译器会把它变为: mov r0, #A 如果这个数不是立即数,但是能通过简单的加减实现的话,编译器就会把它变为: mov r0, #B, add r0, r0, #C。而 A= B + C 如果这个数非常复杂,那么就会变成这样: ldr r0, [某个地址] 某个地址: .word A |
|
|
|
呵呵, 分享的经验是大家的财富,又多学了一些知识
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2156 浏览 6 评论
1964 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4521 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 15:41 , Processed in 0.695066 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号