目录

1. 如何构造自动取指执行的处理器

1.1 开关构成指令与数据

1.2 内存存储指令与数据

1.3 自动取指执行

1.4 处理器基本结构

2. 程序重定位与内存分段机制

2.1 程序重定位问题的提出

2.1.1 程序逻辑分段

2.1.2 程序重定位难题

2.1.3 程序重定位解决思路

2.3 内存分段机制

2.4 8086的内存分段机制

2.4.1 8086通用寄存器

2.4.2 8086段寄存器

2.4.3 指令指针寄存器

2.4.4 8086内存访问的特殊处理


1. 如何构造自动取指执行的处理器

处理器是计算机的核心,他在振荡器脉冲的激励下,循环往复地从内存中获取指令,并执行由该指令所定义的操作

下面我们逐步构建起一个能够自动取指执行的处理器

1.1 开关构成指令与数据

① 左侧的开关用于组合产生参与运算的数据

② 下面的开关用于组合产生指令

可见指令和数据均表现为二进制数位的组合

说明1:早期的计算机就是通过开关或跳线进行编程的,下图为早年的插线板式计算机

说明2:寄存器宽度

寄存器的宽度有8 / 16 / 32 / 64,在X86体系结构中,16位的寄存器可以存放2B,称为1个字(word);32位寄存器可以存放4B,称为1个双字(double word)

tips:实际上,"字"的概念出现得很早,也并非指16个bit,只是到后来才特指16个bit的长度

1.2 内存存储指令与数据

使用开关的方式构成指令和数据非常麻烦,要想实现自动取指执行,就需要预先将程序和数据存储在一个地方,这个地方就是内存

内存中存储代表指令和数据的二进制数,运算器逐条取出指令并执行

说明1:内存地址的概念

① 在主流的计算机上,内存单元的长度为1B

② 内存中的每个内存单元都对应一个地址,即内存按字节编址

说明2:处理器对内存的访问

① 地址线指定要访问的内存地址,因此地址线的的个数决定了处理器能访问的内存单元范围

② 读写控制线控制操作类型

③ 通过数据线读写内存数据

④ 字长控制线控制一次访问内存的长度

说明3:关于字长控制

① 8 / 16 / 32 / 64位处理器拥有相应长度的寄存器和算术逻辑部件

② 尽管内存的最小组成单位是字节,但是能够按字节、字、双字和四字进行访问,即一次访问即可处理8 / 16 / 32 / 64位的二进制数

1.3 自动取指执行

处理器能够自动取值执行的关键在于引入指令指针寄存器

① 指令指针寄存器保存将要执行的指令地址

② 指令指针寄存器初值为第1条要执行指令的地址

③ 执行完一条指令后,指令指针寄存器自动修改,指向下一条要执行的指令地址。自动修改的计算方法是基于当前执行指令的地址及指令长度

说明1:指令连续存储

从指令指针寄存器的工作方式可知,处理器要求指令在内存中是连续存放的,如果中间夹杂了其他非指令的数据,处理器将因为不能识别而出错

这里就引出了程序中指令和数据的分段存储

说明2:程序自动执行示例

① 指令被连续存放在内存中

② 将指令指针寄存器初值设为0,处理器即可以从该处执行第1条指令

③ 每执行完一条指令,指令指针寄存器自动修改,指向下一条要执行的指令地址

④ 取值 & 执行循环往复,实现程序的自动执行

说明3:关于指令长度

对于X86体系结构,指令的长度不定,短的指令只有1B,而长的指令有15B,这就是典型的CISC结构

说明4:关于指令集

一个处理器能够识别的指令的集合,称为该处理器的指令集,指令集在处理器的设计阶段就确定了

说明5:指令在内存中的布局

① X86体系结构中,存储在内存中的数据采用小端序

② 示例中第1条指令的第2个操作数直接包含在指令中,可以立即从指令中取得,因此叫做立即数(Immediate Operand)

③ 示例中第2条指令的第2个操作数指定了一个内存地址0x003F,相当于高级语言中的指针。当处理器执行这条指令时,需要再次访问内存,从内存0x003F处取得数据

1.4 处理器基本结构

① 总线接口部件:与外部的地址线 & 数据线连接,发送地址信号,收发数据信号

② 指令执行部件:执行指令,其中寄存器参与运算并保存中间结果

③ 控制部件:在指令的执行过程中,给各个部件发送控制信号,使各个部件在正确的时间点上执行某个动作

同时他还负责决定在某个时间点上,哪个部件有权使用总线,以避免发生冲突

说明:关于处理器的位数

处理器的位数是指寄存器与算术逻辑部件的位数

2. 程序重定位与内存分段机制

2.1 程序重定位问题的提出

2.1.1 程序逻辑分段

