5.1.1
汇编指令是机器指令的汇编表示形式,即符号表示。
机器指令和汇编指令一一对应,它们都与具体机器结构有关,都属于机器级指令。
5.1.2
整理gcc常用选项
- -E 只进行预处理,不编译
- -S 只编译,不汇编
- -C 只编译,汇编,不链接
- -g 包含调试信息
- -I 指定include包含文件的搜索目录
- -o 输出成指定文件名
优化选项
-O0:关闭所有优化选项
-O1:第一级别优化,使用此选项可使可执行文件更小、运行更快,并不会增加太多编译时间,可以简写为-O
-O2:第二级别优化,采用了几乎所有的优化技术,使用此选项会延长编译时间
-O3:第三级别优化,在-O2的基础上增加了产生inline函数、使用寄存器等优化技术
-Os:此选项类似于-O2,作用是优化所占用的空间,但不会进行性能优化,常用于生成最终版本
目标文件可用 objdump -d test.o 反汇编为汇编语言程序
test:可执行目标文件
test.o:可重定位目标文件 //还没有链接
两者都是二进制代码文件
可见两者的主要区别是地址。
可执行文件的地址是一个确切的值-虚拟地址。
关于ISA 指令集架构
ISA是一种规约,规定了指令如何使用硬件。它是一种可执行的指令的集合。
包括:
- 指令格式,操作种类以及每种操作对应的操作数的相应规定。
- 指令可以接受的操作数的类型
- 操作数所能存放的寄存器组的结构,包括每个寄存器的名称,编号,长度和用途
- 操作数所能存放的存储空间的大小和编址方式
- 操作数在存储空间存放是按照大端还是小端方式存放
- 寻址方式
- 指令执行过程的控制方式,包括程序计数器,条件码定义等。
不同ISA 规定的指令集不同,如,IA-32、MIPS、ARM等,计算机组成必须能够实现ISA规定的功能,如提供GPR、标志、运算电路等
同一种ISA可以有不同的计算机组成,如乘法指令可用ALU或乘法器实现
5.2.2
IA-32架构由16位架构发展而来,因此,虽然字长位32位或更大,但一个字为16位,长度后缀为w;32位为双字,长度后缀为l
long double实际长度为80位,但分配96位=12B(按4B对齐)
5.2.3 IA32的寻址方式
存储器操作数的寻址方式与微处理器的工作模式有关。
两种工作模式:实地址模式,保护模式
5.2.4 高级语言程序中寻址举例
按nB边界对齐就意味着该操作数存储的地址是n的整数倍。
如: 在linux系统里,double型变量按4B边界对齐,则其只能放在0,4,8,12等等为开始的的地址空间里。
5.2.5IA-32机器指令格式
6.1.1常用传送指令
栈由高地址向低地址增长。
小端方式是把最低有效字节放在低地址上
注意前面是源,后面是目的。
6.1.2值得一看再看
6.1.3
6.2.3
addw %bx %ax 是把寄存器ax里的内容和寄存器bx加起来放在寄存器ax里