机器语言
机器代码只是简单地将内存看成一个很大的、按字节寻址的数组。程序内存用虚拟地址来寻址。
机器代码
代码示例
代码的格式
GCC 产生的汇编代码中,所有以 “.” 开头的行我们通常可以忽略,这些行是指导汇编器和链接器工作的伪指令。
访问信息
CPU 中包含一组 16 个 64 位值得通用目的寄存器,用来存储整数数据和指针。其中最特别得是栈指针 %rsp,用来指明运行时栈得结束位置。有一组标准的编程规范控制着如何使用寄存器来管理栈、传递函数参数、传递函数的返回值,以及存储局部和临时数据。

操作数指示符
操作数指示出执行一个操作要使用的源数据值以及放置结果的目的位置。源数据值可以以常数形式给出,或从寄存器或内存中读出。结果可以存放在寄存器或内存中。
有三种类型的操作数:
- 立即数,用来表示常数值,书写方式是 '$' 后面跟一个标准 C 表示法表示的整数
- 寄存器,表示某个寄存器的内容。用符号 ra 表示任意寄存器 a, 用引用 R[ra] 表示它的值
- 内存引用,会根据计算出的有效地址访问某个内存位置。用符号 Mb[Addr] 表示对内存中从地址 Addr 开始的 b 个字节值的引用,通常省去下表 b。最常用的是 Imm(rb, ri, s) 这种形式,它有四个组成部分:一个立即数偏移 Imm, 一个基址寄存器 rb, 一个变址寄存器 ri 和一个比例因子 s, s 必须是 1、2、4、8。基址和变址必须是 64 位寄存器。有效地址计算为 Imm + R[rb] + R[ri] * s。引用数组元素时,会用到这种通用形式。其他形式都是这种通用形式的特殊情况。

数据传送指令
数据传送指令是将数据从一个位置复制到另一个位置的指令。把这些指令分为指令类,每一类中的指令执行相同的操作,只不过操作数大小不同。
MOV 类指令:把数据从源位置复制到目的位置,不做任何变化。源操作数指定的值是一个立即数,存储在寄存器或内存中。目的操作数指定一个位置,是一个寄存器或内存地址。movb、movw、movl、movq 操作的数据大小分别为 1、2、4、8 字节。

下面给出源和目的类型的五种可能的组合:

压入和弹出栈数据
位运算
00000000 00000000 00000000 00000000
00000000 00000000 00000000 01101000 <<16
00000000 01101000 00000000 00000000 >>18
00000000 00000000 00000000 00011010 &00111111
00000000 00000000 00000000 00011010