总线:
地址总线
8086 16位结构,却要进行20位地址总线寻址。所以使用了段地址+偏移地址两个16位寄存器来通过地址加法器生成20位物理地址达到20位寻址能力
数据总线
控制总线
CPU:
运算器
控制器
寄存器
控制器控制各种器件运行
寄存器负责进行信息存储
运算器进行信息处理
总线链接各种器件
寄存器:
通用寄存器:SI、DI、AX、BX、CX、DX(H、L拆分寄存器字节)
段寄存器:CS、SS、DS、ES
指令寄存器:IP
栈寄存器:SP、BP
标志寄存器:PSW
BX、BP、SI、DI:
以用来进行内存单元寻址。其他的不行
组合只能是[SI、DI]与[DX、BP]两个任意抽一个组合。不能其他组合
使用BP的时候,段寄存器默认使用SS而不是DS。
CX:
在loop指令时用来进行是否loop判定
CS+IP:CPU中最为关键的两个寄存器。实现代码寻址
CS:代码段寄存器
IP: 指令指针寄存器
代码地址: CS*16+IP 或者书写成CS:IP
DS: 段地址
对于一个地址进行操作实际访问的是 DS*16+[ADDR]
但是无法通过mov ds 数据 来设置DS。CPU内部设计问题
只能是 Mov bx xxx; mov ds bx
SS+SP: 用来标记当前的栈顶资源 SS:SP。
栈由高地址往低地址访问。 每次push操作sp都自动进行-x操作
SP当前指向的内存已经被使用了,如需继续存储需要先进行--
SS+BP: 栈底寻址
PSW:
CF
PF: 计算结果比特1数量是否为偶数
AF
ZF:计算结果是否为0
add, mul, div, inc, or ,and
SF: 计算结果是否负数
TF
IF
DF
OF
寻址:大部分指令都是进行数据处理。地址有3种表达方式。
立即数
寄存器
段+偏移量
数据长度:
如果存在寄存器。使用寄存器表明操作数据长度
如果没有寄存器,则可以使用类型 PTR来指明数据操作长度
栈操作固定数据长度
指令列表:
指令集:
MOV
int
push
pop
add
div 除数:
被除数默认放在AX中或者DX-AX。8位AL放着商,AH放着余数。16位AX放着商,DX放着余数。
sub
loop 标号:
短转移。用CX来作为判断条件。CX!=0,则CX--,然后转移
jmp
jmp [short/near ptr/far ptr/] 标号: 无条件转移
jmp short 偏移量:
EB BYTE 进行1字节量的前后偏移
jmp near 偏移量
E9 WORD 进行两字节量的偏移
jmp far ptr 标号
EA 2字节IP 2字节CS 进行长转
jmp word ptr 内存地址:段内地址跳转
jmp dword ptr 内存地址:段间地址跳转
jcxz:条件跳转
只有短转移。用CX来作为判断条件。CX=0,转移
call:
call 标号:
sp-=2
ss*16+sp = IP
IP = IP + 偏移
call far ptr 标号:
sp-=2
ss*16+sp = CS
IP = IP + 偏移
sp-=2
ss*16+sp = IP
IP = IP + 偏移
CS = 标号所在段
IP = 标号段中偏移
ret n: 跳转
IP = ss*16 + sp
sp+= (2+n)
retf: 远地址跳转
IP = ss*16 + sp
sp+=2
CS = ss*16 + sp
sp+= (2+n)
操作符:
type ptr
db:定义字节
db 1
db '1975'
dw:定义字
dd:定义双字
dup:进行重复定义。
db 重复次数 dup(0, 1, 2)
dw 重复次数 dup(0, 1, 2)
dd 重复次数 dup(0, 1, 2)
offset 标号: 获取偏移量