1.程序编码
unix> gcc -o1 -s p1.c //生成汇编文件p1.c,但不做其他进一步的工作

unix> gcc -o1 -c p1.c //生成目标代码文件 p1.o

unix> gcc -o1 -o p p1.c p2.c //生成可执行代码文件p,其中不仅包含两个
//过程的代码,还包含了用来启动和终止程序的
//信息,以及用来与操作系统交互的信息

unix> objdump -d p1.o //通过反汇编器(disassembler)根据.o文件生成一种
//类似汇编代码的格式。反汇编器只基于机器代码文件
//中的字节序列来确定汇编代码,不需要访问程序的源码
1
2
3
4
5
6
7
8
9
10
11
编译选项-o1告诉编译器使用第一级优化。提高优化级别会使最终程序运行得更快,但是编译时间可能会更长,用调试工具对代码进行调试会更加困难。从得到的程序性能方面考虑,第二级优化-o2被认为是最好的选择

机器级编程抽象:1)机器级程序的格式和行为,定义为指令集体结构(Instruction Set Architecture,ISA) 2)机器级程序使用的存储器地址是虚拟地址

2.数据格式
在这里插入图片描述
大多数GCC生成的汇编代码指令都有一个字符后缀,表明操作数的大小。

3.访问信息
64位的CPU包含一组16个存储64位值的通用寄存器。%r8~%r15为64位CPU新加入的寄存器。
在这里插入图片描述

3.1 操作数指示符
立即数(Immediate):常数值
寄存器(Register):表示某个寄存器的内容
存储器(Memory):引用,它会根据计算出来的地址(有效地址)访问某个存储器位置
在这里插入图片描述

3.2 数据传送指令
简单传送
在这里插入图片描述
movl -17,(%esp) //Immediate--Memory, 1 byte
movq %rax,-12(%rbp) //Register--Memory, 8 bytes
1
2
3
4
5
传送符号扩展的字节
在这里插入图片描述

传送零扩展的字节
在这里插入图片描述

movz和movs指令类都是将一个较小的源数据复制到一个较大的数据位置,高位用符号位扩展或者零扩展进行填充