寄存器
CPU由运算器、控制器、寄存器等构成,靠内部总线相连。外部总线是实现CPU和主板上的其他器件连接。
汇编程序员主要关心的是寄存器,通过改变里面的内容来实现对CPU的控制。
8086CPU有14个寄存器,都是16位的。
2.1通用寄存器
AX、BX、CX、DX存放一般性数据,上一代是8位,为了保证兼容,这4个又可以分为两个独立的8位寄存器来使用。
2.2字在寄存器中的存储
8086CPU一次可以处理字节和字两种尺寸的数据。
一个内存单元可放8位数据,寄存器放n个8位,所以用16进制来表示,很直观,后面加H。
字相加,若高于16位,则多出来的舍弃。
寄存器的低位字节相加,多出8位的进位值不能保存在8位寄存器中。此时认为高位和低位时两个不相关的寄存器。
2.4物理地址
所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元都有一个唯一的地址(物理地址)
CPU在向地址总线发出物理地址前,要形成物理地址。
2.5 16位结构的CPU
运算器一次最多处理16位的数据
寄存器的最大宽度为16位
二者通路为16位
所以内存单元地址在送上地址总线之前,需在CPU中处理、传输、暂存。对于16位CPU,一次能处理的就是16位地址。
2.6 8086CPU给出物理地址方法
8086CPU有20位地址总线,然而8086CPU又是16位的,寻址能力为64KB。这就需要在CPU内部把两个16位地址合成一个20位的物理地址。
物理地址=段地址x16+偏移地址
2.7“段地址x16+偏移地址”的本质含义
CPU访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
2.8段的概念
根据编程需要,可以将地址连续的内存看作一个段,用段x16定位段的起始地址,用偏移地址定位段中的内存单元。
因为偏移地址为16位,寻址位64KB,所以一个段的最大长度为64KB。0~FFFFH
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
2.9段寄存器
8086CPU中有4个:CS、DS、SS、ES
2.10CS和IP
这是最关键的两个寄存器,指向了当前CPU读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器。
工作过程如下:
(1)从CS:IP指向的内存单元中读取指令,进入指令缓冲器;
(2)IP=IP+所读取指令的长度,从而指向下一条指令;
(3)执行指令。转到步骤(1),重复这个过程。
2.11修改CS、IP指令
jmp 命令
jimp 段地址:偏移地址
jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令
若仅想修改IP的内容,可以用jmp 某一合法寄存器 来完成
2.12代码段
我们可以将长度为N(N小于等于64KB)的一组代码,存放在一组地址连续、起始地址为16的倍数的内存单元中,我们可以认为这段内存时存放代码的,从而定义了一个代码段。
上面这个仅仅是我们在编程时的一种安排,CPU并不会由于这用安排,就把把当作代码来执行。所以我们必须将CS:IP指向代码段中的第一条指令的首地址。