变量访问被ARM架构安排的明明白白!
作为过来人,我发现很多程序猿新手,在编写代码的时候,特别喜欢定义很多独立的全局变量,而不是把这些变量封装到一个结构体中,主要原因是图方便,但是要知道,这其实是一个不好的习惯,而且会降低整体代码的性能。
另一方面,最近有幸与大神「公众号:裸机思维」的傻孩子交流的时候,他聊到:“其实Cortex在架构层面就是更偏好面向对象的(哪怕你只是使用了结构体),其表现形式就是:「Cortex所有的寻址模式都是间接寻址」——换句话说「一定依赖一个寄存器作为基地址」。
举例来说,同样是访问外设寄存器,过去在8位和16位机时代,人们喜欢给每一个寄存器都单独绑定地址——当作全局变量来访问,而现在Cortex在架构上更鼓励底层驱动以寄存器页(也就是结构体)为单位来定义寄存器,这也就是说,同一个外设的寄存器是借助拥有同一个基地址的结构体来访问的。”
以Cortex A9架构为前提,下面一口君详细给你解释为什么使用结构体效率会更高一些。
一、全局变量代码反汇编
1. 源文件
「gcd.s」
.text
.global _start
_start:
ldr sp,=0x70000000 get stack top pointer
b main
「main.c」
* main.c
*
* Created on: 2020-12-12
* Author: pengdan
int xx=0;
int yy=0;
int zz=0;
int main(void)
{
xx=0x11;
yy=0x22;
zz=0x33;
while(1);
return 0;
}
「map.lds」
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x40008000;
. = ALIGN(4);
.text :
{
gcd.o(.text)
*(.text)
}
. = ALIGN(4);
.rodata :
{ *(.rodata) }
. = ALIGN(4);
.data :
{ *(.data) }
. = ALIGN(4);
.bss :
{ *(.bss) }
}
「Makefile」
TARGET=gcd
TARGETC=main
all:
arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGETC).o $(TARGETC).c
arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGET).o $(TARGET).s
arm-none-linux-gnueabi-gcc -O1 -g -S -o $(TARGETC).s $(TARGETC).c
arm-none-linux-gnueabi-ld $(TARGETC).o $(TARGET).o -Tmap.lds -o $(TARGET).elf
arm-none-linux-gnueabi-objcopy -O binary -S $(TARGET).elf $(TARGET).bin
arm-none-linux-gnueabi-objdump -D $(TARGET).elf > $(TARGET).dis
clean:
rm -rf *.o *.elf *.dis *.bin
【交叉编译工具,自行搜索安装】

图片新闻
最新活动更多
-
即日-1.25限时下载>> ADI电源设计基础知识白皮书
-
即日-1.30精彩回顾>> 英特尔智能移动设备参考设计发布会
-
即日-2.5立即投票>> 维科杯·2020(第三届)中国机器人行业年度评选
-
即日-2.26立即下载>> 【西部数据】工业应用中的嵌入式存储
-
即日-3.18限时下载>> 嵌入式软件技术革新应对后疫情时代的智能工业开发挑战
-
3月25日立即报名>> 【2021系列活动】-汽车电子技术在线会议暨在线展
- 资深机械工程师 OFweek猎头
- 车间主任(机械行业) 苏州事达同泰汽车零部件有限公司
- 机械工程师 大族激光智能装备集团有限公司
- 机械工程师 上海诚兴机械电子有限公司
- 机械工程师(PRLab) 珠海市精实测控技术有限公司
- 机械设计师 上海杜朗传动技术有限公司
- 机械装配工 上海丰禾精密机械有限公司
- 机械设计工程师 武汉德工机电技术有限公司
- 机械工程师 上海新移力自动化科技有限公司
- 机械装配 西安北村精密机械有限公司
- 华东销售经理 江苏省/苏州市
- 高级采购 北京市/海淀区
- 海外销售工程师 北京市/海淀区
- 海外销售经理 北京市/海淀区
- 销售工程师 北京市/海淀区
- SEO搜索引擎优化专员 北京市/海淀区
- 嵌入式软件工程师(ARM) 山东省/潍坊市
- 光学工程师 山东省/潍坊市
- DQE经理 广东省/深圳市
- 业务员 广东省/深圳市
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论