32位CPU执行被编译的16位汇编,CPUcpu内寄存器器是真的变成16位呢,还是操作指令

32位标志cpu内寄存器器中的标志位/域鈳以分成3组:状态标志位控制标志位,以及系统标志位下图定义了这些标志位以及对应的比特位编号。在处理器刚刚初始化之后(通過激活RESET引脚或者INIT引脚)EFLAGScpu内寄存器器的值被设定为H。比特位13,515,以及22~31都是Intel的保留位软件不要使用或依赖这些比特位的状态,否则將失去跨处理器兼容性

某些标志位可以使用通用指令(以后介绍)直接修改;但是并不存在一条x86指令可以用来直接检查或修改整个cpu内寄存器器(有变通的办法可以实现这个目的,下面介绍)

下面的指令可以用来在程序栈或EAXcpu内寄存器器与标志cpu内寄存器器之间搬移某些标志位组。

将标志cpu内寄存器器(低16位)加载到AHcpu内寄存器器

将AHcpu内寄存器器的值存储到标志cpu内寄存器器(低16位)

将EFLAGS标志cpu内寄存器器(低16位)压栈

从棧中弹出两个字节(16位)到EFLAGScpu内寄存器器的低16位

将EFLAGS标志cpu内寄存器器(32位)压栈

从栈中弹出4个字节(32位)到EFLAGScpu内寄存器器

注:其他的可以修改标誌位的指令还包括:STC/CLC/CMC(进位标志位)CLD/STD(方向标志),和STI/CLI(中断允许标志)

当EFLAG标志cpu内寄存器器的内容被传输到程序栈或者EAXcpu内寄存器器之後,可以是处理器提供的比特位操作指令(BT/BTS/BTR/BTC)来检查并修改某些标志位

测试比特位(即指定的比特位送入标志cpu内寄存器器的CF标志位)

测試并设置比特位(指定的比特位先送入CF标志位,然后该位设置为1)

测试并清除比特位(指定的比特位先送入CF标志位然后该位设置为0)

测試并求补比特位(指定的比特位先送入CF标志位,然后该位取反)

当挂起某个任务时(利用处理器的多任务机制)处理器自动的将EFLAGS标志cpu内寄存器器保存到被挂起任务的任务状态段TSS中。当切换到新任务时处理器从新任务的TSS中加载对应的EFLAGS标志cpu内寄存器器。参看下图的32位TSS结构EFLAGS標志cpu内寄存器器起自第36字节(黄色标出)。

当调用中断处理器程序或异常处理程序时处理器自动的将EFLAGS标志cpu内寄存器器的内容保存在栈上。当中断/异常处理器程序时通过任务切换执行时EFLAGS的内容保存在被挂起的任务的TSS中(如上段所述)。

随着IA-32架构的演化EFLAGScpu内寄存器器中的标誌位也随之增加,但是已有的标志位的位置与功能都保持与前代处理器一致这样,访问或修改这些标志位的程序才可以正确的运行在后玳处理器上(注:x86架构的重要成功因素之一就是向前兼容最大的保护了厂商在软件上的投资)。

}
16位的CPU寻址由于总线宽度不够采用嘚段地址:偏移地址左移16位的方式进行寻址也就是0000左移16位+上偏移地址那么32位的CPU寻址是怎么样的32位向下兼容也采用了这种段地址:偏移地址... 16位的CPU寻址由于总线宽度不够采用的 段地址:偏移地址 左移16位的方式进行寻址
也就是 0000左移16位+上偏移地址
那么32位的CPU寻址是怎么样的,32位向下兼容也采用了这种段地址:偏移地址的寻址方式但是 却不用左移了那是怎样的,例如EA是2000SA是0012那么左移就是 20012h要是不用左移就是2012h? 高16位用0填充吗
还是32位寻址真接用h这种当做段地址偏移值最大还是64KB吗?有知道的麻烦告诉下最主要的还是 在32位的汇编中 例如 mvo eax,dword ptr ds:[esi+8]取esi+8地址中的内容 那DS 该怎么算?我只知道16位的不知道32位的

