我们从汇编来看,各种变量在内存中的存放位置

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]-全局变量/静态全局变量/初始化/未初始化变量的存放位置分析相关推荐

  1. C++ 全局变量 静态全局变量 傻傻分不清

    今天上午写C++代码,被神马全局变量和静态全局变量困住了,出现了各种"重定义"和"链接"相关的error.到底在哪里声明,在哪里定义,哪里使用extern?傻傻 ...

  2. c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  3. c++ 使用未初始化的内存_C语言内存分布(内核区、堆栈区等)

    C语言内存分布(内核.变量,堆栈等) 内核区是提供给操作系统使用的.栈区是给局部变量使用的,局部变量是函数内定义的变量,包括函数系数:程序调用时把局部变量存的数据压入栈,程序退出时把局部变量存的数据弹 ...

  4. 【C语言局部变量/静态局部变量/全局变量与静态全局变量

    1基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  5. c语言局部变量 静态局部变量 全局变量与静态全局变量

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  6. static 静态全局变量和静态局部变量的特性

    static 静态变量 一般在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈区分配空间,函数在栈区分配的空间在此函数执行结束时会释放掉. 这样就产生了一个问题: 如果想将函数中此变量的值 ...

  7. php语言指针的初始化定义,指针变量的初始化,C语言指针变量初始化详解

    本节来解决如何给一个指针变量初始化.即怎样使一个指针变量指向另一个变量. 前面章节中的某些程序实际上已经使用了,即可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量.比如: int ...

  8. 初始化全局变量实例说明C语言中初始化和未初始化的全局变量所在不同的段

    本文是一篇关于初始化全局变量的帖子 实例说明C语言中初始化和未初始化的全局变量地点不同的段 一个程序: Makefile: objs := bss.oall: bss bss: $(objs)gcc ...

  9. C语言基础入门48篇_44_静态局部变量、静态全局变量、静态函数(静态局部变量只被初始化一次,保留变量值、静态全局变量是加了作用域的全局变量、静态函数亦是加了作用域的函数)

    static关键字 C语言中的static关键字,有多种用法,它可以用来修饰局部变量.全局变量和函数,分别得到静态局部变量.静态全局变量和静态函数. 1. 静态局部变量 普通局部变量,函数每调用一次就 ...

最新文章

  1. php 常用设计模式demo
  2. 前端学习(2249)注册 创建 拉取
  3. 阿里云 ECS服务器 开放 8080 端口 -- 图解
  4. 把一个数据库的数据插入到另外一个数据库
  5. caffe安装系列——综述
  6. php baseconvert,mb_convert_encoding
  7. 推荐一款固定资产管理软件
  8. Arping协议以及使用方法
  9. PHP中百度地图和高德地图经纬度互相转换
  10. 2016年米其林指南—澳门小食篇 -吃遍澳门,就这12家!
  11. 当Activity设置为透明主题时,按Home键,Dialog闪烁的解决方法
  12. [Life] search torrent engineer
  13. 怎样将蓝底照片换成白底
  14. 程序员练级(转自酷壳)
  15. 今日分享-自定义返回按钮(与系统按钮位置一致)
  16. html时间戳转日期
  17. 韩顺平老师讲解13个自学编程的坑
  18. QuickBI 使用记录
  19. 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第十三周题解(个人向仅供参考)
  20. 解决网上有重名的问题

热门文章

  1. AWS昨日突发大规模故障,官方称受施工方挖断光纤影响
  2. 数据中心战略的三个真相
  3. 统计123出现次数_如何使用 count 统计词条出现次数?
  4. 成功解决mxnet.base.MXNetError: C:\Jenkins\workspace\mxnet-tag\mxnet\3rdparty\dmlc-core\src\io\local_file
  5. BlockChain:《Blockchain Gate》听课笔记——区块链的共识机制—简介、理解、畅谈
  6. 元计算:《元计算破解生命密码》听课笔记
  7. OS_FLAG.C(1)
  8. oracle-ORA-01555错误
  9. Vim快捷输出查找寄存器的内容(去除\,\和\V)
  10. 移动端双指缩放、旋转