从实模式到保护模式第13到16章笔记汇编.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
从实模式到保护模式第13到16章笔记汇编

8.2 用户程序的结构 8.2.1 分段、段的汇编地址和段内汇编地址 处理器的工作模式是将内存分成逻辑上的段,指令的获取和数据的访问一律按“段地址:偏移地址”的方式进行。 NASM编译器使用汇编指令“SECTION”或者“SEGMENT”来定义段。它的一般格式是 SECTION段名称 SEGMENT段名称 align子句 理论上,如果不考虑段的对齐方式,那么段data1的汇编地址是0,段data2的汇编地址是1,段data3的汇编地址是2。 段的汇编地址其实就是段内第一个元素(数据、指令)的汇编地址。 在段data1中声明和初始化的0x55位于汇编地址0。 编译器将0为段data2的汇编地址,并在两个段之间填充15字节的0x00 段data3的汇编地址就是0十进制的32)。段data3只有1字节 8.2.2 用户程序头部 用户程序实际上定义了7个段,分别是第7行定义的段header、第27行定义的段code_1、第163行定义的段code_2、第173行定义的段data_1、第194行定义的段data_2、第201行定义的段stack和第208行定义的段trail。 第7行: SECTION header vstart=0 用户程序头部起码要包含以下信息。 ① 用户程序的尺寸,即以字节为单位的大小。 ② 应用程序的入口点,包括段地址和偏移地址。 第11、12行,依次声明并初始化了入口点的偏移地址和段地址。 代码段code_1是在代码清单8-2的第27行定义的: SECTION code_1 align=16 vstart=0 ③ 段重定位表。 8.3 加载程序(器)的工作流程 8.3.1 初始化和决定加载位置 第6行,加载器程序的一开始声明了一个常数(const): app_lba_start equ 100 常数是用伪指令equ声明的,它的意思是“等于”。本语句的意思是,用标号app_lba_start来代表数值100, app_lba_start equ 500 用equ声明的数值不占用任何汇编地址,也不在运行时占用任何内存位置。它仅仅代表一个数值,就这么简单。 加载用户程序需要确定一个内存物理地址,这是在代码清单8-1第151行用伪指令dd声的,并初始化为0x10000的。和前面一样,是用32位的单元来容纳一个20位的地址: phy_base dd 0x10000 8.3.2 准备加载用户程序 第9行: SECTION mbr align=16 vstart=0x7c00 第12~14行,用于初始化堆栈段寄存器SS和堆栈指针SP。之后,堆栈的段地址是0x0000,段的长度是64KB,堆栈指针将在段内0xFFFF和0x0000之间变化。 第16、17行,用于取得一个地址,用户程序将要从这个地址处开始加载。 这两条指令中都使用了段超越前缀“cs:”。这是允许的,意味着在访问内存单元时,使用CS 的内容作为段基址。之所以没有使用DS和ES,是因为它们另有安排。 第18~21行,用于将该物理地址变成16位的段地址,并传送到DS和 ES寄存器。 8.3.3 外围设备及其接口 外围设备分成两种,一种是输入设备;另一种是输出设备 输入设备和输出设备统称输入输出(Input/Output,I/O)设备。 ① 不可能将所有的I/O接口直接和处理器相连,设备那么多,还有些设备现在没有发明出来,将来一定会有。你怎么办? 总线技术。 ② 每个设备的I/O接口都抢着和处理器说话,不发生冲突都难。你怎么办? 使用输入输出控制设备集中器(I/O Controller Hub,ICH)芯片 8.3.4 I/O端口和端口访问 外围设备和处理器之间的通信是通过相应的I/O接口进行的。 处理器是通过端口(Port)来和外围设备打交道的。端口就是寄存器,类似于处理器内部的寄存器。不同之处仅仅在于,这些叫做端口的寄存器位于I/O接口电路中。 端口是处理器和外围设备通过I/O接口交流的窗口,每一个I/O接口都可能拥有好几个端口, 分别用于不同的目的。比如,连接硬盘的PATA/SATA接口就有几个端口,分别是命令端口、状态端口、参数端口。 8.3.5 通过硬盘控制器端口读扇区数据 从硬盘读写数据,最经典的方式是向硬盘控制器分别发送磁头号、柱面号和扇区号,这称为CHS模式。从硬盘上读逻辑扇区过程: 第1步,设置要读取的扇区数量。 第2步,设置起始LBA扇区号。 第3步,向端口0x1f7写入0x20,请求硬盘读。 第4步,等待读写操作完成。 第5步,连续取出数据。 8.3.6 过程调用 处理器支持一种叫过程调用的指令

文档评论(0)

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

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

1亿VIP精品文档

相关文档