3053|5

222

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

反汇编arm9代码,为什么调用两次bic,gcc犯傻吗??? [复制链接]

如下三段汇编代码
        a &= ~(1 << 7);//a &= ~0x80
e3c:        e51b300c         ldr        r3, [fp, #-12]
e40:        e3c33080         bic        r3, r3, #128        ; 0x80
e44:        e50b300c         str        r3, [fp, #-12]

        a &= ~((1 << 2)|(1 << 3)| (1 << 4)| (1 << 8)| (1 << 16));//a &= ~0x10284 e1c:        e51b300c         ldr        r3, [fp, #-12]
e20:        e3c33801         bic        r3, r3, #65536        ; 0x10000
e24:        e3c33f47         bic        r3, r3, #284        ; 0x11c
e28:        e50b300c         str        r3, [fp, #-12]

        tmpreg &= ~((7 << 0) | (7 << 4) | (7 << 8) | (8 << 16));//tmpreg &= ~0x80777 5b8:        e51b3008         ldr        r3, [fp, #-8]
5bc:        e3c33702         bic        r3, r3, #524288        ; 0x80000
5c0:        e3c33e77         bic        r3, r3, #1904        ; 0x770
5c4:        e3c33007         bic        r3, r3, #7        ; 0x7

5c8:        e50b3008         str        r3, [fp, #-8]


我发现反汇编后的bic指令,凡是数大于0xFFFF后就被分成多分,如果R3是16位寄存器,那么理论上0xFFFFFFFF这样的数执行两次bic指令也能运行完。
但是为什么第3个例子里好好的0x80777被分成0x80000、0x770、0x7呢?

虽然这样把代码分成了多份?是不是考虑到“三级流水线”而设计的呢?因为我不相信编译器会犯傻,或许这还是个妙招,保证流水线不被打乱

虽然bic被分成2、3行代码,但与执行1行代码是等同效率的?
此帖出自ARM技术论坛

最新回复

指令里带有的立即数是有范围的,如果你要的那个数比较复杂,那么就不能表示在一条指令里了。当然如果你想硬用一个数来编写汇编指令是没问题的,不过这个时候指令里就不是立即数了,而是一个间接数,所以需要CPU再到内存中把这个数取出来放在寄存器里,这样一系列操作,可能就得不偿失了,不如多用两条指令,省的CPU还得跑一遍内存。  详情 回复 发表于 2014-8-15 08:55
点赞 关注
 

回复
举报

222

帖子

2

TA的资源

一粒金砂(高级)

沙发
 
a &= ~((1 << 2)|(1 << 3)| (1 << 4)| (1 << 8)| (1 << 16));//a &= ~0x10284 e1c:        e51b300c         ldr        r3, [fp, #-12]
这行写错了,改成
a &= ~((1 << 2)|(1 << 3)| (1 << 4)| (1 << 8)| (1 << 16));//a &= ~0x1011c e1c:        e51b300c         ldr        r3, [fp, #-12]
此帖出自ARM技术论坛
 
 
 

回复

6040

帖子

203

TA的资源

版主

板凳
 
据我猜测,可能是用一条指令指令完不成吧,所以会拆成两条,要不你试试用汇编写写,用一条指令完成,可能你也做不到。所以指令会用一个小的常量去左右移来完成。
此帖出自ARM技术论坛
 
 
 

回复

603

帖子

1

TA的资源

纯净的硅(中级)

4
 
指令里带有的立即数是有范围的,如果你要的那个数比较复杂,那么就不能表示在一条指令里了。当然如果你想硬用一个数来编写汇编指令是没问题的,不过这个时候指令里就不是立即数了,而是一个间接数,所以需要CPU再到内存中把这个数取出来放在寄存器里,这样一系列操作,可能就得不偿失了,不如多用两条指令,省的CPU还得跑一遍内存。
此帖出自ARM技术论坛
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

5
 
大概明白了
此帖出自ARM技术论坛
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

6
 
韦东山的视频
毕业班第1课第1.1节_自己写bootloader之编写第1阶段
http://www.tudou.com/programs/view/3qmAuCjzTUo/
毕业班第1课第2节_自己写bootloader之编译测试
http://www.tudou.com/programs/view/Yy67rZVidPo/
13:00分
两个视频有讲述为什么立即数被拆分操作,寄存器位宽不足
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表