C语言中的赋值,取值,在汇编看来都是先取到要操作元素的地址,然后根据地址操作元素,元素为基本数据类型。
结构体赋值
struct persion
{
char sex;
char name[8];
int height;
};
int fun(void)
{
struct persion per;
per.sex='m';
per.name[0]='a';
per.name[1]='d';
per.name[2]=0;
per.height=170;
return 0;
}
汇编代码
pushl %ebp
movl %esp, %ebp
subl $16, %esp
//per.sex='m';
movb $109, -16(%ebp)
//per.name[0]='a';
movb $97, -15(%ebp)
//per.name[1]='d';
movb $100, -14(%ebp)
//per.name[2]=0;
movb $0, -13(%ebp)
//per.height=170;
movl $170, -4(%ebp)
//返回值
movl $0, %eax
leave
ret
结构体指针赋值
struct persion
{
char sex;
char name[8];
int height;
};
int fun(void)
{
struct persion per;
struct persion *p;
p=&per;
p->sex='m';
p->name[0]='a';
p->name[1]='d';
p->name[2]=0;
p->height=170;
return 0;
}
汇编代码
pushl %ebp
movl %esp, %ebp
subl $32, %esp
//&per
leal -20(%ebp), %eax
//p=&per
movl %eax, -4(%ebp)
//p->sex='m'
movl -4(%ebp), %eax
movb $109, (%eax)
//p->name[0]='a';
movl -4(%ebp), %eax
movb $97, 1(%eax)
//p->name[1]='d';
movl -4(%ebp), %eax
movb $100, 2(%eax)
//p->name[2]=0;
movl -4(%ebp), %eax
movb $0, 3(%eax)
//p->height=170;
movl -4(%ebp), %eax
movl $170, 12(%eax)
//返回值
movl $0, %eax
leave
ret
结构体复制
struct persion
{
char sex;
char name[8];
int height;
};
int fun(void)
{
struct persion per={'m',{'a','d',0},170};
struct persion per2;
per2=per;
return 0;
}
汇编代码
pushl %ebp
movl %esp, %ebp
subl $32, %esp
//per赋值为0
movl $0, -16(%ebp)
movl $0, -12(%ebp)
movl $0, -8(%ebp)
movl $0, -4(%ebp)
//per.sex='m';
movb $109, -16(%ebp)
//per.name[0]='a';
movb $97, -15(%ebp)
//per.name[1]='d';
movb $100, -14(%ebp)
//per.height=170
movl $170, -4(%ebp)
//per2=per
movl -16(%ebp), %eax
movl %eax, -32(%ebp)
movl -12(%ebp), %eax
movl %eax, -28(%ebp)
movl -8(%ebp), %eax
movl %eax, -24(%ebp)
movl -4(%ebp), %eax
movl %eax, -20(%ebp)
movl $0, %eax
leave
ret
由于per结构体大小是4的倍数(这是编译器规定的),所以使用movl -16(%ebp), %eax,movl %eax, -32(%ebp)来赋值。