上一篇介绍了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  个单元的缘故 。

CPU结合CS、IP寄存器进行执行程序的更多相关文章

  1. CS 寄存器 和 IP 寄存器

    下面将要介绍的是一组非常非常重要的寄存器,即 CS:IP . CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中  CS 为代码段寄存器,而   IP 为指令指针寄存器 . 什么叫做 ...

  2. 32位Intel CPU所含有的寄存器

    4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) ...

  3. 单片机中断的IE和IP寄存器(摘抄)

    收藏 评论(0) 分享到 微博 QQ 微信 LinkedIn 一.中断允许寄存器IE    CPU对中断源的开放或中断屏蔽的控制是通过中断允许寄存器IE设置的,IE既可按字节地址寻址(其字节地址为A8 ...

  4. CPU相关知识-寄存器与存储器的区别

    存储器一般在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是 50MB/S左右.内存和寄存器就是为了解决存储器读写速度慢而 ...

  5. cs ip 通过jmp转移命令间接赋值。无法直接对其赋值。

    jmp 寄存器 命令 对IP间接赋值.

  6. 程序与CPU,内核,寄存器,缓存,RAM,ROM、总线、Cache line缓存行的作用和他们之间的联系?

    目录 缓存 什么是缓存 L1.L2.L3 为什么要设置那么多缓存.缓存在cup内还是cup外 MESI协议----主流的处理缓存和主存数据不一样问题 Cache line是什么已经 对编程中数组的影响 ...

  7. 王爽《汇编》检测9.1(1) | 若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?

    ;监测点9.1(1) assume cs:code data segment db dup() data ends code segment start: mov ax,data :这一段一定要补上 ...

  8. 编程一一C语言的问题,cpu中的专用寄存器

  9. 第1章 从开机加电到main函数之前的过程

    主要讲解了80x86cpu在启动的时候时bios如何工作,以及如何最终转换到保护模式. 1.1 启动bios 80x86作为冯诺依曼结构下的cpu,工作模式也是取指执行,即cpu根据cs:ip寄存器的 ...

随机推荐

  1. springboot之jar运行脚本

    一.现在的工程都将就独立和简单了,我们在使用springboot做开发或者其他框架做开发时,在linux上面执行的时候.总会写一下脚本,目的当然是为了更加好的运行程序.不然每次都手动输入一下命令,来调 ...

  2. Webpack之Code Splitting 代码分块

    如何实现代码分块 默认情况webpack会将资源文件打包成一个js文件,比如app.bundle.js 实际情况我们需要按需加载 方法如下: require.ensure(dependencies, ...

  3. CF535E Tavas and Pashmaks

    今天Fakehu考的T1. 大致意思就是有n个人每个人有两个速度\(v_1,v_2\),比赛有两个路程\(A,B\),最后时间是\(A/v_1+B/v_2\).求每个人是否可能成为冠军中的一个. 显然 ...

  4. Redis 为什么使用单进程单线程方式也这么快

    Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 ...

  5. 深入理解JavaScript是如何实现继承的

    深入理解JavaScript是如何实现继承的-----------http://www.jb51.net/article/44384.htm

  6. C#数组 修改

    今天咱们了解下C#中的数组 后面会讲到集合.泛型集合 咱们分开来讲,免得出现混乱 讲完这三个,咱们再汇总一下,看看有什共同点和不同点 定义一个数组: ]; , , , , , , , , , }; 两 ...

  7. C# 其他的Url 文件的路径转化为二进制流

    //将虚拟路径转化为文件的路径然后最后转化为文件流 public ActionResult SaveImage(string path) { var url =System.Web.HttpConte ...

  8. hdu1546Idiomatic Phrases Game(floyd+map)

    传送门 成语接龙,找每个单词都需要一点时间,问最少的时间 把字符串用map处理成数字编号,之后用floyd #include<bits/stdc++.h> using namespace ...

  9. vue-cli 2.x和3.x安装的区别

    1.全局安装vue的脚手架:vue-cli(指定版本后面加@2.x.x) npm install -g vue-cli npm install -g @vue/cli 2.使用初始化 vue 项目: ...

  10. MySQL日志系统:redo log与binlog

    日志系统主要有redo log(重做日志)和binlog(归档日志).redo log是InnoDB存储引擎层的日志,binlog是MySQL Server层记录的日志, 两者都是记录了某些操作的日志 ...