实模式是指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 From: https://www.cnblogs.com/LCAB/p/17000304.html