CPU结构:
一典型的CPU主要有寄存器、运算器、控制器等器件构成,它们通过内部总线相连,进行数据传输。第一章中的总线相应为(CPU的)外部总线。
8086是16位结构的CPU,这说明:
也就是说,16位结构CPU意味着,在8086CPU内部,能够一次性处理、传输、暂时存储的信息的最大长度为16位。
通用寄存器:
用于存放一般性的数据的寄存器,称为通用寄存器。8086CPU所有的寄存器都是16位的,可以存放两个字节,一个字。包含AX、BX、CX、DX,四个通用寄存器。
一个16位寄存器可以分为两个8位寄存器,AX可以分为AH(8-15)和AL(0-7)。
需要注意以下两点:
几条汇编指令:
首先汇编指令和寄存器名称均不区分大小写,mov 和 MOV,AX和ax 均等价
写汇编指令时,要注意指令的两个操作对象位数必须一致
比如,mov ax,bx mov al,bh mov ah,bh mov al,9H都是正确的
而, mov ax,bl mov bh,ax mov al,100H都是错误的
8086CPU给出物理地址的方法:
我们在第一章中知道,地址总线的宽度为20位,但是8086CPU内部一次只能传送16位的数据,那么CPU内外如何交互地址呢?
8086CPU在内部用两个16位地址合成,经过地址加法器产生一个20位的地址,再通过地址总线与存储单元进行交互。
这两个16位地址分别为段地址(SA)和偏移地址(EA),物理地址 = 段地址 * 16 + 偏移地址 其中,段地址*16 也称为基础地址
或许有一个不太恰当的比喻。在书店,书被分成许多类,有文学类、工学类、理学类、农学类等等,每一个大类之中有许多本书,每一本书有自己独特的编号。
那么这个段地址 *16之后便代表某一类某一类书籍,然后再根据偏移地址,找到具体的哪一本书。
使用段地址 * 16可以确定一个起始地址,很显然这个起始地址一定是16的倍数,用十六进制表示就是最后一位一定是0。当段地址固定时,16位的偏移地址的寻址能力为64KB,所以一个段的最大长度为64KB。
对于同一个地址,可以使用不同的段地址和偏移地址来描述。例如:
21F60H内存单元的一种表示为 2000:1F60 (段地址:偏移地址)
段寄存器:
存储段地址的寄存器称为段寄存器,8086CPU包括4个段寄存器,CS、DS、SS、ES
CS和IP:
CS(Code Segment)代码段寄存器,IP(Instruct Pointer)指令指针寄存器,CS存储代码段地址,IP存储偏移地址。任意时刻,CPU将CS:IP指向的内容当作指令执行。
指令实现过程:
8086CPU不允许像通用寄存器一样直接修改段寄存器的值,有两种方法可以修改CS:IP的指令
第一种jmp转移指令:
第二章debug修改指令:
详见Debug专题