- UID
- 1029342
- 性别
- 男
|
以下是一个简单的c文件,环境是OS--Linux,ARCH--PPC
##sta.c###
#include <stdio.h>
int kk[100] = {1,2,3,4,5};
int tt[100];
int ii;
int main()
{
int i;
static int si;
char a[10]= "abcd";
printf("i is %d/n");
return 0;
}
经过gcc -S sta.c之后,生成的汇编代码如下
##sta.s###
.file "sta.c"
.gnu_attribute 4, 2
.gnu_attribute 8, 3
.globl kk
.section ".data"
.align 2
.type kk, @object
.size kk, 400
kk:
.long 1
.long 2
.long 3
.long 4
.long 5
.zero 380
.lcomm si.2254,4,4
.type si.2254, @object
.section .rodata
.align 2
.LC1:
.string "i is %d/n"
.align 2
.LC0:
.string "abcd"
.zero 5
.section ".text"
.align 2
.globl main
.type main, @function
main:
stwu 1,-32(1)
mflr 0
stw 0,36(1)
stw 31,28(1)
mr 31,1
lis 9,.LC0@ha
la 9,.LC0@l(9)
lwz 0,0(9)
lbz 9,4(9)
stw 0,12(31)
stb 9,16(31)
li 0,0
stb 0,17(31)
li 0,0
stb 0,18(31)
li 0,0
stb 0,19(31)
li 0,0
stb 0,20(31)
li 0,0
stb 0,21(31)
lis 9,.LC1@ha
la 3,.LC1@l(9)
crxor 6,6,6
bl printf
li 0,0
mr 3,0
lwz 11,0(1)
lwz 0,4(11)
mtlr 0
lwz 31,-4(11)
mr 1,11
blr
.size main, .-main
.comm tt,400,4
.comm ii,4,4
.ident "GCC: (GNU) 4.2.3"
.section .note.GNU-stack,"",@progbits
Note: 一般编译器和操作系统实现来说,对于虚拟地址空间的最低(从0开始的几K)的一段空间是未被映射的,也就是说它在进程空间中,但没有赋予物理地址,不能被访问。这也就是对空指针的访问会导致crash的原因,因为空指针的地址是0。至于为什么预留的不是一个字节而是几K,是因为内存是分页的,至少要一页;另外几k的空间还可以用来捕捉使用空指针的情况。 |
|