1、历史观点
2、程序编码
命令gcc---GCC C、C++编译器。是Linux上默认的编译器。
gcc命令调用一系列程序,将源代码转化成可执行代码:
Ø 首先,C预处理器扩展源代码*.c,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏。
Ø 然后,编译器产生两个源代码的汇编代码,名字为*.s
Ø 接下来,汇编器将汇编代码转化成二进制目标代码(机器代码的一种形式)文件名为*.o
Ø 最后,衔接器将两个目标代码文件与实现库函数的代码合并,并产生最终的可执行代码文件。
2.1、机器级代码
机器代码:二进制格式
汇编代码:用可读性更好的文本格式来表示。
一条机器指令值执行一个非常基本的操作。
2.2、代码示例
code.c
在命令行上使用“-S”选项,gcc将*.c文件编译器产生汇编代码,产生*.s的可读汇编代码文件
gcc -o1 –S code.c
在命令行上使用“-C”选项,gcc将*.c文件编译并汇编该代码,产生目标代码文件*.o的二进制格式。
gcc –o1 –C code.c
反汇编器(disassembler)用于查看目标代码文件的内容,将目标文件反汇编为汇编代码文件*.s
objdump –d code.o
生成可执行文件
gcc –o1 –o main.c prog
2.3、关于格式的注解
3、数据格式
Intel 用术语“字”(word)表示16位数据类型。
32位数为“双字”(double words),64位数为“四字”(quadwords)。
汇编代码指令都有一个字符后缀,表明操作数的大小。
数据传送指令有三个变种:movb传送字节、movw传送字、movl传送双字。
4、访问信息
寄存器:用来存储整数数据和指针。
IA32CPU包含一组8个存储32位值的寄存器。以%e开头。
前6个寄存器是通用寄存器,最后两个寄存器保存指向程序栈中重要位置的指针。
4.1、操作数指示符
操作数operand
三种类型:
Ø 立即数(immediate)也就是常数值。
Ø 寄存器(register)表示某个寄存器的内容。
Ø 存储器引用(memory)根据计算出来的地址(寻址方式),访问某个存储器位置。
4.2、数据传送指令
MOV类中的指令,将源操作数的值复制到目的操作数中。
源操作数:指定的值是一个立即数,存储在寄存器或者存储器中。
目的操作数:指定一个位置,寄存器或者存储器地址。
程序栈:通过push和pop操作,程序栈存放在存储器中的某个区域。
在C语言中:
Ø “指针”其实就是地址
Ø 间接引用指针就是将该指针存放在一个寄存器中,