实模式是指CPU的寻址方式,寄存器大小,指令用法等,是用来反应CPU在该环境下如何工作的概念。

CPU的工作原理:CPU大体分为三个部分,控制、运算、存储单元。

控制单元是CPU的控制中心,大致由指令寄存器IR、指令译码器ID、操作控制器OC组成。程序被加载到内存后,指令指针寄存器IP指向内存中下一条待执行指令的地址,控制单元根据IP寄存器的指向,将位于内存中的指令逐个装载到指令寄存器中,指令译码器将位于指令寄存器中的指令按照指令格式解码,分析出操作码是什么,操作数在哪里之类的。

存储单元是指CPU内部的L1、L2缓存及寄存器,待处理的数据就存放在这些存储单元中,这里的数据是说指令中的操作数。

运算单元负责算术运算(加减乘除)和逻辑运算(比较,移位),它从控制单元那里接收命令(信号)并执行,它没有自主意识,只是个执行部件。

总结下CPU的工作原理:控制单元要取下一条待运行的指令,该指令的地址在程序计数器PC中,在 x86CPU上,程序计数器就是cs:ip。于是读取ip 寄存器后,将此地址送上地址总线,CPU根据此地址便得到了指令,并将其存入到指令寄存器IR中。这时候轮到指令译码器上场了,它根据指令格式检查指令寄存器中的指令,先确定操作码是什么,再检查操作数类型,若是在内存中,就将相应操作数从内存中取回放入自己的存储单元,若操作数是在寄存器中就直接用了,免了取操作数这一过程。操作码有了, 操作数也齐了,操作控制器给运算单元下令,开工,于是运算单元便真正开始执行指令了。ip寄存器的值被加上当前指令的大小,于是 ip 又指向了下一条指令的地址。接着控制单元又要取下一条指令了,流程回到了本段开头,CPU便开始了日复一日的循环,由于CPU特别不容易坏,所以唯一它停下来的条件就是停电。

实模式下CPU的内存寻址方式:寄存器寻址,立即数寻址,内存寻址。

寄存器寻址是最直接的寻址方式,直接从寄存器中拿数据即可。

立即数寻址是指操作数存在指令中,直接拿过来就能用,免去了找数的过程。

内存寻址又分为直接寻址(将操作数中的数字作为内存地址,取地址中的值为操作数),基址寻址(在操作数中用bx寄存器或寄存器作为地址的起始,地址的变化以它为基础),变址寻址(与基址寻址类似,只是寄存器变为si,di),基址变址寻址(基址寻址与变址寻址的结合)。

实模式下的ret

call,ret,jmp的原理都是修改寄存器CS,IP的值,将CPU导向新的位置。

ret的功能是在栈顶(ss:sp所指向的地址)弹出2字节内容来替换IP寄存器,还要维护栈顶指针,sp+2。

retf是从栈顶取4字节内容,栈顶2字节来替换IP寄存器,另外2字节替换CS寄存器,sp+4。

实模式下的call

call指令调用函数有四种方式:

16位实模式相对近调用:call所调用目标函数与当前代码段是同一个段,只给出偏移地址即可。给出目标函数的相对地址即可。

16位实模式间接绝对近调用:目标函数的地址没有直接给出,地址在寄存器或内存中的,不以立即数的形式出现。绝对是指目标函数的地址是绝对地址。

16位实模式直接绝对远调用:操作数以立即数形式给出。目标函数和当前地址不在同一段。

16位实模式间接绝对远调用:段基址和段内偏移地址在内存或寄存器中,但一个寄存器存不下,只支持内存寻址。

 实模式下的jmp:

jmp与call的区别在于jmp只要更新CS:IP的值,不需要保存他们的值,跳到新地址后无法返回。一共五类转移方式。

16位实模式相对短转移:相对说明操作数是个相对增量,短指明操作数大小满足-128~127的范围。

16位实模式相对近转移:与短转移相比操作数范围增大了,由8位变为16位。

16位实模式间接绝对近转移:将立即数地址存在寄存器或内存中,不跨段。

16位实模式直接绝对远转移:跨段的需求。

16位实模式间接绝对远转移:操作数放内存中。

有条件转移:根据上一条指令对标志寄存器中标志位的影响,根据不同的影响有不同的转移指令决定是否转移。

