1.机器代码

采用指令集体系结构指令集架构定义机器级程序的格式和行为。

  • 程序计数器 : 给出要执行下一条指令在内存中地址

  • 整数寄存器 : 存储地址或整数数据

  • 条件码寄存器 : 最近执行的算术或逻辑指令的状态信息

  • 向量寄存器 : 存放一个或多个整数或浮点值

2.常见汇编指令

  1. 制作数指令符
类型 格式 操作数值 名称
立即数 $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] 比例变址寻址
  1. 数据传送
指令 操作数 描述
MOV 传送
movb 传送字节
movw 传送字
movl 传送双字
movq 传送四字
movabsq 传送绝对四字
—— —— ——
MOVZ 以零拓展传送
—— —— ——
MOVS 以符号拓展传送
  1. 压栈和弹栈
指令 操作数 描述
pushq S 将四字压入栈
popq D 将四字弹出栈
  1. 算术与逻辑
指令 操作数 效果 描述
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) 逻辑右移
  1. 控制

条件码检测属性

  • CF : 进位标志,可用来检查无符号操作溢出
  • ZF : 零标志
  • SF : 符号标志,最近操作结果为负
  • OF : 溢出标志,最近操作补码溢出
指令 操作数 描述
CMP S1,S2 比较
TEST S1,S2 测试
SET D 根据条件码组合将一个字节设置为0或1
  1. 跳转
指令 操作数 描述
jmp Label 直接跳转
jmp *operand 间接跳转
je 相等
jne 不想等
js 负数
jns 非负
jg 有符号 大于
jge 有符号 大于等于
jl 有符号 小于
jle 有符号 小于等于
ja 无符号 大于
jae 无符号 大于等于
jb 无符号 小于
jbe 无符号 小于等于

3.运行过程

  • 传递控制

压栈和入栈保证程序正确返回。

RuningStack

  • 传递数据

有些时候局部数据需加载至栈中

  1. 寄存器无法存放所有本地数据
  2. 对一个局部变量取地址
  3. 某些局部变量是数据或结构
  • 分配与释放内存

4.简单的结构

  1. 结构

用struct声明,将多个对象集合值一个单位

结构所有组成存放在一段连续区域内,指向结构指针为结构第一个字节地址,产生偏移进行引用

  1. 联合

用union声明,几种不同类型引用一个对象

用不同的字段引用相同的内存块

5.对抗栈溢出

  1. 栈随机化
  2. 栈破坏检测
  3. 限制可执行代码区域