1.机器代码
采用指令集体系结构或指令集架构定义机器级程序的格式和行为。
-
程序计数器 : 给出要执行下一条指令在内存中地址
-
整数寄存器 : 存储地址或整数数据
-
条件码寄存器 : 最近执行的算术或逻辑指令的状态信息
-
向量寄存器 : 存放一个或多个整数或浮点值
2.常见汇编指令
- 制作数指令符
| 类型 | 格式 | 操作数值 | 名称 |
|---|---|---|---|
| 立即数 | $Imm | Imm | 立即数寻址 |
| 寄存器 | ra | R[ra] | 寄存器寻址 |
| 存储器 | Imm | M[Imm] | 绝对寻址 |
| 存储器 | (ra) | M[R[ra]] | 间接寻址 |
| 存储器 | Imm(rb) | M[Imm+R[rb]] | (基址+偏移量)寻址 |
| 存储器 | (rb,ri) | M[R[rb]+R[ri]] | 变址寻址 |
| 存储器 | Imm(rb,ri) | M[Imm+R[rb]+R[ri]] | 变址寻址 |
| 存储器 | (,ri,s) | M[R[ri]*s] | 比例变址寻址 |
| 存储器 | Imm(,ri,s) | M[Imm+R[ri]*s] | 比例变址寻址 |
| 存储器 | (rb,ri,s) | M[R[rb]+R[ri]*s] | 比例变址寻址 |
| 存储器 | Imm(rb,ri,s) | M[Imm+R[rb]+R[ri]*s] | 比例变址寻址 |
- 数据传送
| 指令 | 操作数 | 描述 |
|---|---|---|
| MOV | 传送 | |
| movb | 传送字节 | |
| movw | 传送字 | |
| movl | 传送双字 | |
| movq | 传送四字 | |
| movabsq | 传送绝对四字 | |
| —— | —— | —— |
| MOVZ | 以零拓展传送 | |
| —— | —— | —— |
| MOVS | 以符号拓展传送 |
- 压栈和弹栈
| 指令 | 操作数 | 描述 |
|---|---|---|
| pushq | S | 将四字压入栈 |
| popq | D | 将四字弹出栈 |
- 算术与逻辑
| 指令 | 操作数 | 效果 | 描述 |
|---|---|---|---|
| leadq | S,D | D=&S | 加载有效地址 |
| INC | D | D=D+1 | 加1 |
| DEC | D | D=D-1 | 减1 |
| NEG | D | D=-D | 取负 |
| NOT | D | D=-D | 取补 |
| ADD | S,D | D=D+S | 加 |
| SUB | S,D | D=D-S | 减 |
| IMUL | S,D | D=D*S | 乘 |
| XOR | S,D | D=D^S | 异或 |
| OR | S,D | D=D | S |
| AND | S,D | D=D&S | 与 |
| SAL | K,D | D=D«K | 左移 |
| SHL | K,D | D=D«K | 左移 |
| SAR | K,D | D=D»K(A) | 算术右移 |
| SHR | K,D | D=D»K(L) | 逻辑右移 |
- 控制
条件码检测属性
- CF : 进位标志,可用来检查无符号操作溢出
- ZF : 零标志
- SF : 符号标志,最近操作结果为负
- OF : 溢出标志,最近操作补码溢出
| 指令 | 操作数 | 描述 |
|---|---|---|
| CMP | S1,S2 | 比较 |
| TEST | S1,S2 | 测试 |
| SET | D | 根据条件码组合将一个字节设置为0或1 |
- 跳转
| 指令 | 操作数 | 描述 |
|---|---|---|
| jmp | Label | 直接跳转 |
| jmp | *operand | 间接跳转 |
| je | 相等 | |
| jne | 不想等 | |
| js | 负数 | |
| jns | 非负 | |
| jg | 有符号 | 大于 |
| jge | 有符号 | 大于等于 |
| jl | 有符号 | 小于 |
| jle | 有符号 | 小于等于 |
| ja | 无符号 | 大于 |
| jae | 无符号 | 大于等于 |
| jb | 无符号 | 小于 |
| jbe | 无符号 | 小于等于 |
3.运行过程
- 传递控制
压栈和入栈保证程序正确返回。

- 传递数据
有些时候局部数据需加载至栈中
- 寄存器无法存放所有本地数据
- 对一个局部变量取地址
- 某些局部变量是数据或结构
- 分配与释放内存
4.简单的结构
- 结构
用struct声明,将多个对象集合值一个单位
结构所有组成存放在一段连续区域内,指向结构指针为结构第一个字节地址,产生偏移进行引用
- 联合
用union声明,几种不同类型引用一个对象
用不同的字段引用相同的内存块
5.对抗栈溢出
- 栈随机化
- 栈破坏检测
- 限制可执行代码区域