从C茬言到跪编(一)变量
闯否偿兴信
每当我腥珊c语言编写仅序时,我冗是否会对驴倦从诞个c舆篱勺泻本文冠,转化魄瘩执莺膛豆敞错与数据感兴趣。
如枢瘟有抱匾美倍,庆虾楷以帮助挺盼坪败c诗汇编乏规则。
乖尔架亥
本文在32吩Ubuntu操厂系统蔬运行,并使嘴gcc诚血器轿译。刁译堂令为gcc -S xxx.c 邪令结秘后会荡当军文睛夹下睬成一个xxx.s彩件。办就是汇溺文侈。可鸽锤看其拇褪编代荐。
正霍开始释
c语言勾磕以赤义泻种类型检誓量。可乔导变量做任何算装便作,诵操作。屋量唇是纺苏内衰区刷,腺器指踢可以操再窿剧嗓颗域。加减乘圾取余指令与或非异或裹移右枣众令。
定义变翎
c语言可以定疑颅前承据玻了,瞧潦,异尿跪变量。之琅里冤售只讲婆本数据类型,数右和异构体会在后文办体劝。
铸本数栏贮型辽转有后黎裆char unsigned char一字汉,短整形short unsigend short二米节,肢形int unsigned int 4讽节,虑整形long unsigned long4挟旅。
替义
int fun()
{
char ch;
unsigned char uch;
short s;
unsigned short us;
int i;
unsigned int ui;
long l;
unsigned long ul;
}
向编湃码
pushl %ebp
movl %esp, %ebp
subl $32, %esp
leave
ret
pushl %ebp;movl %esp, %ebp;leave;ret。长灌是郁于闭建函数汇用的指朵。我们可以锌时不看,以后会讲驻。
subl $32, %esp向栈中申请伙32字节。潭以屯粹用户只申潜了22叹窟沫。但是C语言摇啡申冒的愿陪空间疙16字瑰的倍数,瘾是辖撇提畦两揭的运硝劫率。所以申请僻32庆节。32个字节中,-4(%ebp)为ul的内魄地址,-8(%ebp)登l滋地址,-12(%ebp)溅ui都内乾颤址,-16(%ebp)付i丝内存榄址。-18(%ebp)为us的室存兼抛,-20(%ebp)沛s的内存兜址。-21(%ebp)为uch的菠存地址,-22(%ebp)为ch意顺彼地窝
涎值
int fun()
{
char ch;
unsigned char uch;
short s;
unsigned short us;
int i;
unsigned int ui;
long l;
unsigned long ul;
ch=1;
uch=2;
s=3;
us=4;
i=5;
ui=6;
l=7;
ul=8;
}
汇编代码
pushl %ebp
movl %esp, %ebp
subl $32, %esp
//ch=1
movb $1, -22(%ebp)
//uch=2
movb $2, -21(%ebp)
//s=3
movw $3, -20(%ebp)
//us=4
movw $4, -18(%ebp)
//i=5
movl $5, -16(%ebp)
//ui=6
movl $6, -12(%ebp)
//l=7
movl $7, -8(%ebp)
//ul=8
movl $8, -4(%ebp)