全局描述符实验文档格式.docx
《全局描述符实验文档格式.docx》由会员分享,可在线阅读,更多相关《全局描述符实验文档格式.docx(20页珍藏版)》请在冰点文库上搜索。
![全局描述符实验文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/fcab71ed-1dac-4226-b5c9-17e0581886ee/fcab71ed-1dac-4226-b5c9-17e0581886ee1.gif)
D;
查看存储器中的内容(例如:
“D0010;
00”:
从“0010”个段描述符中偏移地址“00”开始查看存储器中的内容。
三、实验分析与小结:
(实验过程中的问题分析、产生的原因以及解决方法;
实验结果分析;
有待优化思路)
1.程序分析:
ESI指向的是GDT全局描述符,将GDT每8位为一组读入到EAX中,故最终ESI指向的是全局描述符表的最高位。
START4:
LODSB
START1:
MOVEAX,[ESI]
OREAX,[ESI]
JNZSTART3
ADDESI,8
START2:
INCCOUNT1
LOOPSTART1
将全局描述符的13~16位存入DH中,15~8位存入DL中以方便后面对全局描述符中的各属性进行测试判断。
MOVDL,[ESI-3]
MOVDH,[ESI-2]
先测试S位判断是否为系统段,若不为系统段则测试段类型的第一位,判断是否为数据段,若不为数据段,则为代码段
TESTDL,10H
JZSTART7
LEASI,SCODE
TESTDL,08H
JNZSTART5
LEASI,SDATA
START5:
CALLCOPYSTR
LEASI,S32
TESTDH,40H
JNZSTART6
LEASI,S16
JMPSTART6
输出段基址
MOVAL,[ESI-1];
显示段基地址
CALLDisplayByte
MOVAL,[ESI-4]
MOVAL,[ESI-5]
MOVAL,[ESI-6]
测试DPL,,再加上30H,输出DPL的特权级
TESTDL,40H
MOVAL,60H
ANDAL,DL
RORAL,5
ORAL,'
0'
数值转换为字符,在0-9之间加上30H直接输出,大于10的加上07H再输出
ORAL,30H
CMPAL,3AH
JBToASCII1
ADDAL,07H
2.数据结果及分析
结果数据:
0001:
FFFF0000009BCF00:
Code3200000000FFFFFFFFDPL:
0PR
0002:
FFFF00000093CF00:
Data3200000000FFFFFFFFDPL:
0PRW
0003:
FFFF000000FBCF00:
3PR
0004:
FFFF000000F3CF00:
3PRW
0005:
AB200020048B0080:
TSS3280042000000020ABDPL:
0PB
0006:
010000F0DF93C0FF:
Data32FFDFF00000001FFFDPL:
分析数据:
段描述符表结构图:
段基址
31:
24
G
D/B
AVL
段限
19:
16
P
DPL
S
段类型
23:
由于描述符表的数据比较多,因此挑选3个有代表性的全局描述符进行详细的分析分析如下:
(1)0001:
FFFF0000009BCF00:
Code3200000000FFFFFFFFDPL:
0001是编号,00000000是段基址,FFFFFFFF是段限,0是特权值DPL,P是存在位,R是其他属性。
FFFF0000009BCF00
段限段基址段属性
把9BC化成二进制为:
1
由于S=1,所以该段是代码段或数据段,因为段类型中D11位为1,故该段为代码段。
(2)0005:
AB20702D8B8B00F7:
TSS32F78B2D70000020ABDPL:
这行输出中0005是编号,F78B2D70是段基址,000020AB是段限,0是特权值DPL,P是存在位,B是其他属性。
AB20702D8B8B00F7
把8B0化成二进制为:
由于S=0,所以该段是系统段。
(3)0002:
FFFF00000093CF00:
Data3200000000FFFFFFFFDPL:
这行输出中0002是编号,00000000是段基址,FFFFFFFF是段限,0是特权值DPL,P是存在位,RW是其他属性。
FFFF00000093CFCF
把93C化成二进制为:
由于S=1,所以该段是代码段或数据段,因为段类型中D11位为0,故该段为数据段。
3.小结
在实验中一开始装载有错误是因为程序的路径不允许中文,把程序换一个路径即可。
通过本次实验我进一步了解了,我了解了全局描述符的作用和全局描述符是怎么存储每个元素的的地址,以及怎么用汇编去编写一个全局描述符。
通过课前预习了解了全局描述符表中各个段描述符的每一个字节代表什么含义。
知道了全局描述符表用于存放系统程序的段描述符、全局描述符和局部描述符表的段描述符以及段选择符的。
高13位存放段描述符在描述符表中的索引项,也就是偏移量。
根据段描述符计算机可以分辨段的基址、长度、段类型以及当前特权级等段的信息。
熟悉了编译环境,DOS中断,了解了汇编程序如何编译执行。
根据软件输出的信息分析数据。
并了解了指令的使用方法,以及编制汇编程序的基本格式和方法。
四、其它
得分(百分制)
附:
实验代码
MODELTINY;
说明存储模式
.386;
处理器选择伪操作
.STACK100
.DATA;
定义数据段
GDTDB1000HDUP(0);
存放读取的全局描述符表DBGDT[4096]={0}
bPAEDB0;
操作系统是WinxpSP2或更新
COUNTDW0
COUNT1DW0;
编号计数器
bufferDB80DUP(0);
存放ASCII的内存区域
sCodeDB4,'
Code'
sDataDB4,'
Data'
sTSS32DB6,'
TSS32'
s32DB2,'
32'
s16DB2,'
16'
sDPLDB4,'
DPL:
'
;
特权级
.CODE;
定义代码段
START:
MOVAH,00H;
MOVAL,03H;
INT10H;
设置显示模式文字80*2516
LEAEDI,GDT;
EDI(目标索引寄存器),ESI(源索引寄存器),DS:
ESI指向源串,ES:
EDI指向目标串
MOVAH,0FEH
MOVAL,00H
INT21H;
读GDTRSGDT[EDI]
LEAEBX,GDT;
EBX(基地址寄存器,在内存寻址时存放基地址)
MOVCX,[EBX];
取GDTR低16位送到CX,CX(16b)
INCCX;
CX:
全局描述符表长度
MOVCOUNT,CX
MOVEBX,[EBX+2];
EBX:
全局描述符表在系统中的地址(逻辑地址)
EDI:
存放读取的全局描述符表首地址
MOVAL,01H
读取数据
MOVCX,COUNT
SHRCX,3;
计数器/8
LEAESI,GDT
START1:
MOVEAX,[ESI];
判断开始的8个字节是不是为0
OREAX,[ESI+4]
JNZSTART3;
不相等跳转到START3
ADDESI,8;
相等ESI加8,指向下一个描述符表
//START:
清屏,将GDTR全局描述符表读取到GDT中,使用EDI作为指针指向全区描述符表带有首地址,用CX来存储全局描述符表带长度,由于是按字节读取,因此将CX=CX/8来表示描述符表带长度。
同时将编号计数器初始化为0;
START2:
pushax
movah,02h
int21h
popax
INCCOUNT1;
COUNT1加一,cx减一,跳转到START1
LOOPSTART1
START1和START2:
判断每次读出的全局描述符表的前8个字节是否为全0,若是则说明该编号内容不存在,由于全局描述符为64位,因此ESI向后移8个字节读下一个编号内容;
否则执行需要显示的相关全局描述符内容,相应的每检查一个,编号计数器COUNT+1,若COUNT-1=0,说明所有的群居描述符表中的全部内容索引一遍;
START17:
CALLIfExit
JZSTART17
JMPEXIT
START17:
当所有全局描述符表检查完毕后,判断是否退出,当有按键按下时则调用其退出,若没有则一直等待按键发生;
调用函数的解释
START3:
LEAEDI,BUFFER;
存放ASCII的内存
MOVAX,COUNT1
CALLDisplayWord;
显示编号计数器
MOVAL,'
:
STOSB
'
PUSHECX
MOVECX,8
START3:
显示编号计数器COUNT1的编号;
START4:
LODSB;
用于目的地址的内容读到源地址,SI->
AL
CALLDisplayByte;
显示ESI开始的8个字节
LOOPSTART4
PUSHESI
MOVDL,[ESI-3]
MOVDH,[ESI-2]
TESTDL,10H;
D12,s,0系统,1代码或数据
JZSTART7;
ZF等于0跳转
作用:
判断DL中第五位是否为0,若是则进入系统段
LEASI,sCode;
代码段
TESTDL,08H;
s=1,
JNZSTART5;
不等于0是代码段描述符
判断DL中第四位是否为0,若是则进入数据段,否则进入代码段
LEASI,sData;
等于零是数据段或堆栈段
显示ESI开始的全局描述符的前8个字节的内容,以及相应的CODE、DATA、TSS;
START5:
CALLCopyStr;
LEASI,s32
LEASI,s16
START5和START6:
显示段基地址以及32位限长,而这其中的后32位限长应当包含了其对应的权限和属性;
START7:
LEASI,sTSS32;
系统段
START6:
CALLCopyStr
POPESI
MOVAL,[ESI-1];
TESTDH,80H;
显示结束地址
JZSTART8
MOVAL,DH
ANDAL,0FH
CALLToASCII调用ToASCII函数,将其变成ASCII码
MOVAX,[ESI-8]
输出DH前四位的段限,再输出低字节开始的两个字节
CALLDisplayWord
F'
STOSB作用:
表示范围4kb-4GB
JMPSTART9
START8:
G=0时最大段长1MB,占20位
表示范围1b-1Mb
CALLToASCII
START9:
LEASI,sDPL;
显示DPL
MOVAL,60H
TESTDL,80H
测试DPL,输出DPL的特权级
JZSTART10
P'
测试段是否存在,DL第八位为0,则显示NP,否则显示P
JMPSTART11
START9:
显示每一个全局描述符对应的特权集DPL;
START10:
MOVAL,'
N'
在字符串中添加np
START10:
显示存在位P;
START11:
TESTDL,10H
JZSTART16
TESTDL,08H
JZSTART14
;
TESTDL,04H
JZSTART12
C'
START12:
TESTDL,02H
JZSTART13
R'
JMPSTART13
数据段或堆栈段
START14:
TESTDL,04H
JZSTART15
E'
START15:
TESTDL,02H
W'
START16:
MOVAL,0FH
START11~START16:
显示对应的其它属性;
START13:
MOVAL,0DH;
输出字符串
MOVAL,0AH
$'
LEADX,buffer
MOVAH,09H
输出字符串,$结尾
POPECX
JMPSTART2
ToASCIIPROCNEAR
ORAL,30H
CMPAL,3AH;
AL<
3A,CF=1
JBToASCII1;
cf=1跳转
数值转换为字符,0~9加上30H直接输出,大于10加上07H再输出
ToASCII1:
RET
ToASCIIENDP
TOASCII:
将相应的16进制转换为ASCII码;
isplayBytePROCNEAR
PUSHAX
ANDAL,0F0H
RORAL,4
STOSB;
将AX或AL存ES:
DI,已经是ASCII
POPAX
RET
DisplayByteENDP
DisplayWordPROCNEAR;
显示一个字
XCHGAL,AH
DisplayWordENDP
CopyStrPROCNEAR
LODSB;
取串指令
XORAH,AH
MOVCX,AX
REPMOVSB;
DS:
SI->
ES:
DI
CopyStrENDP
IfExitPROCNEAR
PUSHDX
MOVAH,06H;
MOVDL,0FFH
字符输出
POPDX
IfExitENDP
IfExit:
判断是否退出用于中断保护现场和退出现场;
Exit:
MOVAH,4CH;
跌返回码的结束程序
INT21H
ENDSTART