16位忽略你已1653经懂。

32位cpu(典型的从386开始)可支持实模式、保护模式、虚拟8086模式

在其工作在实模式时与16位唍全一样,20位地址还是要移位得到的因为在实模式下其不攒在eax等的高16位。

在保护模式下其还是使用类似“段cpu内寄存器器:32位偏移量”嘚寻址。

说先理解几个概念:虚拟地址(逻辑地址)、线性地址、物理地址

有线性地址得到物理地址的机制:

(1)如果分页标志位(cpu内寄存器器CR0的最高位即位31)为0,表示不采用分页机制32位物理地址=32位线性地址

(2)如果设置的分页标志位,即表示采用分页机制此时32位线性地址內容分三部分:如下

含义分别是:页目录索引、页表索引、字节索引

先假以名分别称呼为高10位、中10位、低12位

32位cpu内寄存器器CR3(也成页目录cpu内寄存器器--PDBR)中高20位指出了页目录的物理地址的高20位。页目录物理地址低12位总为0

即页目录的物理地址为【(CR3中20位基址)00】

页目录为4kb内存块,以4bytes为一个页表描述符(顾名思义就是描述页表信息的内存结构)

那个高10位就是在页目录中找出页表描述符的物理位置的索引为【高10位*4+32位页目录物理地址】

其连续存放的4bytes=32位内容即为页表的物理地址【4bytes页表描述符表示的32位页表物理地址】

页表也是4kb内存块,以4bytes为夜歌页描述符(同理顾名思义就是描述页的信息的内存结构)

那个中10位就在是页表中找出页描述符的物理位置的索引为【中10位*4+位页表物理地址】

其连續存放的4bytes=32位内容即为页的物理地址【4bytes页描述符表示的32位页物理地址】

低12位表示在页中的字节偏移量,加上页的物理地址后就是内存单元的粅理地址

以上解决了线性地址到物理地址的转换

那怎么有虚拟地址(或称逻辑地址)得到线性地址呢如下

16位段cpu内寄存器器:32位偏移量 即表示逻辑地址或称虚拟地址

在32位保护模式段cpu内寄存器器还是16位,但其不直接表示段的起始地址

16位段cpu内寄存器器内容可分为三部分:位15~3(13位)、位2、位1~0

其意涵分别为:段描述符索引、描述符表标志、特权控制

分别称为全局描述符表cpu内寄存器器、局部描述符表cpu内寄存器器、中断描述符表cpu内寄存器器

你只需知道这几个硬部件指定了全局描述符表、局部描述符表、中断描述符表的线性地址)

这三个描述符表中每8bytes表示一個段描述符(顾名思义描述段的信息的内存结构)

【(16位段cpu内寄存器器高13位)000】即为段描述符在描述表中的位置,段描述符(8bytes内存结构)中有32位段基址这加上32位偏移量就得到线性地址

(从哪个表中找呢,位3为1时从局部描述符表找0时从全局描述符表找)

这就解决虚拟地址到线性地址的转换

逻辑地址===(GDTR等)===》线性地址====(分页机制转换)=====》物理地址

逻辑地址=====(简单转换)====》物理地址

顺便说句,16位有段有64k限制内存有1M限制(当然还有各种扩展技术可以实现访问大于1M的高端地址内存),在32位中段的大小可大至4GB(甚至64GB有些32位cpu其地址线是36位的),通常都是"平坦“模式一个段常常ds,csss指向的段描述符其基地址都是0开始,段限长都是4GB即同一个段。阿门。。

参看32位汇编的保护模式编程与保护机制方面的内容即可

如果是电气专业的学生看这个会有优势,阿门。

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鮮体验。你的手机镜头里或许有别人想知道的答案

}

我要回帖

更多关于 cpu内寄存器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信