基础
- CPU内部
EU | 通用寄存器 | AX、BX、CX、DX |
SI、DI | ||
SP(栈顶地址)、BP(栈底地址) | ||
标志寄存器(9个标志位) | SF(运算结果为负时,标志为1) | |
ZF(运算结果为0时,标志为1) | ||
OF(运算时,操作数溢出时,标志为1) | ||
CF(运算时,最高位进位了,标志为1) | ||
PF(操作数中1的个数为偶时,标志为1) | ||
AF(运算时,第三位进位时,标志为1) | ||
DF(串处理时的方向标志) | ||
IF(中断开关) | ||
TF(单步调试,为1时每条指令执行后产生陷阱) | ||
ALU | ||
BIU | 段寄存器 | CS(代码段)、DS(数据段)、ES(辅助段)、SS(堆栈段) |
指令寄存器 | IP(包含下一条指令的地址) | |
指令队列 |
-
高地址对应高字节(高高低低)。
-
物理地址 = 段地址 * 16 + 偏移地址。
-
CPU的两种模式:
- 实模式:8086以及之前的CPU、1M寻址、单任务、DOS系统。
- 保护模式:
- 物理地址 = 段选择子(16位) + 编译地址(32位)。
- 段选择子 = GDT(段描述表)索引。
- 段描述表 = 段描述符集合,全局可见。
- 段描述符 = 段地址 + 段大小 + 权限 + 其他。
-
汇编组成:
- 汇编指令:机器码助记符,不分大小写。
- 伪指令:编译器执行。
- 其他符号:编译器识别。
汇编指令
- mov 指令
作用:将src中的数据传输到dst中。
mov dst(mem\reg) src(mem\reg\data) | 两边不能都为mem |
movsx dst(mem\reg) src(mem\reg\data) | 两边不能都为mem |
movzx dst(mem\reg) src(mem\reg\data) | 两边不能都为mem |
- push、pop、xchg指令
作用:操作堆栈。
push src | src进栈,sp-2(16位),sp-4(32位) |
pop dst | 出栈, sp+2(16位),sp+4(32位) |
xchg a b | a b交换,必须有一个是寄存器 |
- in、out、xlat 指令
in、out用于在cpu和ios之间传输数据的,io端口号为0-65535,0-255可以直接写数字,大于255的必须通过dx传递。
in al 端口号 | 从端口读取1字节的数据到al中 |
out 端口号 al | 发送al中的数据到端口中 |
xlat | 把DX + BX + AL的地址中的内容送入AL中 |
- 地址传输指令
lea 目标寄存器 [内存地址]/[寄存器] | 把偏移地址放入目标寄存器中 |
lds 目标寄存器 [内存地址]/[寄存器] | 把地址存的内容的高16位放入DS中,低16位放入目标寄存器中 |
les 目标寄存器 [内存地址]/[寄存器] | 把地址存的内容的高16位放入ES中,低16位放入目标寄存器中 |
lfs 目标寄存器 [内存地址]/[寄存器] | 把地址存的内容的高16位放入FS中,低16位放入目标寄存器中 |
lgs 目标寄存器 [内存地址]/[寄存器] | 把地址存的内容的高16位放入GS中,低16位放入目标寄存器中 |
lss 目标寄存器 [内存地址]/[寄存器] | 把地址存的内容的高16位放入SS中,低16位放入目标寄存器中 |
- 标志寄存器传输指令
lahf | 标志进入AH中 |
sahf | AH进入标志中 |
pushf | 标志进栈 |
popf | 标志出栈 |
- 类型转换指令
cbw | 将AL扩展到AH中,高位为0则扩展全为0,高位为1则扩展全为1,AL部分不变 |
cwd | 将AX扩展到DX中,高位为0则扩展全为0,高位为1则扩展全为1,AX部分不变 |
cdq | 将EAX扩展到EDX中,其他同上 |
bswap 寄存器 | 寄存器中的内容按字节反转 |
- 加法指令
add dst src | src + dst 赋值到dst中 |
adc dst src | src + dst + cf 赋值到dst中 |
inc dst | 加1 |
xadd dst src | 把src+dst赋值到dst中 ,把dst原来的值赋值到src中 |
- 减法指令
sub dst src | dst = dst - src |
sbb dst src | dst = dst - src - cf |
dec dst | 减1 |
neg dst | 求补 |
cmp dst src | 比较dst和src,如果相等则zf=1,如果小于则cf=1 |
cmpxchg dst src | 比较dst和src且交换,如果相等则zf=1,如果小于则cf=1 |
cmpxchg8b dst src | 比较dst和src且交换8字节,如果相等则zf=1,如果小于则cf=1 |
- 乘法指令
mul src | 无符号乘法 | al * src -> ax | src为8位 |
ax * src -> dx ax | src为16位 | ||
eax * src -> edx eax | src为32位 | ||
imul src | 有符号乘法 |
- 除法指令
div src | 无符号除法 | ax / src 商->al,余数->ah |
idiv src | 有符号除法 |
- 逻辑指令
and dst, src | dst 与运算 src -> dst |
or dst, src | dst 或运算 src -> dst |
not opr | opr 取反 -> opr |
xor dst, src | dst 异或 src -> dst |
test opr1, opr2 | opr1 与 opr2 -> 标志寄存器 |