任务和特权级保护(五)——《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.这样做是为了在安装调用门的时候,可以方便地获得参数个数。
光在符号表中添加参数个数字段是不行的,我们还要修改安装调用门的代码,只需要增加下图中红色的那行。
为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章的学习。敬请关注…