CPU的实模式的更多相关文章

  1. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...

  2. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  3. MIT 6.828 JOS学习笔记6. Appendix 1: 实模式(real mode)与保护模式(protected mode)

    在我们阅读boot loader代码时,遇到了两个非常重要的概念,实模式(real mode)和保护模式(protected mode). 首先我们要知道这两种模式都是CPU的工作模式,实模式是早期C ...

  4. 【OS】实模式和保护模式区别及寻址方式

    实模式和保护模式区别及寻址方式 转载请注明出处:http://blog.csdn.NET/rosetta 64KB-4GB-64TB? 我记得大学的汇编课程.组成原理课里老师讲过实模式和保护模式的区别 ...

  5. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第11章:进入保护模式

    ★PART1:进入保护模式 1. 全局描述符表(Global Descriptor Table,GDT)        32位保护模式下,如果要使用一个段,必须先登记,登记的信息包括段的起始地址,段的 ...

  7. ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构

    ★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...

  8. “段寄存器”的故事[转](彻底搞清内存段/elf段/实模式保护模式以及段寄存器)

    http://blog.csdn.net/michael2012zhao/article/details/5554023 一. 段寄存器的产生 段寄存器的产生源于Intel 8086 CPU体系结构中 ...

  9. Linux 桌面玩家指南:08. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  10. 全局描述符表(GDT)——《x86汇编语言:从实模式到保护模式》读书笔记09

    在进入保护模式之前,我们先要学习一些基础知识.今天我们看一下全局描述符表(Global Descriptor Table, 简称GDT). 同实模式一样,在保护模式下,对内存的访问仍然使用段地址加偏移 ...

随机推荐

  1. 5分钟明白LangChain 的输出解析器和链

    本文介绍 LangChain 的输出解析器OutputParser的使用,和基于LangChain的LCEL构建链. 1. 输出解析器OutputParser 1.1.为什么需要OutputParse ...

  2. golang 怎么获取kubernetes deployments的状态?

    如果我们需要把k8s的信息展示为一个友好的web页面.那么deployment 的信息基本上是非常重要的(大部分的服务都是使用deployment部署). 从yaml 中我们能获取到很多关于deplo ...

  3. ubuntu docker 解决sudo权限问题

    #如果还没有 docker group 就添加一个:$sudo groupadd docker#将用户加入该 group 内.然后退出并重新登录就生效啦.$sudo gpasswd -a ${USER ...

  4. ros2 foxy订阅话题问题

    代码片段 这部分代码在galactic版本编译是OK的,可在foxy下编译就出了问题 TeleopPanel::TeleopPanel(QWidget* parent) : rviz_common:: ...

  5. css 文本换行的问题

    今天测试再测试功能的时候无意间发现了这个css的bug,我们可以仔细看第一张图的最后两行,明明还没有到结尾就自动换到最后一行去了,按理说应该是撑满当前行再挤到下一行去,于是我就去看了下css的文本溢出 ...

  6. Vulkan Support Check and Dynamic Loader C++ code sample

    很多时候不想静态依赖VulkanSDK所提供的静态库,因为会遇到一些过早的电脑不支持vulkan, 那么就需要使用动态加载vulkan-1.dll(for Windows)或libMoltenVK.d ...

  7. ABC346

    D 枚举是哪一位相同,情况为 \(00\) 还是 \(11\),然后用前缀和和后缀和求一下即可. \(pre_{j,i}\) 表示第一位为 \(j\),前 \(i\) 位的每两个相同的字符均不相同的情 ...

  8. 通过 Helm Chart 部署 Easysearch

    Easysearch 可以通过 Helm 快速部署了,快来看看吧! Easysearch 的 Chart 仓库地址在这里 https://helm.infinilabs.com. 使用 Helm 部署 ...

  9. Scrapy框架(十)--增量式爬虫

    增量式爬虫 - 概念:监测网站数据更新的情况,只会爬取网站最新更新出来的数据. - 分析: - 指定一个起始url - 基于CrawlSpider获取其他页码链接 - 基于Rule将其他页码链接进行请 ...

  10. 比较 SpringSecurity 和 Shiro

    相比 Spring Security, Shiro 在保持强大功能的同时,使用简单性和灵活性. SpringSecurity: 即使是一个一个简单的请求, 最少得经过它的 8 个Filter.Spri ...