1,初识寄存器
不同的cpu寄存器结构和个数不相同
例如:8086CPU寄存器有14个寄存器:AX,BX,CX,DX,SI,DI,SP,DP,IP,CS,DS,SS,ES,PSW,
AX,BX,CX,DX,通用寄存器,
每个寄存器有16个字节,
一个寄存器可以分成两个寄存器,每个寄存器8位
AX:AH,AL
BX:BH,BL
CX:CH,CL
DX:DH,DL
8086CPU为16位CPU
运算器一次可以处理16位数据,
寄存器的最大宽度为16位
寄存器与运算器之间的通路为16位
16位只能寻址64kb
所以8086使用地址加法器
地址加法器计算方法 物理地址=断地址*16 + 偏移地址
例如:
地址段1H可以寻址的范围是1H*16+0 -- 1H*16+2^16-1
段寄存器(提供段地址)
CS,DS,SS,ES
IP为指令寄存器
CS内容为M,IP为N, 8086CPU 将从内存M*16+N 单元开始 读取第一条指令
修改CS,IP的内容用jmp指令 语法:jmp 段地址:偏移地址 eg:jmp 2AE3:3 执行过后 CS=2AE3H, IP=0003H 从2AE33H处读取指令
如果只想修改IP的内容 则可以用 语法:jmp 一个合法寄存器 eg:jmp ax, 执行前:ax = 1000H, CS=2000H,IP=0003H
执行后:ax = 1000H, CS=2000H,IP=1000H
DS寄存器 --存放CPU访问的内存段
当CPU访问内存时,需要把内存的地址放入DS寄存器
eg:mov bx,1000H //将要访问的内存放入一个寄存器(不能直接放入段地址寄存器,注意前面可以用r 修改,那是debug的内容,并不代表汇编代码可以这样写)
mov ds,bx //bx寄存器里面的地址段 赋给ds
mov al,[0] //读取ds内的内存的内容到al寄存器,[0]表示地址偏移量