段寄存器有四类:cs,ds,ss,es.
其中,cs是代码寄存器,它指向的代码段是一组地址连续,起始地址为16的倍数的内存单元。这个代码段可以存储长度为N(N<=64KB)的一组代码。
而与之相关联的是IP(指令指针寄存器),
步骤如下:
(1)cs:ip在地址加法中获得内存地址(csX16+ip),然后将通过输入输出控制电路和20位地址总线获得内存地址,将指令通过数据总线和输入输出控制电路放到指令缓冲区,
(2)ip=ip+指令长度,指向下一条指令
(3)执行指令缓冲器中的指令,再返回步骤(1)
如下图所示
![在这里插入图片描述](https://img-blog.csdnimg.cn/fce02a41711e444a8a7618791e5e3353.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZGlyZWN0eDNkX2JlZ2lubmVy,size_20,color_FFFFFF,t_70,g_se,x_16)
在跳转指令时,用jmp ,
如:jmp ax,相当于mov ip,ax。
即用ax的值赋给ip,从ax开始执行指令。
看看问题2.3,执行序列,初始化cs=2000H,ip=0000H
![在这里插入图片描述](https://img-blog.csdnimg.cn/b0b1ec102d884248a2923e2f84423699.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZGlyZWN0eDNkX2JlZ2lubmVy,size_20,color_FFFFFF,t_70,g_se,x_16)
分析下:
指令必然执行从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
![在这里插入图片描述](https://img-blog.csdnimg.cn/455cc26a8fcc415bbe5e420512a95b2a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZGlyZWN0eDNkX2JlZ2lubmVy,size_20,color_FFFFFF,t_70,g_se,x_16)
我认为每次执行指令都会修改ip的值,由于第二步ax=0,所以在第三步跳转到ax是,ip=0.
运行下看看
![在这里插入图片描述](https://img-blog.csdnimg.cn/03638f1c64074101a88610841b417365.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZGlyZWN0eDNkX2JlZ2lubmVy,size_13,color_FFFFFF,t_70,g_se,x_16)
ok