2.4 保护模式软件体系结构
4.6 Win32汇编语言程序设计
2.4.1 描述符与描述符表
2.4.2 保护模式的寄存器模型
2.4.3 保护模式下存储器寻址
2.4.4 虚拟 8086模式
2.4 保护模式软件体系结构
1,特权级 (PL,Privilege Level):
2.4.1 描述符与描述符表任务:程序在执行时的一种情况,是一个动态的概念
Pentium为每个任务提供了 4种特权级,0级最高,3级最低应用程序常规扩展系统服务内核级别 0
级别 1
级别 2
级别 3
2,描述符 (Descriptor):
描述存储器段的属性的一个 8字节的数据结构。
包括段描述符、系统段描述符和门描述符三种类型。
段描述符:
用于描述代码、数据和堆栈段(用户段)
0
1
2
3
4
5
6
7
段界限 0~15位段基址 0~23位访问权限字节段界限 16~19位段基址 24~31位
DG 0 AVL
段描述符:
G位 (粒度位 ):
G=0,段的长度以字节为单位段长最大 1M字节
G=1,段的长度以页 (4K字节 )为长度单位段长最大 1M?4K=4G字节
D位,D=0,16位指令方式
D=1,32位指令方式
AVL位,AVL=0,程序不可使用本段
AVL=1,程序可以使用本段
0
1
2
3
4
5
6
7
T 0 ~1 5
ù?· 0 ~2 3
·ê è¨?T ×ú
T 1 6 ~1 9
ù?· 2 4 ~3 1
DG 0 A V L
段描述符:
访问权限字节
01234567
AP DPL S E EDC RW
P位,P=0,段不在内存中
P=1,段在内存中
DPL:取值 0~3,确定段的特权级
S位,S=1,段描述符
A位,A=0,段尚未被访问
A=1,段已被访问
段描述符:
访问权限字节 01234567
AP DPL S E EDC WR
1~3位表示段的类型
E=0,为数据段
ED=0,段向上扩展为数据段
ED=1,段向下扩展为堆栈段
W=0,数据段只读
W=1,数据段可写
E=1,为代码段
C=0,忽略描述符特权级
C=1,遵循描述符特权级
R=0,代码段不可读即只执行
R=1,代码段可读
系统段描述符:
格式与段描述符基本相同,主要差别 ①访问权限字节
01234567
P DPL S TYPE
S=0,系统段描述符
TYPE为 4个字节,共有 16种类型。其中:
2,LDT
9,TSS,非忙
B,TSS,忙
5,任务门
C,调用门
E,中断门
F,陷阱门
② D位无定义 (D=0)
门描述符:
偏移量:相对于段基地址的偏移量,
为目标代码的入口点选择符:用于确定段基地址字计数:从调用者堆栈中复制到被调用者堆栈中的参数个数,
参数为 32位
0
1
2
3
4
5
6
7
ò? á? 0 ~1 5
·? 0 ~1 5
·ê è¨?T ×ú
ò? á? 1 6 ~3 1
0 0 0 × êy
属于系统段描述符门提供了将程序控制转给服务程序入口的手段。有任务门,调用门,中断门、陷阱门 4种类型
门描述符:
0
1
2
3
4
5
6
7
ò? á? 0 ~1 5
·? 0 ~1 5
·ê è¨?T ×ú
ò? á? 1 6 ~3 1
0 0 0 × êy
访问权限字节格式与系统段描述符相同
DPL为任务允许访问该门的最低特权级例:判断描述符所描述的段的性质
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0
0
1
2
3
4
5
6
7
P=1,S=0,DPL=2
TYPE=2,为 DLT
因此为一个特权级为 2的 DLT,
已经在内存中该 DLT的基址为 00200000H,
界限为 00300H
G=0,段的长度为字节长度
AVL=0
该段不可被程序访问
3,描述符表描述符表由描述符顺序排列组成,占内存一定的区域,
由系统地址寄存器( GDTR,IDTR,LDTR) 指示其在物理存储器中的位置和大小描述符表有三种:
全局描述符表 GDT
中断描述符表 IDT
局部描述符表 LDT
2.4.2 保护模式的寄存器模型
0151631
015
0151631 78
AL
BL
CL
DL
AX
BX
CX
DX
AH
BH
CH
DH
E A X
E B X
E C X
E D X
IP
CS
DS
SS
ES
FS
GS
SP
BP
SI
DI
E S P
E B P
E S I
E D I
0151631 78
E I P
E F L A G S
031
01531
0151647
015
G D T R
I D T R
B A S E L I M I T
B A S E L I M I T
TR
M S WC R 0
C R 1
C R 2
C R 3
L D T R
C R 4
0151631
015
0151631 78
AL
BL
CL
DL
AX
BX
CX
DX
AH
BH
CH
DH
EAX
EBX
ECX
EDX
IP
CS
DS
SS
ES
FS
GS
SP
BP
SI
DI
ESP
EBP
ESI
EDI
FLAGS
CR0
实模式的寄存器模型
1,全局描述符表寄存器 GDTR
在物理存储器地址空间中定义全局描述符表 GDT
0151647
GDTR BASE LIMIT
BASE指示 GDT在物理存储器中开始的位置
LIMIT规定 GDT的界限
LIMIT有 16位,从而 GDT最大 65536个字节,
能够容纳 65536/8=8192个描述符例,(GDTR)=001000000FFFH,求 GDT在物理存储器中的起始地址,结束地址,表的大小,表中可以存放多少个描述符?
1,全局描述符表寄存器 GDTR
解,GDT的起始地址为 00100000H
结束地址为
00100000H+0FFFH=00100FFFH
表的大小为
0FFFH+1=4096字节表中可以存放
4096/8=512个描述符
2,中断描述符表寄存器 IDTR
在物理存储器地址空间中定义中断描述符表 IDT
0151647
IDTR BASE LIMIT
由于 Pentium只能支持 256个中断和异常,因此
LIMIT最大为 0FFFH
IDT中的描述符类型为中断门
3,局部描述符表寄存器 LDTR
LDT定义任务用到的局部存储器地址空间
16位的 LDTR并不直接定义 LDT,它只是一个指向
GDT中 LDT描述符的选择符。
如果 LDTR中装入了选择符,相应的描述符将从 GDT
中读出并装入局部描述符表高速缓冲寄存器。将该描述符装入高速缓冲寄存器就为当前任务创建了一个
LDT
GDTR
GDT
BASE LIMIT
LTD描述符
LDTR
LDT
基址 界限
32位 16位
LDT描述符高速缓冲寄存器(不可见)
4,控制寄存器
4,控制寄存器
CR0的低 5位组成机器状态字( MSW):
PE,0—— 实模式; 1—— 保护模式
MP,1(系统有数学协处理器 )
EM,0
TS,任务切换,切换任务时自动设置
ET,1(协处理器的类型 )
存储器分页机制:
CR0中的 PG位设置为 1,表示允许分页
CR3包含页目录基址,指向页目录的开头如果发生缺页,则将发生缺页的地址保存在 CR2中
4,控制寄存器
5,任务寄存器 TR
存放 16位的选择符,指示全局描述符表中任务状态段
( TSS)描述符的位置当选择符装入 TR时,相应的 TSS描述符自动从存储器中读出并装入任务描述符缓冲寄存器。该描述符定义了一个称为 任务状态段( TSS)的存储块。每个任务都有 TSS,TSS包含启动任务所必需的信息。
TSS最大 64K字节
GDTR
GDT
BASE LIMIT
TSS描述符
TR
基址 界限
32位 16位
TSSTSS描述符高速缓冲寄存器(不可见)
6,段选择符寄存器保护模式下 CS,DS,SS,ES,FS,GS寄存器称为段选择符寄存器,其值不再是基址而是选择符,它选择一个定义存储器段大小和属性的描述符
012315
TI RPL索引RPL,申请特权级 0~3
TI,表指示符
0—— 使用全局描述符表
1—— 使用局部描述符表索引:选择描述符表入口
6,段选择符寄存器例:设 LDT的基址为 00120000H,GDT的基址为 00100000H,(CS)=1007H,那么:
①请求的特权级是多少
②段描述符位于 GDT中还是 LDT中
③段描述符的地址是什么解,(CS)=1007H=0001 0000 0000 0111B
① RPL=3,申请的特权级为 3
② TI=1,描述符位于 LDT中
③描述符相对于 LDT基址的偏移量为
0001000000000B?8=512?8=4096=1000H
段描述符的地址为
00120000H+1000H=00121000H
7,标志寄存器 EFLAGS
IOPL,输入 /输出特权级
VM,虚拟 8086模式标志
2.4.3 保护模式下存储器寻址实模式存储器寻址
2.4.3 保护模式下存储器寻址保护模式的存储器管理单元使用 48位存储器指针:
16位选择符,32位偏移量选择符放在段选择符寄存器中偏移量放在其他用户可访问的 32位寄存器中偏移量 32位,因此段的大小可以达到 4G字节
48位存储器指针称为虚拟地址(逻辑地址)
16位选择符中有 14位用于存储器段选择,虚拟空间中可容纳 16384个段,每段最大 4GB,因而虚拟地址空间最大 64TB
1,虚拟地址空间的分段在分段模型中,64TB虚拟地址空间被分为 32TB的全局存储器地址空间和 32TB局部存储器地址空间全局段 0
全局段 8192
局部段 0
局部段 8192
虚拟地址空间
64TB
局部地址空间
32TB
全局地址空间
32TB
2,段式地址转换虚拟地址指针
GDT/LDT
选择符 偏移量段 描述符数据段描述符高速缓冲寄存器(不可见) 数据段操作数
DS EAX
2,段式地址转换
CS
DS
SS
ES
FS
GS
程序员可见访问权限访问权限基址界限
01920515263
段描述符高速缓冲寄存器(不可见)
2,段式地址转换例:假设虚拟地址为 0100:00000200H,禁止分页。如果描述符中读出的段基址为 00030000H,那么操作数的物理地址是什么?
解:
将此虚拟地址转换成物理地址为基地址 +偏移量
=00030000H+00002000H
=00032000H
3,分页机制分段法:将程序分成可变长的若干段分页法:将程序分成若干相同大小的页,每页长 4KB
如果不允许分页,那么分段机构确定的 32位线性地址即为物理地址;如果允许分页,就要将 32位线性地址通过两级表格结构转换成物理地址,第一级是页目录,第二级是页表
3,分页机制页目录长 4KB,包含最多 1024个页目录项,每个页目录项 4字节
7 6 5 4 3 2 1 0
0 0 A 0 0 U/S R/W P
页表地址 0~3 位 OS 专用 0
页表地址 4~11位页表地址 12~19位
0
1
2
3
3,分页机制页表的起始地址是 4K的整数倍,因此 32位地址的低 12
位总为 0,用高 20位表示即可
7 6 5 4 3 2 1 0
0 0 A 0 0 U / S R/ W P
ò3 ±í μ· 0 ~3 OS רó? 0
ò3 ±í μ· 4 ~1 1
ò3 ±í μ· 1 2 ~1 9
U/S R/W 特权级 3 特权级 0~2
0 0 无 读 /写
0 1 无 读 /写
1 0 只读 读 /写
1 1 读 /写 读 /写
3,分页机制页表长 4KB,包含最多 1024个页面项,每项 4字节
7 6 5 4 3 2 1 0
0 D A 0 0 U/S R/W P
页面地址 0~3 位 OS 专用 0
页面地址 4~11位页面地址 12~19位
0
1
2
3
页面的起始地址为 4K的整数倍,所以 32位页面地址只用高 20位
D位:对所涉及页面进行写操作时,D置 1
3,分页机制整个存储器有一个页目录,它最多有 1024个页目录项,
每个页目录项可含有 1024个页面项
—— 共有 1024?1024=1M个页面,每页面 4KB,存储器大小正好 4GB
目录 页 偏移量
31 22 21 12 11 0
线性地址格式
3,分页机制线性地址页目录目录 偏移量页目录项页面操作数页
CR3
页表页表项
3,分页机制
TLB—— 转换后援缓冲器
TLB为一个 Cache,其中保存了 32个最近使用的页转换地址。若访问同样的存储区域,则不必再访问页目录和页表,可以加快程序的运行。
例:对于线性地址 00000000H~00000FFFH,将选中页目录项 0和页表项 0。若页表项 0包含的地址为
00100000H,则线性地址 00000000H~00000FFFH对应的物理地址为 00100000H~00100FFFH
2.4.4 虚拟 8086模式保护模式的子模式在保护模式下,只要将 EFLAGS寄存器的 VM位置 1,
处理器便进入 V86模式。将 VM位清 0,处理器便又退回保护模式当处理器处于 V86模式时,段寄存器的使用与实模式相同。
通过分页操作,V86的 1MB地址空间可以转换到
Pentium的 4GB空间的任何地方
4.6 Win32汇编语言程序设计一,Win32汇编语言程序的结构二,Win32 API的调用一,Win32汇编语言程序的结构
.386
.MODEL FLAT,STDCALL
.DATA
...initialized data
.DATA?
...uninitialized data
.CONST
...constants
.CODE
<label>
...code
END <label>
设置汇编程序使用的指令集设置汇编程序使用的内存模式和参数传递规则
.DATA
.DATA?
.CONST
.CODE
....,
.DATA 包含已初始化的数据
.DATA? 包含未初始化的数据
.CONST 包含常数声明
.CODE 包含程序代码
<label>
END <label>
程序代码一,Win32汇编语言程序的结构(续 1)
C(cdecl)调用规则和 PASCAL调用规则
foo(int first_param,int second_param,int third_param)
采用 cdecl调用规则的汇编代码为
push [third_param] ; 第三个参数压栈
push [second_param] ; 第二个参数压栈
push [first_param] ; 第一个参数压栈
call foo
add sp,12 ; 主调函数对堆栈进行平衡
PASCAL调用规则与 C调用规则正相反
C调用规则从右向左传递参数,主调函数负责清栈一,Win32汇编语言程序的结构(续 2)
STDCALLl调用规则从右向左传递参数,被调函数负责对堆栈进行平衡
变长参数问题
int wsprintf( LPTSTR lpOut,LPCTSTR lpFmt,...)
必须采用 cdecl调用规则二,Win32 API的调用
Win32 API
API=Application Programming Interface
应用程序编程接口
Win32 API相当于 DOS系统功能
kernel32.dll 包含处理内存和进程管理的 API函数
user32.dll 主要用来控制用户界面
gdi32.dll 主要负责图形操作二,Win32 API的调用(续 1)
API函数的定义
int MessageBox(
HWND hWnd,// handle of owner window
LPCTSTR lpText,// address of text in message box
LPCTSTR lpCaption,// address of title of message box
UINT uType // style of message box
);
Microsoft Win32应用程序接口 参考手册 (上、下 ),清华大学出版社
MSDN Library ---Microsoft Visual Studio
二,Win32 API的调用(续 2)
API函数的调用
push mb_ok ;PUSH value for uType
push lpCaption ;PUSH Pointer to Caption
push lpText ;PUSH Pointer to Text
push hWnd ;PUSH Masterhandle
call MessageBoxA ;CALL MessageBoxA
1,常规方法调用 Win32 API函数时,函数名必须区分大小写,
将 MessageBoxA写成 messageboxa是错误的。
API函数的调用二,Win32 API的调用(续 3)
2,PROTO与 INVOKE伪指令 (MASM6.x)
MessageBoxA PROTO hWnd:DWORD,lpText:DWORD,
lpCaption:DWORD,uType:DWORD
位置在程序的开始处,或在包含文件中,用 INCLUDE伪指令包含到当前文件中
INVOKE MessageBoxA,NULL,lpMsgBoxText,
lpMsgBoxCaption,MB_OK
API函数的返回值二,Win32 API的调用(续 4)
函数调用后的返回值保存在 EAX寄存器中
涉及字符串的 API函数
MessageBoxA ANSI(8位 ) Windows 9x
MessageBoxW Unicode(16位 ) Windows NT
二,Win32 API的调用(续 5)
示例; set options for the assembler
.386
.model flat,stdcall; declaration of all used API-functions
ExitProcess PROTO,DWORD
MessageBoxA PROTO,DWORD,:DWORD,:DWORD,:DWORD; here begins our,data section
.data
Text db "Hello,World!",0 ;Text,terminated with "0"
Caption db "Hello",0 ;Caption string,0-terminated; here begins our,const section
.const
NULL equ 0
MB_OK equ 0; here we start with our code
.code
Start,
INVOKE MessageBoxA,NULL,ADDR Text,ADDR Caption,MB_OK
INVOKE ExitProcess,NULL
end Start
二,Win32 API的调用(续 6)
二,Win32 API的调用(续 7)
汇编与连接
ml /c /coff /Cp hello.asm
/c指示 MASM只进行汇编,不调用连接程序;
/coff 指示 MASM以 COFF 格式创建,obj文件;
/Cp指示 MASM保持用户标识符的大小写。
link32 /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm611\lib
hello.obj kernel32.lib user32.lib
/SUBSYSTEM:WINDOWS通知 Link可执行文件是 Windows应用程序;
/LIBPATH:c:\masm611\lib指示导入库的路径。
D:\masmwin32> ml /c /coff /Cp hello.asm
Microsoft (R) Macro Assembler Version 6.13.7299
Copyright (C) Microsoft Corp 1981-1997,All rights reserved.
Assembling,hello.asm
D:\masmwin32> link32 /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm611\lib hello.obj kernel32.lib
user32.lib
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998,All rights reserved.
D:\masmwin32> hello
二,Win32 API的调用(续 8)
D:\masmwin32>
二,Win32 API的调用(续 9)
包含文件可以将常用的函数原型定义存放在一个文件中,
在编写程序时用 INCLUDE语句将其包含进来。
我们可以直接使用现成的包含文件,其中最常用的是 user32.inc,kernel32.inc,gdi32.inc和
windows.inc,
利用包含文件,可以使汇编程序的源代码得到简化。
二,Win32 API的调用(续 10)
.386
.model flat,stdcall
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
.data
Text db "Hello,World!",0 ;Text,terminated with "0"
Caption db "Hello",0 ;Caption string,0-terminated
.code
Start,
INVOKE MessageBoxA,NULL,ADDR Text,ADDR Caption,MB_OK
INVOKE ExitProcess,NULL
end Start
1,判断下面描述符所描述的段的性质
0
1
2
3
4
5
6
7
0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0
1 0 1 1 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1
1 1 1 1 1 1 1 1
作业
2,如果 (GDTR)=0021000001FFH,那么 GDT的起始地址和终止地址是什么?表长多少?表中能存放多少个描述符?
3,如果允许分页,那么 Pentium微处理器的地址空间可以分成多少页?
4,若将线性地址 00200000H送给分页机制,那么将访问哪个页目录项,
哪个页表项?
5,试述 TLB的作用上机作业 (选做 )
1.用汇编语言编程显示如下消息框。
2.在上题显示的消息框中,如果用户按下“重试”按钮,则再次显示同样的消息框,直到用户按下“取消”按钮退出。
4.6 Win32汇编语言程序设计
2.4.1 描述符与描述符表
2.4.2 保护模式的寄存器模型
2.4.3 保护模式下存储器寻址
2.4.4 虚拟 8086模式
2.4 保护模式软件体系结构
1,特权级 (PL,Privilege Level):
2.4.1 描述符与描述符表任务:程序在执行时的一种情况,是一个动态的概念
Pentium为每个任务提供了 4种特权级,0级最高,3级最低应用程序常规扩展系统服务内核级别 0
级别 1
级别 2
级别 3
2,描述符 (Descriptor):
描述存储器段的属性的一个 8字节的数据结构。
包括段描述符、系统段描述符和门描述符三种类型。
段描述符:
用于描述代码、数据和堆栈段(用户段)
0
1
2
3
4
5
6
7
段界限 0~15位段基址 0~23位访问权限字节段界限 16~19位段基址 24~31位
DG 0 AVL
段描述符:
G位 (粒度位 ):
G=0,段的长度以字节为单位段长最大 1M字节
G=1,段的长度以页 (4K字节 )为长度单位段长最大 1M?4K=4G字节
D位,D=0,16位指令方式
D=1,32位指令方式
AVL位,AVL=0,程序不可使用本段
AVL=1,程序可以使用本段
0
1
2
3
4
5
6
7
T 0 ~1 5
ù?· 0 ~2 3
·ê è¨?T ×ú
T 1 6 ~1 9
ù?· 2 4 ~3 1
DG 0 A V L
段描述符:
访问权限字节
01234567
AP DPL S E EDC RW
P位,P=0,段不在内存中
P=1,段在内存中
DPL:取值 0~3,确定段的特权级
S位,S=1,段描述符
A位,A=0,段尚未被访问
A=1,段已被访问
段描述符:
访问权限字节 01234567
AP DPL S E EDC WR
1~3位表示段的类型
E=0,为数据段
ED=0,段向上扩展为数据段
ED=1,段向下扩展为堆栈段
W=0,数据段只读
W=1,数据段可写
E=1,为代码段
C=0,忽略描述符特权级
C=1,遵循描述符特权级
R=0,代码段不可读即只执行
R=1,代码段可读
系统段描述符:
格式与段描述符基本相同,主要差别 ①访问权限字节
01234567
P DPL S TYPE
S=0,系统段描述符
TYPE为 4个字节,共有 16种类型。其中:
2,LDT
9,TSS,非忙
B,TSS,忙
5,任务门
C,调用门
E,中断门
F,陷阱门
② D位无定义 (D=0)
门描述符:
偏移量:相对于段基地址的偏移量,
为目标代码的入口点选择符:用于确定段基地址字计数:从调用者堆栈中复制到被调用者堆栈中的参数个数,
参数为 32位
0
1
2
3
4
5
6
7
ò? á? 0 ~1 5
·? 0 ~1 5
·ê è¨?T ×ú
ò? á? 1 6 ~3 1
0 0 0 × êy
属于系统段描述符门提供了将程序控制转给服务程序入口的手段。有任务门,调用门,中断门、陷阱门 4种类型
门描述符:
0
1
2
3
4
5
6
7
ò? á? 0 ~1 5
·? 0 ~1 5
·ê è¨?T ×ú
ò? á? 1 6 ~3 1
0 0 0 × êy
访问权限字节格式与系统段描述符相同
DPL为任务允许访问该门的最低特权级例:判断描述符所描述的段的性质
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0
0
1
2
3
4
5
6
7
P=1,S=0,DPL=2
TYPE=2,为 DLT
因此为一个特权级为 2的 DLT,
已经在内存中该 DLT的基址为 00200000H,
界限为 00300H
G=0,段的长度为字节长度
AVL=0
该段不可被程序访问
3,描述符表描述符表由描述符顺序排列组成,占内存一定的区域,
由系统地址寄存器( GDTR,IDTR,LDTR) 指示其在物理存储器中的位置和大小描述符表有三种:
全局描述符表 GDT
中断描述符表 IDT
局部描述符表 LDT
2.4.2 保护模式的寄存器模型
0151631
015
0151631 78
AL
BL
CL
DL
AX
BX
CX
DX
AH
BH
CH
DH
E A X
E B X
E C X
E D X
IP
CS
DS
SS
ES
FS
GS
SP
BP
SI
DI
E S P
E B P
E S I
E D I
0151631 78
E I P
E F L A G S
031
01531
0151647
015
G D T R
I D T R
B A S E L I M I T
B A S E L I M I T
TR
M S WC R 0
C R 1
C R 2
C R 3
L D T R
C R 4
0151631
015
0151631 78
AL
BL
CL
DL
AX
BX
CX
DX
AH
BH
CH
DH
EAX
EBX
ECX
EDX
IP
CS
DS
SS
ES
FS
GS
SP
BP
SI
DI
ESP
EBP
ESI
EDI
FLAGS
CR0
实模式的寄存器模型
1,全局描述符表寄存器 GDTR
在物理存储器地址空间中定义全局描述符表 GDT
0151647
GDTR BASE LIMIT
BASE指示 GDT在物理存储器中开始的位置
LIMIT规定 GDT的界限
LIMIT有 16位,从而 GDT最大 65536个字节,
能够容纳 65536/8=8192个描述符例,(GDTR)=001000000FFFH,求 GDT在物理存储器中的起始地址,结束地址,表的大小,表中可以存放多少个描述符?
1,全局描述符表寄存器 GDTR
解,GDT的起始地址为 00100000H
结束地址为
00100000H+0FFFH=00100FFFH
表的大小为
0FFFH+1=4096字节表中可以存放
4096/8=512个描述符
2,中断描述符表寄存器 IDTR
在物理存储器地址空间中定义中断描述符表 IDT
0151647
IDTR BASE LIMIT
由于 Pentium只能支持 256个中断和异常,因此
LIMIT最大为 0FFFH
IDT中的描述符类型为中断门
3,局部描述符表寄存器 LDTR
LDT定义任务用到的局部存储器地址空间
16位的 LDTR并不直接定义 LDT,它只是一个指向
GDT中 LDT描述符的选择符。
如果 LDTR中装入了选择符,相应的描述符将从 GDT
中读出并装入局部描述符表高速缓冲寄存器。将该描述符装入高速缓冲寄存器就为当前任务创建了一个
LDT
GDTR
GDT
BASE LIMIT
LTD描述符
LDTR
LDT
基址 界限
32位 16位
LDT描述符高速缓冲寄存器(不可见)
4,控制寄存器
4,控制寄存器
CR0的低 5位组成机器状态字( MSW):
PE,0—— 实模式; 1—— 保护模式
MP,1(系统有数学协处理器 )
EM,0
TS,任务切换,切换任务时自动设置
ET,1(协处理器的类型 )
存储器分页机制:
CR0中的 PG位设置为 1,表示允许分页
CR3包含页目录基址,指向页目录的开头如果发生缺页,则将发生缺页的地址保存在 CR2中
4,控制寄存器
5,任务寄存器 TR
存放 16位的选择符,指示全局描述符表中任务状态段
( TSS)描述符的位置当选择符装入 TR时,相应的 TSS描述符自动从存储器中读出并装入任务描述符缓冲寄存器。该描述符定义了一个称为 任务状态段( TSS)的存储块。每个任务都有 TSS,TSS包含启动任务所必需的信息。
TSS最大 64K字节
GDTR
GDT
BASE LIMIT
TSS描述符
TR
基址 界限
32位 16位
TSSTSS描述符高速缓冲寄存器(不可见)
6,段选择符寄存器保护模式下 CS,DS,SS,ES,FS,GS寄存器称为段选择符寄存器,其值不再是基址而是选择符,它选择一个定义存储器段大小和属性的描述符
012315
TI RPL索引RPL,申请特权级 0~3
TI,表指示符
0—— 使用全局描述符表
1—— 使用局部描述符表索引:选择描述符表入口
6,段选择符寄存器例:设 LDT的基址为 00120000H,GDT的基址为 00100000H,(CS)=1007H,那么:
①请求的特权级是多少
②段描述符位于 GDT中还是 LDT中
③段描述符的地址是什么解,(CS)=1007H=0001 0000 0000 0111B
① RPL=3,申请的特权级为 3
② TI=1,描述符位于 LDT中
③描述符相对于 LDT基址的偏移量为
0001000000000B?8=512?8=4096=1000H
段描述符的地址为
00120000H+1000H=00121000H
7,标志寄存器 EFLAGS
IOPL,输入 /输出特权级
VM,虚拟 8086模式标志
2.4.3 保护模式下存储器寻址实模式存储器寻址
2.4.3 保护模式下存储器寻址保护模式的存储器管理单元使用 48位存储器指针:
16位选择符,32位偏移量选择符放在段选择符寄存器中偏移量放在其他用户可访问的 32位寄存器中偏移量 32位,因此段的大小可以达到 4G字节
48位存储器指针称为虚拟地址(逻辑地址)
16位选择符中有 14位用于存储器段选择,虚拟空间中可容纳 16384个段,每段最大 4GB,因而虚拟地址空间最大 64TB
1,虚拟地址空间的分段在分段模型中,64TB虚拟地址空间被分为 32TB的全局存储器地址空间和 32TB局部存储器地址空间全局段 0
全局段 8192
局部段 0
局部段 8192
虚拟地址空间
64TB
局部地址空间
32TB
全局地址空间
32TB
2,段式地址转换虚拟地址指针
GDT/LDT
选择符 偏移量段 描述符数据段描述符高速缓冲寄存器(不可见) 数据段操作数
DS EAX
2,段式地址转换
CS
DS
SS
ES
FS
GS
程序员可见访问权限访问权限基址界限
01920515263
段描述符高速缓冲寄存器(不可见)
2,段式地址转换例:假设虚拟地址为 0100:00000200H,禁止分页。如果描述符中读出的段基址为 00030000H,那么操作数的物理地址是什么?
解:
将此虚拟地址转换成物理地址为基地址 +偏移量
=00030000H+00002000H
=00032000H
3,分页机制分段法:将程序分成可变长的若干段分页法:将程序分成若干相同大小的页,每页长 4KB
如果不允许分页,那么分段机构确定的 32位线性地址即为物理地址;如果允许分页,就要将 32位线性地址通过两级表格结构转换成物理地址,第一级是页目录,第二级是页表
3,分页机制页目录长 4KB,包含最多 1024个页目录项,每个页目录项 4字节
7 6 5 4 3 2 1 0
0 0 A 0 0 U/S R/W P
页表地址 0~3 位 OS 专用 0
页表地址 4~11位页表地址 12~19位
0
1
2
3
3,分页机制页表的起始地址是 4K的整数倍,因此 32位地址的低 12
位总为 0,用高 20位表示即可
7 6 5 4 3 2 1 0
0 0 A 0 0 U / S R/ W P
ò3 ±í μ· 0 ~3 OS רó? 0
ò3 ±í μ· 4 ~1 1
ò3 ±í μ· 1 2 ~1 9
U/S R/W 特权级 3 特权级 0~2
0 0 无 读 /写
0 1 无 读 /写
1 0 只读 读 /写
1 1 读 /写 读 /写
3,分页机制页表长 4KB,包含最多 1024个页面项,每项 4字节
7 6 5 4 3 2 1 0
0 D A 0 0 U/S R/W P
页面地址 0~3 位 OS 专用 0
页面地址 4~11位页面地址 12~19位
0
1
2
3
页面的起始地址为 4K的整数倍,所以 32位页面地址只用高 20位
D位:对所涉及页面进行写操作时,D置 1
3,分页机制整个存储器有一个页目录,它最多有 1024个页目录项,
每个页目录项可含有 1024个页面项
—— 共有 1024?1024=1M个页面,每页面 4KB,存储器大小正好 4GB
目录 页 偏移量
31 22 21 12 11 0
线性地址格式
3,分页机制线性地址页目录目录 偏移量页目录项页面操作数页
CR3
页表页表项
3,分页机制
TLB—— 转换后援缓冲器
TLB为一个 Cache,其中保存了 32个最近使用的页转换地址。若访问同样的存储区域,则不必再访问页目录和页表,可以加快程序的运行。
例:对于线性地址 00000000H~00000FFFH,将选中页目录项 0和页表项 0。若页表项 0包含的地址为
00100000H,则线性地址 00000000H~00000FFFH对应的物理地址为 00100000H~00100FFFH
2.4.4 虚拟 8086模式保护模式的子模式在保护模式下,只要将 EFLAGS寄存器的 VM位置 1,
处理器便进入 V86模式。将 VM位清 0,处理器便又退回保护模式当处理器处于 V86模式时,段寄存器的使用与实模式相同。
通过分页操作,V86的 1MB地址空间可以转换到
Pentium的 4GB空间的任何地方
4.6 Win32汇编语言程序设计一,Win32汇编语言程序的结构二,Win32 API的调用一,Win32汇编语言程序的结构
.386
.MODEL FLAT,STDCALL
.DATA
...initialized data
.DATA?
...uninitialized data
.CONST
...constants
.CODE
<label>
...code
END <label>
设置汇编程序使用的指令集设置汇编程序使用的内存模式和参数传递规则
.DATA
.DATA?
.CONST
.CODE
....,
.DATA 包含已初始化的数据
.DATA? 包含未初始化的数据
.CONST 包含常数声明
.CODE 包含程序代码
<label>
END <label>
程序代码一,Win32汇编语言程序的结构(续 1)
C(cdecl)调用规则和 PASCAL调用规则
foo(int first_param,int second_param,int third_param)
采用 cdecl调用规则的汇编代码为
push [third_param] ; 第三个参数压栈
push [second_param] ; 第二个参数压栈
push [first_param] ; 第一个参数压栈
call foo
add sp,12 ; 主调函数对堆栈进行平衡
PASCAL调用规则与 C调用规则正相反
C调用规则从右向左传递参数,主调函数负责清栈一,Win32汇编语言程序的结构(续 2)
STDCALLl调用规则从右向左传递参数,被调函数负责对堆栈进行平衡
变长参数问题
int wsprintf( LPTSTR lpOut,LPCTSTR lpFmt,...)
必须采用 cdecl调用规则二,Win32 API的调用
Win32 API
API=Application Programming Interface
应用程序编程接口
Win32 API相当于 DOS系统功能
kernel32.dll 包含处理内存和进程管理的 API函数
user32.dll 主要用来控制用户界面
gdi32.dll 主要负责图形操作二,Win32 API的调用(续 1)
API函数的定义
int MessageBox(
HWND hWnd,// handle of owner window
LPCTSTR lpText,// address of text in message box
LPCTSTR lpCaption,// address of title of message box
UINT uType // style of message box
);
Microsoft Win32应用程序接口 参考手册 (上、下 ),清华大学出版社
MSDN Library ---Microsoft Visual Studio
二,Win32 API的调用(续 2)
API函数的调用
push mb_ok ;PUSH value for uType
push lpCaption ;PUSH Pointer to Caption
push lpText ;PUSH Pointer to Text
push hWnd ;PUSH Masterhandle
call MessageBoxA ;CALL MessageBoxA
1,常规方法调用 Win32 API函数时,函数名必须区分大小写,
将 MessageBoxA写成 messageboxa是错误的。
API函数的调用二,Win32 API的调用(续 3)
2,PROTO与 INVOKE伪指令 (MASM6.x)
MessageBoxA PROTO hWnd:DWORD,lpText:DWORD,
lpCaption:DWORD,uType:DWORD
位置在程序的开始处,或在包含文件中,用 INCLUDE伪指令包含到当前文件中
INVOKE MessageBoxA,NULL,lpMsgBoxText,
lpMsgBoxCaption,MB_OK
API函数的返回值二,Win32 API的调用(续 4)
函数调用后的返回值保存在 EAX寄存器中
涉及字符串的 API函数
MessageBoxA ANSI(8位 ) Windows 9x
MessageBoxW Unicode(16位 ) Windows NT
二,Win32 API的调用(续 5)
示例; set options for the assembler
.386
.model flat,stdcall; declaration of all used API-functions
ExitProcess PROTO,DWORD
MessageBoxA PROTO,DWORD,:DWORD,:DWORD,:DWORD; here begins our,data section
.data
Text db "Hello,World!",0 ;Text,terminated with "0"
Caption db "Hello",0 ;Caption string,0-terminated; here begins our,const section
.const
NULL equ 0
MB_OK equ 0; here we start with our code
.code
Start,
INVOKE MessageBoxA,NULL,ADDR Text,ADDR Caption,MB_OK
INVOKE ExitProcess,NULL
end Start
二,Win32 API的调用(续 6)
二,Win32 API的调用(续 7)
汇编与连接
ml /c /coff /Cp hello.asm
/c指示 MASM只进行汇编,不调用连接程序;
/coff 指示 MASM以 COFF 格式创建,obj文件;
/Cp指示 MASM保持用户标识符的大小写。
link32 /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm611\lib
hello.obj kernel32.lib user32.lib
/SUBSYSTEM:WINDOWS通知 Link可执行文件是 Windows应用程序;
/LIBPATH:c:\masm611\lib指示导入库的路径。
D:\masmwin32> ml /c /coff /Cp hello.asm
Microsoft (R) Macro Assembler Version 6.13.7299
Copyright (C) Microsoft Corp 1981-1997,All rights reserved.
Assembling,hello.asm
D:\masmwin32> link32 /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm611\lib hello.obj kernel32.lib
user32.lib
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998,All rights reserved.
D:\masmwin32> hello
二,Win32 API的调用(续 8)
D:\masmwin32>
二,Win32 API的调用(续 9)
包含文件可以将常用的函数原型定义存放在一个文件中,
在编写程序时用 INCLUDE语句将其包含进来。
我们可以直接使用现成的包含文件,其中最常用的是 user32.inc,kernel32.inc,gdi32.inc和
windows.inc,
利用包含文件,可以使汇编程序的源代码得到简化。
二,Win32 API的调用(续 10)
.386
.model flat,stdcall
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
.data
Text db "Hello,World!",0 ;Text,terminated with "0"
Caption db "Hello",0 ;Caption string,0-terminated
.code
Start,
INVOKE MessageBoxA,NULL,ADDR Text,ADDR Caption,MB_OK
INVOKE ExitProcess,NULL
end Start
1,判断下面描述符所描述的段的性质
0
1
2
3
4
5
6
7
0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0
1 0 1 1 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1
1 1 1 1 1 1 1 1
作业
2,如果 (GDTR)=0021000001FFH,那么 GDT的起始地址和终止地址是什么?表长多少?表中能存放多少个描述符?
3,如果允许分页,那么 Pentium微处理器的地址空间可以分成多少页?
4,若将线性地址 00200000H送给分页机制,那么将访问哪个页目录项,
哪个页表项?
5,试述 TLB的作用上机作业 (选做 )
1.用汇编语言编程显示如下消息框。
2.在上题显示的消息框中,如果用户按下“重试”按钮,则再次显示同样的消息框,直到用户按下“取消”按钮退出。