C语言数据段总结

昨天晚上对.rodata和.data的概念比较模糊,今天特意做了实验具体分析一下,在此总结。

一、测试代码

	const int  g_test1 =0x123;		
        unsigned int g_test2 = 0xabc;	
	char g_test3[] = "asdfghjkl";	
	char g_test4[10];				
	char *g_test = "zzxcvcb";		
	static int g_test5 = 12;		
	static int g_teat6;	
			
	int main(void)
	{
		const char loc_test6 = 'a';	
		int loc_test1 = 0x89;		
		char loc_test2[] ="okminhbh";
		char  *loc_test3 = "1234545";
		int loc_test4;				
		int loc_test5 = 0;			
		static int  loc_test8 = 5;	
		static int  loc_test7;		
		
		return 0;
	}
 

二、反汇编代码

      1 
      2 123.o:     file format elf32-littlearm
      3 
      4 Disassembly of section .text:
      5 
      6 00000000 <main>:
      7    0:   e1a0c00d    mov ip, sp
      8    4:   e92dd800    stmdb   sp!, {fp, ip, lr, pc}
      9    8:   e24cb004    sub fp, ip, #4  ; 0x4
     10    c:   e24dd020    sub sp, sp, #32 ; 0x20
     11   10:   e3a03061    mov r3, #97 ; 0x61        ;loc_test6保存在stack      
     12   14:   e54b300d    strb    r3, [fp, #-13]
     13   18:   e3a03089    mov r3, #137    ; 0x89    ;loc_test1保存在stack
     14   1c:   e50b3014    str r3, [fp, #-20]
     15   20:   e59f3034    ldr r3, [pc, #52]   ; 5c <.text+0x5c>
     16   24:   e24bc020    sub ip, fp, #32 ; 0x20
     17   28:   e8930007    ldmia   r3, {r0, r1, r2}
     18   2c:   e8ac0003    stmia   ip!, {r0, r1}
     19   30:   e5cc2000    strb    r2, [ip]
     20   34:   e59f3024    ldr r3, [pc, #36]   ; 60 <.text+0x60>
     21   38:   e50b3024    str r3, [fp, #-36]
     22   3c:   e3a03000    mov r3, #0  ; 0x0
     23   40:   e50b302c    str r3, [fp, #-44]
     24   44:   e59f0018    ldr r0, [pc, #24]   ; 64 <.text+0x64>
     25   48:   ebfffffe    bl  48 <main+0x48>
     26   4c:   e3a03000    mov r3, #0  ; 0x0
     27   50:   e1a00003    mov r0, r3
     28   54:   e24bd00c    sub sp, fp, #12 ; 0xc
     29   58:   e89da800    ldmia   sp, {fp, sp, pc}
     30   5c:   0000000c    andeq   r0, r0, ip
     31   60:   00000018    andeq   r0, r0, r8, lsl r0
     32   64:   00000020    andeq   r0, r0, r0, lsr #32
     33 Disassembly of section .data:        ;g_test2 g_test3  g_test  g_test5  loc_test8.0 保存在.data段
     34 
     35 00000000 <g_test2>:
     36    0:   00000abc    streqh  r0, [r0], -ip
     37 
     38 00000004 <g_test3>:
     39    4:   66647361    strvsbt r7, [r4], -r1, ror #6
     40    8:   6b6a6867    blvs    1a9a1ac <.data+0x1a9a1ac>
     41    c:   0000006c    andeq   r0, r0, ip, rrx
     42 
     43 00000010 <g_test>:
     44   10:   00000004    andeq   r0, r0, r4
     45 
     46 00000014 <g_test5>:
     47   14:   0000000c    andeq   r0, r0, ip
     48 
     49 00000018 <loc_test8.0>:
     50   18:   00000005    andeq   r0, r0, r5
     51 Disassembly of section .bss:   ;loc_test7.1  g_teat6 保存在.bss段
     52 
     53 00000000 <loc_test7.1>:
     54    0:   00000000    andeq   r0, r0, r0
     55 
     56 00000004 <g_teat6>:
     57    4:   00000000    andeq   r0, r0, r0
     58 Disassembly of section .rodata:     ; g_test1保存在.rodata段
     59 
     60 00000000 <g_test1>:
     61    0:   00000123    andeq   r0, r0, r3, lsr #2
     62    4:   63787a7a    cmnvs   r8, #499712 ; 0x7a000
     63    8:   00626376    rsbeq   r6, r2, r6, ror r3
     64    c:   696d6b6f    stmvsdb sp!, {r0, r1, r2, r3, r5, r6, r8, r9, fp, sp, lr}^
     65   10:   6862686e    stmvsda r2!, {r1, r2, r3, r5, r6, fp, sp, lr}^
     66   14:   00000000    andeq   r0, r0, r0
     67   18:   34333231    ldrcct  r3, [r3], #-561
     68   1c:   00353435    eoreqs  r3, r5, r5, lsr r4
     69   20:   6c6c6568    cfstr64vs   mvdx6, [ip], #-416
     70   24:   6f77206f    swivs   0x0077206f
     71   28:   0d646c72    stceql  12, cr6, [r4, #-456]!
     72   2c:   0000000a    andeq   r0, r0, sl
     73 Disassembly of section .comment:
     74 
     75 00000000 <.comment>:
     76    0:   43434700    cmpmi   r3, #0  ; 0x0
     77    4:   4728203a    undefined
     78    8:   2029554e    eorcs   r5, r9, lr, asr #10
     79    c:   2e342e33    mrccs   14, 1, r2, cr4, cr3, {1}
     80   10:   Address 0x10 is out of bounds.
     81 

三、各变量存储的段

	const int  g_test1 =0x123;		//.rodata
        unsigned int g_test2 = 0xabc;	//.data
	char g_test3[] = "asdfghjkl";	//.data
	char g_test4[10];				
	char *g_test = "zzxcvcb";		//.data
	static int g_test5 = 12;		//.data
	static int g_teat6;				//.bss
	int main(void)
	{
		const char loc_test6 = 'a';	//.stack
		int loc_test1 = 0x89;		//.stack
		char loc_test2[] ="okminhbh";//.stack
		char  *loc_test3 = "1234545";//.stack
		int loc_test4;				//.stack
		int loc_test5 = 0;			//.stack
		static int  loc_test8 = 5;	//.data
		static int  loc_test7;		//.bss
		
		return 0;
	

总结:

.text

代码段   

.data

初始化的全局变量、初始化的静态变量

.rodata

const全局只读量

.bss

未初始化的全局变量、初值为0的全局变量、未初始化的静态变量

.comment

注释

stack

函数内局部变量、const局部只读量

在实际应用中.bss段和.comment段并不保存在bin文件中,在代码重定位时将.bss段清零。const定义的局部常量与全局常量存储的位置不同,一个在data段一个在栈区。

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值