目录
程序的机器级表示:
程序编码:
C语言 ---【预处理器】---> 扩展后的C ---【编译器】---> 汇编语言 ---【汇编器】---> 二进制目标文件 ---【链接器】---> 可执行文件
对于机器级编程的两种抽象:
- 指令集架构将程序的行为抽象成每条指令按顺序执行
- 内存模型抽象成非常大的字节数组
机器代码可见的处理器状态:
程序计数器、整数寄存器、条件码寄存器、向量寄存器
数据格式:
字表示16位,32位双字,64位四子,不同数据类型大小不同,汇编后缀也不同
64位机器里面一个指针8个字节
访问信息
寄存器:
一个X86-64的cpu包含一组16个存储64位值的通用目的寄存器:
- 部分指令会在寄存器中生成小于8个字节的指令,生成1个字节、2个字节的指令会保持剩下的字节不变,生成4字节数字的指令会把高位4个字节置为0。
操作数:
一个指令有>=1个操作数.
三种类型:立即数、寄存器、内存引用
- 寄存器用类似数组的R[r]来表示,寄存器名就是索引,R[r]表示寄存器存储的值
- %rax是表示寄存器里存的值0x100,(%rax)表示内存里0x100位置处的值。
- 64位机器里不能用32位寄存器来寻址:(%ebx)非法
数据传送指令:
MOV S,D
前面是源操作数:立即数,寄存器里的值,内存里的值
源操作数表示的是值,如果源操作数为%rax,表示寄存器里的值,如果源操作数为(%rax),表示间接寻址内存里的值
后面是目标操作数:寄存器、内存地址
后面是存储数据的位置,如果目标操作数为%rax,表示放到寄存器里,如果源操作数为(%rax),表示放到间接寻址后的内存地址里。
- Movb, movw, movl, movq表示对于操