本文主要是介绍2.9-2.12段寄存器和cs:ip,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
段寄存器有四类:cs,ds,ss,es.
其中,cs是代码寄存器,它指向的代码段是一组地址连续,起始地址为16的倍数的内存单元。这个代码段可以存储长度为N(N<=64KB)的一组代码。
而与之相关联的是IP(指令指针寄存器),
步骤如下:
(1)cs:ip在地址加法中获得内存地址(csX16+ip),然后将通过输入输出控制电路和20位地址总线获得内存地址,将指令通过数据总线和输入输出控制电路放到指令缓冲区,
(2)ip=ip+指令长度,指向下一条指令
(3)执行指令缓冲器中的指令,再返回步骤(1)
如下图所示
在跳转指令时,用jmp ,
如:jmp ax,相当于mov ip,ax。
即用ax的值赋给ip,从ax开始执行指令。
看看问题2.3,执行序列,初始化cs=2000H,ip=0000H
分析下:
指令必然执行从cs:ip所指向的地址。
初始化时:cs=2000H,ip=0000H,那么地址是cs*16+ip=20000H,执行mov ax,6622H。结果是ax=6622H,cs=2000H,ip=0003H.
继续执行20003H, jmp 1000:3,此时改变cs=1000H,ip=0003H
继续执行10003H,mov ax,0000,结果是ax=0000H,cs=1000H,ip=0006H,
继续执行10006H,mov bx,ax,结果是ax =0000H,bx=0000H,cs=1000H,ip=0008H
继续执行10008H, jmp bx,结果是cs=1000H,ip=0000H
继续执行10000H,mov ax,0123H结果是ax=0123H,cs=1000H,ip= 0003h
继续执行10003h,mov ax,0000,结果是ax=0000H,cs=1000H,ip=0006H,
开始循环了.
看看答案,OK
我认为每次执行指令都会修改ip的值,由于第二步ax=0,所以在第三步跳转到ax是,ip=0.
运行下看看
ok
这篇关于2.9-2.12段寄存器和cs:ip的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!