[ARM-assembly]-全局变量/静态全局变量/初始化/未初始化变量的存放位置分析
我们从汇编来看,各种变量在内存中的存放位置
1、使用交叉编译器将C语言转换成汇编
写一个C语言程序:
static int x;
static int y = 10;
int z;
int w = 20;int main()
{int s;s=x;s=y;s=z;s=w;return 0;
}
(arm32)
使用交叉编译器将其编译成.o文件 : arm-linux-androideabi-gcc-4.9 -c main.c
使用objdump工具将.o反汇编:arm-linux-androideabi-objdump -d main.o
hehezhou@buildsrv-165:~/workspace/test/test1$ arm-linux-androideabi-objdump -D main.omain.o: file format elf32-littlearmDisassembly of section .text:00000000 <main>:0: e52db004 push {fp} ; (str fp, [sp, #-4]!)4: e28db000 add fp, sp, #08: e24dd00c sub sp, sp, #12c: e59f3054 ldr r3, [pc, #84] ; 68 <main+0x68>10: e08f3003 add r3, pc, r314: e59f2050 ldr r2, [pc, #80] ; 6c <main+0x6c>18: e08f2002 add r2, pc, r21c: e5922000 ldr r2, [r2]20: e50b2008 str r2, [fp, #-8]24: e59f2044 ldr r2, [pc, #68] ; 70 <main+0x70>28: e08f2002 add r2, pc, r22c: e5922000 ldr r2, [r2]30: e50b2008 str r2, [fp, #-8]34: e59f2038 ldr r2, [pc, #56] ; 74 <main+0x74>38: e7932002 ldr r2, [r3, r2]3c: e5922000 ldr r2, [r2]40: e50b2008 str r2, [fp, #-8]44: e59f202c ldr r2, [pc, #44] ; 78 <main+0x78>48: e7933002 ldr r3, [r3, r2]4c: e5933000 ldr r3, [r3]50: e50b3008 str r3, [fp, #-8]54: e3a03000 mov r3, #058: e1a00003 mov r0, r35c: e24bd000 sub sp, fp, #060: e49db004 pop {fp} ; (ldr fp, [sp], #4)64: e12fff1e bx lr68: 00000050 andeq r0, r0, r0, asr r06c: 0000004c andeq r0, r0, ip, asr #3270: 00000040 andeq r0, r0, r0, asr #32...Disassembly of section .data:00000000 <y>:0: 0000000a andeq r0, r0, sl00000004 <w>:4: 00000014 andeq r0, r0, r4, lsl r0Disassembly of section .bss:00000000 <x>:0: 00000000 andeq r0, r0, r0Disassembly of section .comment:00000000 <.comment>:0: 43434700 movtmi r4, #14080 ; 0x37004: 4728203a ; <UNDEFINED> instruction: 0x4728203a8: 2029554e eorcs r5, r9, lr, asr #10c: 2e392e34 mrccs 14, 1, r2, cr9, cr4, {1}10: 30322078 eorscc r2, r2, r8, ror r014: 31303531 teqcc r0, r1, lsr r518: 28203332 stmdacs r0!, {r1, r4, r5, r8, r9, ip, sp}1c: 72657270 rsbvc r7, r5, #112, 420: 61656c65 cmnvs r5, r5, ror #2424: 00296573 eoreq r6, r9, r3, ror r5Disassembly of section .ARM.attributes:00000000 <.ARM.attributes>:0: 00002a41 andeq r2, r0, r1, asr #204: 61656100 cmnvs r5, r0, lsl #28: 01006962 tsteq r0, r2, ror #18c: 00000020 andeq r0, r0, r0, lsr #3210: 45543505 ldrbmi r3, [r4, #-1285] ; 0xfffffafb14: 08040600 stmdaeq r4, {r9, sl}18: 12010901 andne r0, r1, #16384 ; 0x40001c: 15011404 strne r1, [r1, #-1028] ; 0xfffffbfc20: 18031701 stmdane r3, {r0, r8, r9, sl, ip}24: 1a011901 bne 46430 <w+0x4642c>28: Address 0x0000000000000028 is out of bounds.
(arm64)
使用交叉编译器将其编译成.o文件 : aarch64-linux-android-gcc-4.9 -c main.c
使用objdump工具将.o反汇编:aarch64-linux-android-objdump -D main.o
hehezhou@buildsrv-165:~/workspace/test/test1$ aarch64-linux-android-objdump -D main.omain.o: file format elf64-littleaarch64Disassembly of section .text:0000000000000000 <main>:0: d10043ff sub sp, sp, #0x104: 90000000 adrp x0, 0 <main>8: 91000000 add x0, x0, #0x0c: b9400000 ldr w0, [x0]10: b9000fe0 str w0, [sp,#12]14: 90000000 adrp x0, 0 <main>18: 91000000 add x0, x0, #0x01c: b9400000 ldr w0, [x0]20: b9000fe0 str w0, [sp,#12]24: 90000000 adrp x0, 4 <main+0x4>28: f9400000 ldr x0, [x0]2c: b9400000 ldr w0, [x0]30: b9000fe0 str w0, [sp,#12]34: 90000000 adrp x0, 4 <main+0x4>38: f9400000 ldr x0, [x0]3c: b9400000 ldr w0, [x0]40: b9000fe0 str w0, [sp,#12]44: 52800000 mov w0, #0x0 // #048: 910043ff add sp, sp, #0x104c: d65f03c0 retDisassembly of section .data:0000000000000000 <y>:0: 0000000a .word 0x0000000a0000000000000004 <w>:4: 00000014 .word 0x00000014Disassembly of section .bss:0000000000000000 <x>:0: 00000000 .word 0x00000000Disassembly of section .comment:0000000000000000 <.comment>:0: 43434700 .inst 0x43434700 ; undefined4: 4728203a .inst 0x4728203a ; undefined8: 2029554e .inst 0x2029554e ; undefinedc: 2e392e34 uqsub v20.8b, v17.8b, v25.8b10: 30322078 adr x24, 6441d <w+0x64419>14: 31303531 adds w17, w9, #0xc0d18: 28203332 stnp w18, w12, [x25,#-256]1c: 72657270 .inst 0x72657270 ; undefined20: 61656c65 .inst 0x61656c65 ; undefined24: 00296573 .inst 0x00296573 ; NYI
hehezhou@buildsrv-165:~/workspace/test/test1$
2 以aarch64的汇编分析
(1)、可以看到带有初始值的static int y = 10 和int w = 20 都存放在data段
未初始值的static int x在bss段
static int x;
static int y = 10;
int z;
int w = 20;
Disassembly of section .data:
0000000000000000 <y>:0: 0000000a .word 0x0000000a0000000000000004 <w>:4: 00000014 .word 0x00000014Disassembly of section .bss:0000000000000000 <x>:0: 00000000 .word 0x00000000
(2)、我们再来看汇编代码
static int x;
static int y = 10;
int z;
int w = 20;int main()
{int s;s=x;s=y;s=z;s=w;return 0;
}
0000000000000000 <main>:0: d10043ff sub sp, sp, #0x104: 90000000 adrp x0, 0 <main>8: 91000000 add x0, x0, #0x0c: b9400000 ldr w0, [x0]10: b9000fe0 str w0, [sp,#12]14: 90000000 adrp x0, 0 <main>18: 91000000 add x0, x0, #0x01c: b9400000 ldr w0, [x0]20: b9000fe0 str w0, [sp,#12]24: 90000000 adrp x0, 4 <main+0x4>28: f9400000 ldr x0, [x0]2c: b9400000 ldr w0, [x0]30: b9000fe0 str w0, [sp,#12]34: 90000000 adrp x0, 4 <main+0x4>38: f9400000 ldr x0, [x0]3c: b9400000 ldr w0, [x0]40: b9000fe0 str w0, [sp,#12]44: 52800000 mov w0, #0x0 // #048: 910043ff add sp, sp, #0x104c: d65f03c0 ret
[ARM-assembly]-全局变量/静态全局变量/初始化/未初始化变量的存放位置分析相关推荐
- C++ 全局变量 静态全局变量 傻傻分不清
今天上午写C++代码,被神马全局变量和静态全局变量困住了,出现了各种"重定义"和"链接"相关的error.到底在哪里声明,在哪里定义,哪里使用extern?傻傻 ...
- c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...
基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...
- c++ 使用未初始化的内存_C语言内存分布(内核区、堆栈区等)
C语言内存分布(内核.变量,堆栈等) 内核区是提供给操作系统使用的.栈区是给局部变量使用的,局部变量是函数内定义的变量,包括函数系数:程序调用时把局部变量存的数据压入栈,程序退出时把局部变量存的数据弹 ...
- 【C语言局部变量/静态局部变量/全局变量与静态全局变量
1基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...
- c语言局部变量 静态局部变量 全局变量与静态全局变量
基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...
- static 静态全局变量和静态局部变量的特性
static 静态变量 一般在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈区分配空间,函数在栈区分配的空间在此函数执行结束时会释放掉. 这样就产生了一个问题: 如果想将函数中此变量的值 ...
- php语言指针的初始化定义,指针变量的初始化,C语言指针变量初始化详解
本节来解决如何给一个指针变量初始化.即怎样使一个指针变量指向另一个变量. 前面章节中的某些程序实际上已经使用了,即可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量.比如: int ...
- 初始化全局变量实例说明C语言中初始化和未初始化的全局变量所在不同的段
本文是一篇关于初始化全局变量的帖子 实例说明C语言中初始化和未初始化的全局变量地点不同的段 一个程序: Makefile: objs := bss.oall: bss bss: $(objs)gcc ...
- C语言基础入门48篇_44_静态局部变量、静态全局变量、静态函数(静态局部变量只被初始化一次,保留变量值、静态全局变量是加了作用域的全局变量、静态函数亦是加了作用域的函数)
static关键字 C语言中的static关键字,有多种用法,它可以用来修饰局部变量.全局变量和函数,分别得到静态局部变量.静态全局变量和静态函数. 1. 静态局部变量 普通局部变量,函数每调用一次就 ...
最新文章
- php 常用设计模式demo
- 前端学习(2249)注册 创建 拉取
- 阿里云 ECS服务器 开放 8080 端口 -- 图解
- 把一个数据库的数据插入到另外一个数据库
- caffe安装系列——综述
- php baseconvert,mb_convert_encoding
- 推荐一款固定资产管理软件
- Arping协议以及使用方法
- PHP中百度地图和高德地图经纬度互相转换
- 2016年米其林指南—澳门小食篇 -吃遍澳门,就这12家!
- 当Activity设置为透明主题时,按Home键,Dialog闪烁的解决方法
- [Life] search torrent engineer
- 怎样将蓝底照片换成白底
- 程序员练级(转自酷壳)
- 今日分享-自定义返回按钮(与系统按钮位置一致)
- html时间戳转日期
- 韩顺平老师讲解13个自学编程的坑
- QuickBI 使用记录
- 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第十三周题解(个人向仅供参考)
- 解决网上有重名的问题
热门文章
- AWS昨日突发大规模故障,官方称受施工方挖断光纤影响
- 数据中心战略的三个真相
- 统计123出现次数_如何使用 count 统计词条出现次数?
- 成功解决mxnet.base.MXNetError: C:\Jenkins\workspace\mxnet-tag\mxnet\3rdparty\dmlc-core\src\io\local_file
- BlockChain:《Blockchain Gate》听课笔记——区块链的共识机制—简介、理解、畅谈
- 元计算:《元计算破解生命密码》听课笔记
- OS_FLAG.C(1)
- oracle-ORA-01555错误
- Vim快捷输出查找寄存器的内容(去除\,\和\V)
- 移动端双指缩放、旋转