C语言 “高级汇编语言”。
汇编语言对应着机器语言,也就是0和1,汇编只是让机器语言更易读。但汇编语言就是一系列的指令,并没有相应的规范来便于人们编写代码,一般人 是想到那就写到哪,代码混乱不堪。
后来有人提出了过程式编程语言,这些语言定义了流程控制语句,分为顺序,循环,分支。并用函数来使程序分成一个个模块。而C语言就是其中翘楚。每句C语言都会被翻译为相应的汇编语言。不相信吗?
随我进入C和汇编的世界吧、
第一章 基本数据类型
C语言有以下基本数据类型。
数据类型 | 数据类型 | 32位系统下字节数 |
---|---|---|
char | unsigned char | 1 |
short | unsigned short | 2 |
int | unsigned int | 4 |
long | unsigned long | 4 |
long long | unsigned long long | 8 |
float | 4 | |
double | 8 |
32位汇编有一下3中mov指令
指令名 | 作用 |
---|---|
movb | 移动一个字节 |
movw | 移动2个字节 |
movl | 移动4个字节 |
int main(void)
{
int num=99;
return num;
}
简单的打印一个整数。而他的汇编呢?
.section rodata
.section text
.globl main
main:
pushl %ebp
movl %esp,%ebp
subl $4,%esp
movl $99,-4(%ebp)
movl -4(%ebp),%eax
movl %ebp,%esp
popl %ebp
ret
main函数以pushl %ebp movl %esp,%ebp 和 movl %ebp,%esp popl %ebp ret开始,结束。运行到subl $4,%esp前栈中的结构是
%esp %ebp-> old %ebp
subl $4,%esp后栈中结构
%esp->空值
%ebp->old %ebp
空值就是num占用的内存。
movl $99,-4(%ebp) 就是 int num=99;
想看到结果则,运行程序
gcc 1.c
./a.out
echo $?
看是否打印99,修改 movl $1,-4(%ebp) 再编译运行看是不是为1。
再看一些其他代码
int main(void)
{
int num1=22;
int num2=33;
int tmp;
tmp=num1;
num1=num2;
num2=tmp;
return num1;
}
看看汇编代码
.section .text
.globl main
main:
pushl %ebp
movl %esp,%ebp
subl $12,%esp
movl $22,-12(%ebp)
movl $33,-8(%ebp)
movl -12(%ebp),%eax
movl %eax,-4(%ebp)
movl -8(%ebp),%eax
movl %eax,-12(%ebp)
movl -4(%ebp),%eax
movl %eax,-8(%ebp)
movl -12(%ebp),%eax
movl %ebp,%esp
popl %ebp
ret
运行到subl $12,%esp前栈中的结构是
%esp-> 空3
空2
空1
%ebp-> old %ebp
subl $12,%esp后栈中结构
%esp-> num1
num2
tmp
%ebp-> old %ebp
movl $22,-12(%ebp) 对应int num1=22;
movl $22,-12(%ebp) 对应int num2=33;
movl $33,-8(%ebp) 对应 int num1=22;
再看一个其他的例子。
关于char类型
int main(void)
{
char ch='A';
return ch;
}
.section .text
.globl main
main:
pushl %ebp
movl %esp,%ebp
subl $1,%esp
movb $'A',-1(%ebp)
movzbl -4(%ebp),%eax
movl %ebp,%esp
popl %ebp
ret
char占用一个字节,所以申请一个字节。subl $1,%esp
int main(void)
{
short s=12;
return s;
}
.section .text
.globl main
main:
pushl %ebp
movl %esp,%ebp
subl $2,%esp
movb $12,-2(%ebp)
movzbl -2(%ebp),%eax
movl %ebp,%esp
popl %ebp
ret
int 占用2个字节,所以申请一个字节。subl $2,%esp