如上文所述,程序的代码和数据需要分开存放,这里对代码段和数据段的划分是逻辑上的,从本质上来说,是如何看待和组织内存中的数据

2.1.2 程序重定位难题

在指令中指定操作数的物理地址影响程序加载运行,在上图示例程序中,在指令中指定了要操作数据的物理地址(e.g. 内存0x0100处的0x0005数据)

如果将这段相同的程序加载到内存的其他地址处运行,指令序列的起始地址可以重新指定,但是无法正确取出数据

例如将程序整体加载到内存0x1000处执行,指令中仍然从0x0100处取得数据,此时已无法正确取得操作数

说明:程序重定位的概念

① 程序重定位是指程序可以在内存中的任意地址正确运行

② 在大多数时候,整个程序(包括代码段和数据段)在内存中的位置并不是程序员决定的

2.1.3 程序重定位解决思路

代码段中的指令地址与数据段中的数据地址有2重属性,

① 在内存中的绝对地址

② 相对于段起始位置的偏移地址

通过使用偏移地址可以解决程序重定位问题

思路如下,

① 在编程时使用偏移地址

② 提供机制记录段的起始地址,在寻址时,通过记录的段基址 + 指令中的偏移地址实现寻址

这样程序就可以被加载到内存的不同地址处运行

2.3 内存分段机制

上节说明的是程序逻辑上的分段,以及程序重定位的解决思路。为解决该问题,需要处理器硬件层面的支持

① 在采用分段策略之后,一个内存单元的地址可以表示为"段基址:偏移地址",这就是通常所说的逻辑地址

② 为了在硬件层面支持"段基址 + 偏移地址"内存访问模式,处理器至少要提供2个段寄存器,分别是代码段寄存器(Code Segment,CS)和数据段寄存器(Data Segment,DS)

③ 当处理器访问内存时,将指令中的地址均视作段内偏移,而不是物理地址

④ 当程序被加载到不同的内存地址运行时,只要将相应的段基址分别传送到CS和DS,程序即可正确执行

2.4 8086的内存分段机制

2.4.1 8086通用寄存器

8086共有8个通用寄存器,"通用"的意思是他们之中的大部分可以根据需要用于多种目的,e.g. 在寄存器和内存之间相互传送数据,参与算术逻辑运算

其中AX / BX / CX / DX可以拆分为8个8位寄存器使用,对其中一个8位寄存器的操作不会影响到另一个8位寄存器

说明:数据暂存寄存器

比如将AX的内容和CX的内容相加,结果仍存储在AX中。那么在相加的结果返回到AX之前,需要通过数据暂存寄存器中转

2.4.2 8086段寄存器

8086共有4个段寄存器,

① CS:代码段寄存器

② DS:数据段寄存器

③ ES:附加段寄存器(Extra Segment),附加段就是当需要在程序中同时使用两个数据段时,可以用DS指向一个,用ES指向另一个

④ SS:栈段寄存器

2.4.3 指令指针寄存器

IP是指令指针寄存器(Instruction Pointer),他只能和CS一起使用,而且只有处理器才能直接改变他的内容

说明:指令预取队列

为了加快指令执行速度,8086内部有一个6B的指令预取队列,在处理器执行那些不需要访问内存的指令时,指令预取部件可以预取指令

2.4.4 8086内存访问的特殊处理

8086内存访问的特殊之处,在于8086是16位的处理器,但是却提供了20位地址线,因此需要通过16位的寄存器生成20位的物理地址

为了解决该问题,8086处理器在形成物理地址时,先将段寄存器的内容左移4位形成20位段基址,然后再和16位的偏移地址相加,即

20位物理地址 = 段寄存器左移4位 + 16位偏移地址

说明1:段基址的选择

假设内存从0x82251到0xFFFFF空闲,需要从中选择加载程序的段基址。因为偏移地址总是要求从0x0000开始,所以0x82260是第一个符合条件的物理地址,因为他恰好对应逻辑地址[0x8226 : 0x0000]

这里就引出8086的段基址16B对齐

说明2:段基址16B对齐

① 由于段基址由段寄存器左移4位构成,所以段基址一定是16B对齐的(从16位扩展到20位)

② 反过来,在选择段基址时,就需要是最后4位为0的地址,只有这样,才能将段基址的高16位写入段寄存器(从20位截取16位)

假设一个物理地址为0x22567,可以选择段基址为0x22560,偏移地址为0x0007,这样就可以将段寄存器设置为0x2256

说明3:分段机制的灵活性

同样是0x22567的物理地址,可以有多种[段基址:偏移地址]表示方式,方法非常灵活

同一个物理地址或同一片内存区域,根据需要可以随意指定一个段来访问他,只要目标物理地址位于该段的64KB范围内

