下面将要介绍的是一组很是很是重要的寄存器,即 CS:IP 。编程
CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中 CS 为代码段寄存器,而 IP 为指令指针寄存器 。spa
什么叫作指示了 CPU 当前将要读取的指令呢?在 8086 CPU 中,为何 CPU 会自动的执行指令呢?操作系统
这些指令确定是存放在内存中的,可是 CPU 怎么知道这些指令存放在内存的那个位置呢?指针
好比,我有下面的两条指令要执行:blog
MOV AX,1234H
MOV BX,AX
而假设这两条指令在内存中存放为:内存
很显然, 1000H:0000H 指向的是 MOV AX,1234H 的首地址,get
若是 CPU 要读取到个人指令的话,很显然,必需要知道地址 1000H:0000H ,it
而后 CPU 就能够根据这个首地址,将汇编指令 MOV AX,1234H 所对应的机器码读入到 CPU 的指令寄存器中,编译
最后即可以在 CPU 中进行处理了。程序
但关键是 CPU 如何知道个人 1000H:0000H 这个首地址?其实这就须要使用到 CS:IP 这个寄存器组了 。
当咱们运行一个可执行文件时,很明显,咱们须要另一个程序来将这个可执行文件加载到内存当中,
关于这个加载可执行文件的程序,咱们在这里无论他,点一下便可,
通常是经过操做系统的外壳程序(也就是传说中的 Shell 程序),
Shell 将可执行文件加载到内存中之后,就会设置 CPU 中的两个寄存器,即设置 CS:IP 两个寄存器指向可执行文件的起始地址,此后 CPU 便从这个起始地址开始读取内存中的指令,而且执行。
好比咱们在写汇编程序时,一般会使用 START 标记,其实这个标记就是用来标记起始地址的,
当将一个汇编程序编译,链接成可执行文件之后,再经过操做系统的 Shell 程序将可执行文件加载到内存中之后,
这个 START 所标记处的地址就是整个可执行文件的起始地址了 。
也就是说,当一个可执行文件加载到内存中之后,CS:IP 两个寄存器便指向了这个可执行文件的起始地址,
而后 CPU 就能够从这个起始地址开始往下读取指令,
当读取完指令后,CS:IP 将会自动的改变,基本上是改变 IP ,从而指向下一条要读取的指令,这样就能够执行这个可执行文件了 。
最后再对 CS:IP 总结一下: