cxuan 在上面只是简单为你介绍了一下段寄存器的概念,介绍的有些浅,而且介绍段寄存器不介绍段也有不知庐山真面目的感觉,现在为你详细的介绍一下,相信看完上面的段的概念之后,段寄存器也是手到擒来。
我们在合成物理地址的那张图提到了 相关部件 的概念,这个相关部件其实就是段寄存器,即 CS、DS、SS、ES 。8086 的 CPU 在访问内存时,由这四个寄存器提供内存单元的段地址。
CS 寄存器要聊 CS 寄存器,那么 IP 寄存器是你绕不过去的曾经。CS 和 IP 都是 8086 CPU 非常重要的寄存器,它们指出了 CPU 当前需要读取指令的地址。
CS 的全称是 Code Segment,即代码寄存器;而 IP 的全称是 Instruction Pointer ,即指令指针。现在知道这两个为什么一起出现了吧!
在 8086 CPU 中,由 CS:IP 指向的内容当作指令执行。如下图所示
说明一下上图
在 CPU 内部,由 CS、IP 提供段地址,由加法器负责转换为物理地址,输入输出控制电路负责输入/输出数据,指令缓冲器负责缓冲指令,指令执行器负责执行指令。在内存中有一段连续存储的区域,区域内部存储的是机器码、外面是地址和汇编指令。
上面这幅图的段地址和偏移地址分别是 2000 和 0000,当这两个地址进入地址加法器后,会由地址加法器负责将这两个地址转换为物理地址
然后地址加法器负责将指令输送到输入输出控制电路中
输入输出控制电路将 20 位的地址总线送到内存中。
然后取出对应的数据,也就是 B8、23、01,图中的 B8、BB 都是操作数。
控制输入/输出电路会将 B8 23 01 送入指令缓存器中。
此时这个指令就已经具备执行条件,此时 IP 也就是指令指针会自动增加。我们上面说到 IP 其实就是从 Code Segment 也就是 CS 处偏移的地址,也就是偏移地址。它会知道下一个需要读取指令的地址,如下图所示
在这之后,指令执行执行取出的 B8 23 01 这条指令。
然后下面再把 2000 和 0003 送到地址加法器中再进行后续指令的读取。后面的指令读取过程和我们上面探讨的如出一辙,这里 cxuan 就不再赘述啦。
通过对上面的描述,我们能总结一下 8086 CPU 的工作过程
段寄存器提供段地址和偏移地址给地址加法器
由地址加法器计算出物理地址通过输入输出控制电路将物理地址送到内存中
提取物理地址对应的指令,经由控制电路取回并送到指令缓存器中
IP 继续指向下一条指令的地址,同时指令执行器执行指令缓冲器中的指令
什么是 Code SegmentCode Segment 即代码段,它就是我们上面聊到就是 CS 寄存器中存储的基础地址,也就是段地址,段地址其本质上就是一组内存单元的地址,例如上面的 mov ax,0123H 、mov bx, 0003H。我们可以将长度为 N 的一组代码,存放在一组连续地址、其实地址为 16 的倍数的内存单元中,我们可以认为,这段内存就是用来存放代码的。
DS 寄存器CPU 在读写一个内存单元的时候,需要知道这个内存单元的地址。在 8086 CPU 中,有一个 DS 寄存器,通常用来存放访问数据的段地址。如果你想要读取一个 10000H 的数据,你可能会需要下面这段代码
mov bx,10000H mov ds,bx mov a1,[0]上面这三条指令就把 10000H 读取到了 a1 中。
在上面汇编代码中,mov 指令有两种传送方式
一种是把数据直接送入寄存器
一种是将一个寄存器的内容送入另一个寄存器
但是不仅仅如此,mov 指令还具有下面这几种表达方式
描述 举例mov 寄存器,数据 比如:mov ax,8
mov 寄存器,寄存器 比如:mov ax,bx
mov 寄存器,内存单元 比如:mov ax,[0]
mov 内存单元,寄存器 比如:mov[0], ax
mov 段寄存器,寄存器 比如:mov ds,ax
栈