课前复习
硬件基础
- 通用寄存器:
- 8位 : ah,al,ch,cl,dh,dl,bh,bl
- 16位: ax,cx,dx,bx,sp,bp,si,di
- 32位: eax,ecx,edx,ebx,esp,ebp,esi,edi
- 指令指针寄存器: eip
- 标志寄存器 : eflags
- 状态标志位
- CF - 进位标志( 条件: 结果的最高进位被置1)
- OF - 溢出标志( 条件: 次高位进位 , 再与最高位进行异或,结果为1则置1.)
- SF - 符号标志(条件: 取结果的最高位作为sf的值)
- ZF - 零标志(条件: 结果为0则置1)
- AF - 辅助进位标志
- PF - 奇偶标志
- 控制标志位
- DF - 方向标志(控制串操作的地址是递增,还是递减)
- IF - 中断允许标志
- TF - 陷阱标志
- 状态标志位
- 内存管理模式
- 16位 : 分段机制
- 访问内存的时候使用的是逻辑地址, 物理地址的计算方式 :
段基地址*16 + 段内偏移
- 访问不同的内存时, 会使用不同的段寄存器来提供段基地址
mov ax,[1000h]
; 默认使用ds
作为段寄存器mov ax,[bp]
; 含有bp
栈底指针寄存器时,使用ss
作为默认的段寄存器mov ax,[bx]
: 默认使用ds
作为段寄存器- 如果默认的段寄存器是
ds
,那么这个默认段寄存器可以被修改:mov ax,ss:[1000h]
- 访问内存时,
[]
内的寄存器的组合是有限的. 只能使用bp
,bx
,si
,di
寄存器.
- 访问内存的时候使用的是逻辑地址, 物理地址的计算方式 :
- 32位 : 使用保护模式机制
- 段寄存器保存的段选择子
- 仍然使用分段机制的方式计算地址:
段基地址*16 + 段内偏移
, 但是所有的段基地址都是0 , 所以, 32位模式的内存管理模式也被称为平坦模式. - 使用内存操作数时, 在
[]
内可以使用多种寄存器的组合(参考32位汇编的寻址模式)
- 16位 : 分段机制
指令基础
- 指令的组成:
- 操作码(助记符)
- 操作数
- 只有三种类型: 立即数, 寄存器, 内存操作数(使用[]表示)
- 指令原型说明符(用于说明指令的操作数可以是什么类型):
imm
- 立即数reg
- 寄存器seg
- 段寄存器mem
- 内存操作数.- 大小说明符(决定指令的操作数是什么大小(字节/字/双字))
- 8 - 字节(例如:
imm8
,reg8
,mem8
)- reg8 表示只能接受大小是8位的寄存器,例如: ah,bh,cl…
mem8
表示只能接受大小是8位的内存操作数, 例如:byte ptr [1000]
, 所以byte ptr
是表示内存操作数的大小.
- 16 - 2字节的操作数
- 32 - 4字节的操作数
- 8 - 字节(例如:
- 指令的两个操作数, 一般不能同时都是内存操作数.
- 算术运算指令:
- 加 : add
- 减 : sub
- 乘 : mul / imul(有符号乘法指令)
- 除 : div (也包括了取余)
- 自增: inc
- 自减 : dec
- 位运算
- and - 按位与
- or - 按位或
- xor - 按位异或
- not - 按位取反
- shl - 左移
- shr - 右移
- 数据传送指令
- mov - 赋值
- lea - 取地址
- xchg - 交换两个操作数
- push - 将数据压入栈,esp被减去和操作数一样的大小
- pop - 将数据弹出栈,保存到操作数中,esp被增加和操作数一样的大小
- pushf - 将标志寄存器入栈
- popf - 将栈顶数值弹出到标志寄存器中
- pushad - 将所有通过寄存器压入栈中,顺序: eax,ecx,edx,ebx,esp,ebp,esi,edi
- popad - - 将栈中元素弹出到所有的通过寄存器中,弹出顺序和压入顺序相反.
32位的寻址模式
用于确定指令中使用什么操作数.
- 立即数寻址
- 寄存器寻址
- 存储器寻址
- 直接寻址
- 寄存器间接寻址
- 寄存器相对寻址
- 基址变址寻址
- 相对基址变址寻址
- 带比例因子寻址
串操作指令
- 重复前缀: rep/repe/repne
- 默认操作数: ecx 保存重复的次数
- repe/repne 有一个附加条件:
zf
标志位的值也会影响指令是否继续重复
- movs - 串移动指令(相当于memcpy)
- stos - 串存入指令(相当于memset)
- 默认操作数 : edi
- 默认操作数: al/ax/eax
- lods - 串取出指令
- 默认操作数: esi
- 默认操作数: al/ax/eax
- 将esi指向的内存取出存入到al/ax/eax中.
- cmps - 串比较指令 ( 类似:memcmp)
- 默认操作数: edi
- 默认操作数: esi
- 取esi和edi的值进行比较, 根据比较的结果设置状态标志位. 不保存比较的结果.
控制转移指令
- loop 循环指定次数
- 默认操作数: ecx 保存着循环的次数, 每循环一次,ecx就递减1,ecx等于0就不在循环.
- jmp 无条件转移指令
- 间接修改eip, 使程序转移到其它位置执行代码
- call 函数调用指令
- 调用前, 先将返回地址(call指令的下一条指令)压入栈中
- 跳转到目标地址
- ret 函数返回指令
- 调用时, 将栈顶的值作为返回值弹出到eip
- eip指向了哪里,就在哪个地方继续执行代码
ret 立即数
- 函数返回指令- 调用时, 将栈顶的值作为返回值弹出到eip
- 再将栈顶指针寄存器
esp
加上立即数 - 最后走到eip保存的位置继续执行代码
JCC指令(条件跳转指令)
- 无符号跳转指令
- 有符号跳转指令
- 其它指令