X86汇编语言从实模式到保护模式01:处理器、内存和指令相关推荐

  1. x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上

    目录: 什么是任务 任务由什么组成 任务门描述符是什么东东?有了TSS描述符为什么要有任务门描述符? 参考文献 什么是任务 任务(task)是处理器可以分配.执行.挂起的工作单位,笔者认为和我们操作系 ...

  2. 硬盘和显卡的访问与控制(一)——《x86汇编语言:从实模式到保护模式》读书笔记01

    本文是<x86汇编语言:从实模式到保护模式>(电子工业出版社)的读书实验笔记. 这篇文章我们先不分析代码,而是说一下在Bochs环境下如何看到实验结果. 需要的源码文件 第一个文件是加载程 ...

  3. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  4. 《x86汇编语言:从实模式到保护模式》视频来了

    <x86汇编语言:从实模式到保护模式>视频来了 很多朋友留言,说我的专栏<x86汇编语言:从实模式到保护模式>写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节. ...

  5. 《x86汇编语言:从实模式到保护模式》读书笔记之后记

    本来打算把整本书的读书笔记写完,可是由于有其他的计划(就叫做"B计划"吧)且优先级更高,所以我的读书笔记搁浅了.为了全力以赴执行B计划,我的博客要荒芜一段时间(我希望不要永远荒芜下 ...

  6. 处理器在实施任务切换时的操作——《x86汇编语言:从实模式到保护模式》读书笔记39

    处理器在实施任务切换时的操作--<x86汇编语言:从实模式到保护模式>读书笔记39 处理器可以通过以下四种方法实施任务切换: 1. call指令或者jmp指令的操作数是GDT内的某个TSS ...

  7. 任务切换——《x86汇编语言:从实模式到保护模式》读书笔记38

    任务切换--<x86汇编语言:从实模式到保护模式>读书笔记38 本文及后面的几篇博文是原书第15章的学习笔记. 本章依然使用第13章的主引导程序. 1. 协同式多任务与抢占式多任务 有两种 ...

  8. 任务切换的方法——《x86汇编语言:从实模式到保护模式》读书笔记37

    任务切换的方法--<x86汇编语言:从实模式到保护模式>读书笔记37 1. 中断门和陷阱门 在实模式下,内存最低端的1M是中断向量表,保存着256个中断处理过程的段地址和偏移.当中断发生时 ...

  9. 任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36

    任务和特权级保护(五)--<x86汇编语言:从实模式到保护模式>读书笔记36 修改后的代码,有需要的朋友可以去下载(c14_new文件夹).下载地址是: GitHub: https://g ...

  10. 任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35

    任务和特权级保护(四)--<x86汇编语言:从实模式到保护模式>读书笔记35 7. 正式进入用户程序的局部空间 67 mov ebx,message_1 68 call far [fs:P ...

最新文章

  1. Stuart Russell:有益AI三原则,需满足人类偏好
  2. sublime text 使用笔记
  3. Python中通过PyPDF2实现PDF添加水印
  4. 阿里云技术白皮书_对阿里重磅发布的云原生架构白皮书的初步解读
  5. 在linux中emacs安装package.el
  6. 字符串压缩——C语言
  7. 《SQL高级应用和数据仓库基础(MySQL版)》作业 ·007
  8. [转载] python中svm的使用_Python中支持向量机SVM的使用方法详解
  9. 斯威夫特山地车_斯威夫特枚举
  10. Oracle10G各版本下载
  11. atmega168p与328p_ATMEGA328P-MU产品说明
  12. 电机转矩、功率、转速之间的关系及计算公式
  13. raid5用户mbr还是gpt_对硬盘进行分区时,GPT和MBR有什么区别?
  14. 国债(长短期)、财政赤字、利率、美元指数、国债收益率关系
  15. mysql中data后面加什么_mysql中data_format用法
  16. 没有对公账户怎么开通认证微信公众号?
  17. 关于vscode 中Live Server插件无法弹出Chrome浏览器问题
  18. 怎么看外文文献的影响因子_[转载]如何查找高质量外文文献 - SCI/SSCI/AHCInbs...
  19. C语言之贪吃蛇游戏源码
  20. 《第6讲 非线性优化 》读书笔记

热门文章

  1. setpairint,int 的用法
  2. jquery 监听返回事件
  3. Python 报错TypeError: expected string or bytes-like object
  4. java界面混乱_JAVA界面不稳定
  5. android studio真机调试失败,【Android】Android Studio真机调试的问题统整
  6. 用户变量和系统变量的区别_环境变量的用户变量与系统变量的区别
  7. 手机屏幕宽高像素计算_国内手机厂商纷纷支持,三星传感器终成正果!索尼还能雄起吗?...
  8. uniapp 表单提交图片跟其他填写数据_记录第一次实现表单数据提交到数据库
  9. element-ui中table表格表头和表格内容都水平居中
  10. SpringCloud五大组件详解