CPU结合CS、IP寄存器进行执行程序
上一篇介绍了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寄存器进行执行程序的更多相关文章
- CS 寄存器 和 IP 寄存器
下面将要介绍的是一组非常非常重要的寄存器,即 CS:IP . CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中 CS 为代码段寄存器,而 IP 为指令指针寄存器 . 什么叫做 ...
- 32位Intel CPU所含有的寄存器
4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) ...
- 单片机中断的IE和IP寄存器(摘抄)
收藏 评论(0) 分享到 微博 QQ 微信 LinkedIn 一.中断允许寄存器IE CPU对中断源的开放或中断屏蔽的控制是通过中断允许寄存器IE设置的,IE既可按字节地址寻址(其字节地址为A8 ...
- CPU相关知识-寄存器与存储器的区别
存储器一般在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是 50MB/S左右.内存和寄存器就是为了解决存储器读写速度慢而 ...
- cs ip 通过jmp转移命令间接赋值。无法直接对其赋值。
jmp 寄存器 命令 对IP间接赋值.
- 程序与CPU,内核,寄存器,缓存,RAM,ROM、总线、Cache line缓存行的作用和他们之间的联系?
目录 缓存 什么是缓存 L1.L2.L3 为什么要设置那么多缓存.缓存在cup内还是cup外 MESI协议----主流的处理缓存和主存数据不一样问题 Cache line是什么已经 对编程中数组的影响 ...
- 王爽《汇编》检测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 :这一段一定要补上 ...
- 编程一一C语言的问题,cpu中的专用寄存器
- 第1章 从开机加电到main函数之前的过程
主要讲解了80x86cpu在启动的时候时bios如何工作,以及如何最终转换到保护模式. 1.1 启动bios 80x86作为冯诺依曼结构下的cpu,工作模式也是取指执行,即cpu根据cs:ip寄存器的 ...
随机推荐
- codevs 2639 约会计划
codevs 2639 约会计划 题目描述 Description cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错.然而,最关键的是,cc能够很好的 ...
- socket客户端和服务器端
服务器端: #!/usr/bin/env python #-*- coding:utf-8 -*- import socket sk=socket.socket() sk.bind(('127.0.0 ...
- 菜鸟vimer成长记——第2.4章、cmd-line模式
cmd-line模式又有3个类型:Ex 命令(ex commands).查找模式(Search patterns).Filter 命令(Filter commands).本文主要重点的是Ex 命令和S ...
- Educational Codeforces Round 61 (Rated for Div. 2) E. Knapsack
非常经典的dp题,因为1至8的最大公约数是840,任何一个数的和中840的倍数都是可以放在一起算的, 所以我只需要统计840*8的值(每个数字(1-8)的sum%840的总和),剩下都是840的倍数 ...
- mysql 优化之 doublewrite buffer 机制
是什么? doublewrite buffer是mysql 系统表空间的一块存储区域. 有什么用? 在Innodb将数据页写到数据存储文件之前,存储从Innodb缓存池刷过来的数据页.且只有将数写入d ...
- [Codeforces-911B] - Two Cakes
B. Two Cakestime limit per test 1 secondmemory limit per test 256 megabytesinput standard inputoutpu ...
- 【坚持】Selenium+Python学习记录 DAY11
2018/06/1-2018/06/4 参考资料: [菜鸟教程](http://www.runoob.com/python3/python3-examples.html) [Python解惑:True ...
- JavaScript学习(2)call&apply&bind&eval用法
javascript学习(2)call&apply&bind&eval用法 在javascript中存在这样几种特别有用的函数,能方便我们实现各种奇技淫巧.其中,call.bi ...
- 不用U盘,用一台好电脑给另一个电脑重装windows10
先把坏电脑硬盘拆下来,然后挂到好电脑上 把这块盘用系统的磁盘管理工具改成GPT分区表格式,然后整盘分区(NTFS). 再对这个分区进行压缩卷操作,分出第二个区(FAT32格式 大小大于5G 我这里用了 ...
- python的Socket网络编程 使用模板
本文给出的是TCP协议的Socket编程. 其中用了一个dbmanager数据库操作模块,这个模块是我自己定义的,可以在我的另一个文章中找到这个模块的分享.python操作mysql数据库的精美实用模 ...