从实模式到保护模式第8到12章笔记讲述.doc

从实模式到保护模式第8到12章笔记讲述.doc

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
IA32 10.1 IA-32架构的基本执行环境 10.1.1 寄存器的扩展 在16位处理器内,有8个通用寄存器AX、BX、CX、DX、SI、DI、BP和SP,其中,前4个还可以拆分成两个独立的8位寄存器来用,即AH、AL、BH、BL、CH、CL、DH和DL。 为了在汇编语言程序中使用经过扩展(Extend)的寄存器,需要给它们命名,它们的名字 分别是EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP。可以在程序中使用这些寄存器, 即使是在实模式下: mov eax,0xf0000005 mov ecx,eax add edx,ecx 但是,就像以上指令所示的那样,指令的源操作数和目的操作数必须具有相同的长度,个别特 殊用途的指令除外。因此,像这样的搭配是不允许的,在程序编译时,编译器会报告错误: mov eax,cx ;错误的汇编语言指令 如果目的操作数是32位寄存器,源操作数是立即数,那么,立即数被视为32位的: mov eax,0xf5 ;EAX←0x000000f5 32位通用寄存器的高16位是不可独立使用的,但低16位保持同16位处理器的兼容性。因此, 在任何时候它们都可以照往常一样使用: mov ah,0x02 mov al,0x03 add ax,si 可以在32位处理器上运行16位处理器上的软件。但是,它并不是16位处理器的简单增强。 事实上,32位处理器有自己的32位工作模式,在本书中,32位模式特指32位保护模式。在这种 模式下,可以完全、充分地发挥处理器的性能。同时,在这种模式下,处理器可以使用它全部的32 根地址线,能够访问4GB内存。 10.1.2 基本的工作模式 8086具有16位的段寄存器、指令指针寄存器和通用寄存器(CS、SS、DS、ES、IP、AX、 BX、CX、DX、SI、DI、BP、SP),因此,我们称它为16位的处理器。尽管它可以访问1MB 的内存,但是只能分段进行,而且由于只能使用16位的段内偏移量,故段的长度最大只能是 64KB。8086只有一种工作模式,即实模式。当然,这个名称是后来才提出来的。 10.1.3 线性地址 为IA-32处理器编程,访问内存时,需要在程序中给出段地址和偏移量,因为分段是IA-32 架构的基本特征之一。传统上,段地址和偏移地址称为逻辑地址,偏移地址叫做有效地址 (Effective Address,EA),在指令中给出有效地址的方式叫做寻址方式(Addressing Mode)。 10.2 现代处理器的结构和特点 10.2.1 流水线 处理器的每一次更新换代,都会增加若干新特性,这是很自然的。同时我们也会发现,老 软件在新的处理器上跑得更快。这里面的原因很简单,处理器的设计者总是在想尽办法加快指 令的执行。 10.2.2 高速缓存 影响处理器速度的另一个因素是存储器。从处理器内部向外看,它们分别是寄存器、内存和硬 盘。当然,现在有的计算机已经用上了固态磁盘。 10.2.3 乱序执行 为了实现流水线技术,需要将指令拆分成更小的可独立执行部分,即拆分成微操作(Micro-Operations),简写为μops。 10.2.5 分支目标预测 流水线并不是百分之百完美的解决方案。实际上,有很多潜在的因素会使得流水线不能达到最 佳的效率。一个典型的情况是,如果遇到一条转移指令,则后面那些已经进入流水线的指令就都无 效了。换句话说,我们必须清空(Flush)流水线,从要转移到的目标位置处重新取指令放入流水线。 10.3.1 32位处理器的寻址方式 在16位处理器上,指令中的操作数可以是8位或者16位的寄存器、指向8位或者16位实际 操作数的16位内存地址,以及8位或16位的立即数。 第十一章 进入保护模式 NASM编译 情景描述 使用NASM编译一段程序,并可以在裸机上运行。 实现功能 在开机后显示Hello, OS world! 流程 初始化寄存器 调用BIOS int 10h,显示字符串 进入死循环 代码及注释 %define _BOOT_DEBUG_ %ifdef _BOOT_DEBUG_ org 0100h %else org 07c00h %endif ;告诉编译器加载到0100处生成,这样方便生成com文件。 ;或者告诉编译器加载到7c00处生成,这样方便 mov ax,cs ;将当前段地址放入ax,可以不要 mov ds,ax ;将当前段地址放入数据寄存器,可以不要 mov es,ax ;将当前段地址放入extra寄存器,可以不要 call DispStr ;调

文档评论(0)

5500046 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档