段与段寄存器
首先了解什么是段?
内存是连续的, 并不分段,
段的划分来自CPU, 使得我们可以使用分段方式管理内存.
段寄存器有哪些?
8086CPU中, 有4个段寄存器, 当CPU要访问内存时, 由这4个段寄存器提供内存单元的段地址
- CS –> 代码段寄存器
- DS –> 数据段寄存器
- SS –> 堆栈段寄存器
- ES –> 附加(辅助)段寄存器
此外, 一个很重要的寄存器是 IP, 它是 指令指针寄存器
8086CPU读取和执行的过程
假设CS段存储的是 mov ax, 0123H
- 由CS和IP两个地址送入
地址加法器
合成一个20位的物理地址 - 通过输入输出控制电路, 通过20位的地址总线输出, 索引到内存地址
- 这里的内存地址, 是指CS, 即代码段寄存器, 在cs所在内存地址中取到了内存数据
- 通过输入输出设备, 把数据输入到指令缓冲器, 最后传到执行控制器
- 执行完毕后 ax就是0123, IP也会偏移3存储单元
这里的 mov ax, 0123H 指令, 在内存中的数据为 B8 23 01, 所以IP偏移3个存储单元
当8086CPU加电或复位后, 也就是PC启动时, CS被设置为FFFFH, IP=0000H, 那么它就会从FFFF0H单元中读取指令执行, 现在的PC也是这个原理, 这个位置是BIOS的位置
IP在每次执行完毕后, IP的值 = IP + 执行指令的长度.
指令缓冲器,是一个临时存放指令的元件,保存将要执行(发送)但没指令的指令。
转移指令
在CPU中, 程序员能够用指令读写的部件只有寄存器, 通过改变寄存器的内容实现对CPU的控制, 这里我们通过修改CS, IP的值来控制CPU
修改CS, IP的值, 由8086专门的指令, 也叫转移指令
jmp指令能同时修改CS, IP, 它的语法:
jmp 段地址:偏移地址
jmp 2AE3:3
jmp 3:0B16
仅修改 IP 的值, 使用 jmp 结合某一个合法寄存器
mov ax 200
jmp ax (类似于 mov IP,ax)
jmp bx
由CS存放指令的段地址, IP存放指令的偏移地址.
注意debug中可以直接修改cs和ip,并不是汇编指令,它是debug指令
扩展: 由于在冯诺依曼计算机中, 数据和指令是混合存放于内存中的, 也就是说, 必须通过CS寄存器CPU才认为是指令代码, 而DS则被认为是数据