8086 CS和IP寄存器

CS 寄存器 和 IP 寄存器:

经过前面对段的介绍,相信各位朋友对段寄存器应该也有一定的了解了,

下面将要介绍的是一组非常非常重要的寄存器,即 CS:IP 。

CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中  CS  为代码段寄存器,而   IP  为指令指针寄存器 。

什么叫做指示了 CPU 当前将要读取的指令呢?在 8086  CPU 中,为什么  CPU  会自动的执行指令呢?

这些指令肯定是存放在内存中的,但是  CPU  怎么知道这些指令存放在内存的那个位置呢?

比如,我有下面的两条指令要执行:

    MOV AX,1234H
    MOV BX,AX

而假设这两条指令在内存中存放为:

image

很显然, 1000H:0000H 指向的是  MOV  AX,1234H  的首地址,

如果 CPU 要读取到我的指令的话,很显然,必须要知道地址  1000H:0000H ,

然后  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  总结一下:

  1. 你想让  CPU  执行哪行指令,你就让  CS:IP  指向保存有指令的那块内存即可。
  2. 任何时候,CS:IP  指向的地址中的内容都是  CPU  当前执行的指令。

下面我们来看一个  Demo,并详细观察其执行的过程:

ASSUME CS:CODES

CODES SEGMENT
	
START:
    
    MOV AX,1234H
    MOV BX,AX
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
语句的执行过程如下:

image

从上面的截图中可以看出,当我使用  Shell (在  DOS  下也就是  Command  命令解释器)将可执行文件加载进内存后,

可以看到,整个程序的起始地址为   0C54H : 0000 H  ,并且,可以看到  CS  的地址为  0C54H ,IP  的地址为  0000H,

这正好吻合我们上面对  CS:IP  的分析,很明显,CPU  将会读取    MOV    AX ,1234H   到 CPU 中并且执行 ,

然后我们继续向下看:

image

可以看到,我们单步执行后,AX 中的值编成了  1234H ,而  IP  寄存器中的值变成了  0003H,

对于  AX  中的值的改变,我们是能够理解的,但是   IP  中的值为什么会从  0000H  变到  0003H  呢?

从最上面的一幅关于指令在内存中的存放可以看出    MOV    AX ,1234H   在内存中需要  3 个内存单元存放,

也就是  CPU  为了执行    MOV    AX ,1234H   这条指令,已经将内存中相对应的 3  个内存单元读入内存中了,

执行完这条指令后,自然,CPU  就要将偏移地址向下移动  3  个单元,从而使得  CS:IP  指向下一条需要执行的指令了 ,

为了更深刻的理解,我们再来继续看执行过程,

image

从最上面的一幅关于指令在内存中的存放可以看出    MOV    BX ,AX  在内存中只占  2  个内存单元,

这也就是为什么  IP  这一次只向下移动了  2  个单元的缘故 。

  • 14
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
8086ES是一种具有16位数据总线的微处理器,它具有多个寄存器,这些寄存器在处理器的功能和操作中起着重要的作用。 首先,8086ES中的通用寄存器 AX、BX、CX和DX,可以用于存储数据、运算和数据传输。这些寄存器可以进行各种算术和逻辑运算,例如加、减和移位操作。此外,这些寄存器还可以用来传输数据到其他寄存器或外部设备。 其次,8086ES中的段寄存器 CS、DS、ES和SS用于存储和管理程序的内存地址。CS寄存器存储代码段的基地址,DS寄存器存储数据段的基地址,ES寄存器存储附加段的基地址,而SS寄存器存储栈段的基地址。通过这些段寄存器8086ES能够有效地访问和管理内存中的代码和数据。 此外,8086ES还具有指令指针寄存器IP,它存储下一条要执行的指令的地址。通过IP寄存器8086ES可以按照指令的顺序执行程序。 除了以上提到的寄存器之外,8086ES还具有一些特殊功能寄存器,比如标志寄存器FLAGS和状态寄存器PSW。标志寄存器存储了CPU的状态信息,比如运算结果的正负、进位和溢出等。状态寄存器用于存储程序执行过程中的各种状态。 综上所述,8086ES寄存器在处理器的功能和操作中起着至关重要的作用,包括数据的存储、运算、传输、代码和数据的管理,以及状态信息的存储等。通过这些寄存器8086ES能够进行高效且精确的数据处理和程序执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值