上一篇介绍了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

  语句的执行过程如下:

  

  从上面的截图可以看出,当我使用  Shell (在  DOS  下也就是  Command  命令解释器)将可执行文件加载进内存后,可以看到,整个程序的起始地址为   0C54H : 0000 H  ,并且,可以看到  CS  的地址为  0C54H ,IP  的地址为  0000H,这正好吻合我们上面对  CS:IP  的分析,很明显,CPU  将会读取    MOV    AX ,1234H   到 CPU 中并且执行 ,然后我们继续向下看:

  

  

  可以看到,我们单步执行后,AX 中的值编成了  1234H ,而  IP  寄存器中的值变成了  0003H,对于  AX  中的值的改变,我们是能够理解的,但是   IP  中的值为什么会从  0000H  变到  0003H  呢?从最上面的一幅关于指令在内存中的存放可以看出    MOV    AX ,1234H   在内存中需要  3 个内存单元存放,也就是  CPU  为了执行    MOV    AX ,1234H   这条指令,已经将内存中相对应的 3  个内存单元读入内存中了,执行完这条指令后,自然,CPU  就要将偏移地址向下移动  3  个单元,从而使得  CS:IP  指向下一条需要执行的指令了 ,为了更深刻的理解,我们再来继续看执行过程,

  

  

  从最上面的一幅关于指令在内存中的存放可以看出    MOV    BX ,AX  在内存中只占  2  个内存单元,这也就是为什么  IP  这一次只向下移动了  2  个单元的缘故 。

最新文章

  1. clickheat简介
  2. [HDU 3336]Count the String[kmp][DP]
  3. Java反射机制浅析
  4. Ajax理解总结
  5. 平衡树Treap模板与原理
  6. centos7安装python3.6后导致防火墙功能无法正常工作的解决办法
  7. JS 上传图片 + 预览功能(一)
  8. iOS 技术篇:__VA_ARGS__实现自定义NSLog
  9. [Linux]Linux下yaf发送IPV4和IPV6的IPfix
  10. XAMPP配置基于虚拟目录、多域名的环境
  11. .net MVC入门
  12. deeplearning.ai学习seq2seq模型
  13. SQL —— 获取重复某个字段的第一条记录
  14. hdu 2444 The Accomodation of Students 【二分图匹配】
  15. codeforces 888A/B/C/D/E - [数学题の小合集]
  16. 2017 ECL-FINAL J.Straight Master
  17. 关于Class的invokeDynamic指令
  18. 利用Hibernate子查询(in) 得到部分字段(实体类的构造函数)
  19. 20172301 《Java软件结构与数据结构》实验一报告
  20. asp.net页面刷新或者回发后DIV的滚动条位置不变!(转)

热门文章

  1. pythonDjango开发-自定义模板标签
  2. 【LG3245】[HNOI2016]大数
  3. 使用终端命令行将本地项目上传到Github
  4. Hbase第五章 MapReduce操作HBase
  5. idea maven javaweb项目迁移时的maven和版本报错问题解决(可解决同类错误)
  6. 用CSS中的Alpha实现渐变
  7. JMeter的__threadGroupName使用注意事项
  8. 14-Dockerfile常用指令
  9. myeclipse激活后server不能用问题
  10. 互联网校招面试必备——Java多线程