/************************022 数组初始化 ***********************
* C语言精彩编程百例 第 22 */
#include<stdio.h>
void main()
{
int array1[10]={0,1,2,3,4,5,6,7,8,9};
char array2[13]="How are you!";
char array3[13]={'H','o','w',' ','a','r','e',' ','y','o','u','!'};
int array4[4][4]=
{
12,18,6,25,
23,10,32,16,
25,63,1,63,
0,0,27,98
};
char array5[]="How are you!";
int array6[][2]=
{
{1,50},
{45,2},
{2,0},
{12,32},
{42,33},
{15,18}
};
}
对应的汇编
.file "022.c"
.def ___main; .scl 2; .type 32; .endef
.text
.align 4
LC1:
.long 12
.long 18
.long 6
.long 25
.long 23
.long 10
.long 32
.long 16
.long 25
.long 63
.long 1
.long 63
.long 0
.long 0
.long 27
.long 98
.align 4
LC2:
.long 1
.long 50
.long 45
.long 2
.long 2
.long 0
.long 12
.long 32
.long 42
.long 33
.long 15
.long 18
LC0:
.ascii "How are you!\0"
.align 2
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
subl $208, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -204(%ebp)
movl -204(%ebp), %eax
call __alloca
call ___main
movl $0, -56(%ebp) #array1[0]
movl $1, -52(%ebp)
movl $2, -48(%ebp)
movl $3, -44(%ebp)
movl $4, -40(%ebp)
movl $5, -36(%ebp)
movl $6, -32(%ebp)
movl $7, -28(%ebp)
movl $8, -24(%ebp)
movl $9, -20(%ebp)
movl LC0, %eax # %eax = "How "
movl %eax, -72(%ebp) # array[0]
movl LC0+4, %eax # %eax = "are "
movl %eax, -68(%ebp) # array[4]
movl LC0+8, %eax # %eax = "you!"
movl %eax, -64(%ebp) # array[8]
movb LC0+12, %al # %eax = "\0"
movb %al, -60(%ebp) # %eax[12]
movl $0, -88(%ebp) # array3={}
movl $0, -84(%ebp)
movl $0, -80(%ebp)
movb $0, -76(%ebp) # 不太明白这里为什么是movb 不是movl
movb $72, -88(%ebp) #'H'
movb $111, -87(%ebp) #'o'
movb $119, -86(%ebp) #'w'
movb $32, -85(%ebp)
movb $97, -84(%ebp)
movb $114, -83(%ebp)
movb $101, -82(%ebp)
movb $32, -81(%ebp)
movb $121, -80(%ebp)
movb $111, -79(%ebp)
movb $117, -78(%ebp)
movb $33, -77(%ebp) #'!'
leal -152(%ebp), %edi #
movl $LC1, %esi # esi
cld # 清方向标志,把标识寄存器的D位置呈零,告诉后面的命令:字符串向高地址取得。
movl $16, %eax #
movl %eax, %ecx # 16个单元
rep
movsl
movl LC0, %eax # array5和array2的处理方式一样
movl %eax, -168(%ebp)
movl LC0+4, %eax
movl %eax, -164(%ebp)
movl LC0+8, %eax
movl %eax, -160(%ebp)
movb LC0+12, %al
movb %al, -156(%ebp)
leal -216(%ebp), %edi #edi设置为array6[0]
movl $LC2, %esi
cld
movl $12, %eax
movl %eax, %ecx
rep
movsl
leal -8(%ebp), %esp
popl %esi
popl %edi
popl %ebp
ret