任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36

任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36

修改后的代码,有需要的朋友可以去下载(c14_new文件夹)。下载地址是:
GitHub: https://github.com/LeslieChe/from-real-mode-to-protected-mode

第14章的习题2及解答

修改代码清单14-1和13-3,使得通过调用门请求读取硬盘扇区的服务时,通过栈传递参数。而且,传递的参数分别是逻辑扇区号、数据段选择子和段内偏移。要求使用ARPL指令。

注意,题目中的“数据段选择子”,不一定非得是DS,其他的指向数据段的段寄存也是可以的。

关于ARPL指令,可以参考我的博文
RPL的故事 ——《x86汇编语言:从实模式到保护模式》读书笔记31

下面仅解释这道题最关键的部分:对栈中参数的提取和ARPL指令的使用。

read_hard_disk_0:                           ;从硬盘读取一个逻辑扇区


        ;---------------
        ;| 逻辑扇区号 |@1
        ;---------------
        ;|数据段选择子 |@2
        ;---------------
        ;| 段内偏移   |@3
        ;---------------
        ;|     |  CS  |
        ;---------------
        ;|     EIP    |
        ;---------------
        ;|  8个寄存器 |
        ;---------------
        ;|     |  DS  |
        ;-------------- <-----EBP
        ;|            |

         pushad 
         push ds
         mov ebp,esp

因为是用栈传递参数,在执行完上面三行后,栈的示意图如上图所示。

         mov ax,[ebp+10*4] ;提取调用者的CS
         mov bx,[ebp+12*4] ;提取 @2数据段选择子
         arpl bx,ax        ;调整段选择子的 RPL
         mov ds,bx

         mov eax,[ebp+13*4];提取 @1逻辑扇区号
         mov ebx,[ebp+11*4];提取 @3段内偏移

         push eax ;因为后面的端口操作要用到 AL,所以先压栈保存扇区号

接下来的代码和配书源码基本相同,除了最后3行。

         loop .readw

         pop ds
         popad   
         retf 3*4                              ;段间返回 

用栈传递参数

除了上面的修改,我还把所有例程都改成了用栈来传递参数(如果需要传参的话)。

首先,要修改例程本身,这个与上面的习题类似,这里不再赘述。

其次,要修改调用门描述符中的参数个数字段。
为此,我修改了内核的符号表,在每个表项后面增加了参数个数字段(如下图)。如果不需要传递参数,那么这个字段应该填写0.这样做是为了在安装调用门的时候,可以方便地获得参数个数。
salt

光在符号表中添加参数个数字段是不行的,我们还要修改安装调用门的代码,只需要增加下图中红色的那行。

install_call_gate2

put_string增加颜色支持

我对五彩缤纷的字符情有独钟,所以为put_string例程增加了颜色支持。

最后运行结果如下图所示:

%include包含文件

类似在C语言源文件中用#include "XXX.h"包含其他文件, 在.asm源文件中也可以使用

%include "xxxxx"

例如在一个源文件中写了一句:

%include "macros.mac"

这会把文件macros.mac中的内容包含到现在的源文件中。用nasm编译文件的时候,会在当前目录下寻找被包含的文件,也可以在nasm命令行使用-i选项来增加搜索路径。

因为增加了颜色支持,为了方便,我把一些字符属性的值专门放在了“color.inc”文件中。

; define some colors

GREEN  EQU 0X02
BLUE   EQU 0X09
RED    EQU 0X04
YELLOW EQU 0X0E

那么引用这些符号常量(如GREEN)的时候,就需要用%include把这个文件包含进来。

第14章的学习笔记就到这里,下次我们开始第15章的学习。敬请关注…

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值