汇编语言程序设计第二章
Intel 80x86系列微处理器提纲
2.1 Intel CPU的发展
2.2 PC机操作系统的发展
2.3 16位 CPU及 DOS基础
2.4 32位 CPU及 Windows基础
2.1 Intel CPU的发展
4位 CPU,4004
45条指令
执行速度为 50kIPS
8位 CPU,8008,8080
执行速度达到 500KIPS
寻址范围达到 64KB
16位 CPU,8086,8088,80286
16位 CPU,
能够进行 16位数据的运算和处理
寻址范围达到 1MB
32位 CPU,80386,80486
准 64位 CPU,Pentium,PⅡ,P Ⅲ,P4
64位 CPU,Itanium
2.2 PC机操作系统的发展
PC机操作系统主要有以下系列:
2.2.1 MS-DOS
2.2.2 桌面 Windows系统
2.2.3 Windows NT系列
2.2.4 Linux
2.3 16位 CPU及 DOS基础
8086/8088 CPU按功能可分成两大部分:
总线接口单元 BIU( Bus Interface Unit)
执行单元 EU( Execution Unit)
8086一次可存取 2字节,比 8088的性能要高
8088微处理器的内部结构如图所示。 (下页 )
内存接口 C- BUS
AH AL
BH BL
CH CL
DH DL
SP
BP
SI
DI
ES
CS
SS
DS
IP
总线接口单元执行单元指令执行队列执行单元控制系统
A-BUS
算术 /
逻辑单元标志寄存器标志寄存器
2.3.1 执行单元
执行单元主要包括
标志寄存器 Flags、
算术逻辑单元 ALU、
通用寄存器 。
执行单元主要实现两种操作:
一是根据指令进行算术逻辑等运算
二是给出程序要访问的内存单元地址,交给总线接口单元
2.3.2 总线接口单元
负责 CPU与存储器和外设之间的信息传送
由地址加法器,段寄存器 ( CS,DS,ES,SS),
指令指针 IP,指令队列和总线控制逻辑组成 。
在执行单元执行指令的过程中,总线接口单元负责从内存指定部分取出指令送至指令队列中排队 。
在执行指令时,所需要的内存操作数也是由总线接口单元从内存的指定区域取出传送给执行单元 。
总线接口单元中指示器 IP的作用及用法
保存着下一次将要从内存中取出的指令的偏移地址
根据 IP的内容 ( 16位 ) 和段寄存器 CS的内容 ( 16位 )
形成指令的物理地址 ( 20位 )
根据该地址从主存中取出指令,送入指令队列中排队
指令执行完毕后 IP增加,指向下一条要执行的指令 。
2.3.3 寄存器
GS
CS
SS
DS
ES
FS
代码段寄存器堆栈段寄存器数据段寄存器附加段寄存器段寄存器
1615
CH CL
(AH) AX (AL)EAX
EBX
(CH) CX (CL)ECX
(DH) DX (DL)EDX
位 08731
AH AL SPESP
AH AL BPEBP
AH AL SIESI
DIEDI
IPEIP
(BH) BX (BL)
FLAGS
数据寄存器堆栈指针基址指针源变址目的变址指令指针标志指针寄存器变址寄存器控制寄存器通用寄存器
FLAGS
1.段寄存器( CS,DS,ES,SS)
段寄存器用来确定该段在内存中的起始地址 。 包括:
代码段寄存器 CS
数据段寄存器 DS
堆栈段寄存器 SS
附加数据段寄存器 ES
2.指令指针 IP
指令指针 IP总是保存下一次将要执行的指令的偏移地址,偏移地址指的是这条指令在代码段中的位置。
在程序运行时,IP的内容由 CPU自动调整 。
3.堆栈指针 SP
堆栈指针寄存器 SP用于存放当前堆栈段中栈顶的偏移地址 。
4.数据寄存器 AX,BX,CX,DX
数据寄存器通常用来保存操作数或运算结果等信息,也有如下专门用途 。
AX寄存器称为累加器,它的使用频度最高,用于算术,逻辑运算以及与外设传送信息等 。
BX寄存器称为基址寄存器,可用于存放存储器地址 。
CX寄存器称为计数器,可作为循环或串操作等指令中的隐含计数器 。
DX寄存器称为数据寄存器,可用来存放双字数据的高 16位,或存放外设端口地址 。
AX,BX,CX,DX都是 16位的寄存器,每一个又可以分为高 8位和低 8位来使用 。
例如,AX的值为 0E9FH,那么,AH=0EH,AL=9FH 。
15 8 7 0
AX AH AL
BX BH BL
CX CH CL
DX DH DL
5.基址寄存器 BP
基址寄存器
可用来保存操作数或运算结果等信息
也用于存放某一存储单元的偏移地址,此时多用于对堆栈段中数据的非顺序存取
BX寄存器也是基址寄存器 。
6.变址寄存器 SI,DI
SI是源变址寄存器,DI是目标变址寄存器
可用来保存操作数或运算结果等信息
也用于存放某一存储单元的偏移地址
在数据块操作中,SI和 DI分别指向源地址和目标地址。
7.标志寄存器 Flags
包含 9个标志位,表示 CPU所处状态信息及运算结果的特征,
在执行指令的过程中,根据指令执行的结果自动改变这些标志位,
在程序中可以取出这些标志位
标志寄存器如下图
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Flags OF DF IF TF SF ZF AF PF CF
标志寄存器
辅助进位标志 AF:
在字操作时若低位字节向高位字节有进位或借位时,
则 AF= 1,否则 AF= 0。
进位标志 CF:
当结果的最高位产生一个进位或借位时,CF= 1,
否则 CF= 0。
在移位或循环移位指令中,会把操作数的最高位
(左移时)或最低位(右移时)移入 CF中。
标志寄存器
溢出标志 OF:
有符号数运算时,当其运算结果超出了 8位或 16位有符号数所能表达的范围时,将产生溢出,置 OF为
1,否则置 OF= 0。
符号标志 SF:
它与运算结果的最高位相同。
奇偶标志 PF:
当执行结果的低 8位中 1的个数为奇数时,PF为 0;
否则为 1。
标志寄存器
零标志,
当运算结果为零时,ZF为 1;否则为 0。
方向标志 DF:
在字符串操作指令中,当 DF=0时,串操作为自动增址;当 DF=1时,串操作为自动减址。
标志寄存器
中断允许标志,
当 IF=1时,允许 CPU接收外部中断请求,此时为
,开中断,状态。
当 IF=0时,则屏蔽外部中断请求,此时为,关中断,
状态。
单步标志 TF:
当 TF=1时,CPU进入单步方式,在每条指令执行以后产生一个内部中断(单步中断)。
当 TF=0时,CPU执行指令后不产生单步中断。
2.3.4 存储器的分段
CPU在确定一个内存单元的地址时,用逻辑地址来描述
逻辑地址分为两部分:段首址和偏移,
逻辑地址的格式表示为:段首址,偏移由逻辑地址,段首址,偏移,转换为物理地址的公式为物理地址? 段首址? 16? 偏移? 段基址? 偏移如,求出 317FH:2B83H的物理地址的过程为:
段首址? 317FH
偏移? 2B83H
段基址? 317FH? 16? 317FH? 10H? 317F0H
物理地址? 段基址?偏移?317F0H? 2B83H? 34373H
2.3.5 DOS的内存布局
DOS操作系统运行于实模式中,CPU在实模式下的寻址范围只有 1MB。
系统硬件使用的内存位于地址区域的高端,范围从 A0000H~ FFFFFH,共 384 KB,其中有用于显示的视频缓冲区和 BIOS程序空间。
DOS系统和程序使用 16位,段首址,偏移,的格式,只能使用 00000H~ 9FFFFH共 640 KB,这就是有名的,640 KB”限制。
突破限制的方法
一种技术是使用高端内存区 HMA,它利用了
80286以上 CPU的 A20地址线。
第二种方法师利用 UMB/EMS/XMS技术,能够使程序使用到更多的物理内存。
1.UMB使用的映射是固定的
2,EMS将高于 1MB的各个 16KB内存块进行编号,
程序可以设置一个号码,把对应的内存块映射到地址上。如果想使用另外一个 16KB内存块,
则设置一个新的号码。
突破限制的方法(续)
UMB/EMS技术只能在 80386及以上的 CPU才能实现。
3.XMS技术能够在 80286及以上的 CPU中实现。
它的原理是在 640KB内存中开辟一个缓冲区,
再调用 XMS功能将缓冲区中的内容传送到高于
1MB的内存中去,也可以将高于 1MB的内存传送到缓冲区中。
2.3.6 I/O地址空间
CPU需要和外部设备之间执行输入 /输出操作。
每个外部设备的接口中都有一组寄存器,用来存放要和 CPU相交换的数据、状态和命令信息。
每个寄存器都有一个端口地址,由这些端口地址组成了 I/O地址空间。
I/O地址空间为 64KB,寻址范围为 0000H~
FFFFH。
2.4 32位 CPU及 Windows基础
2.4.1 三种工作模式
2.4.2 寄存器
2.4.3 Windows应用程序的内存布局
2.4.4 Windows的保护机制
2.4.1 三种工作模式
80386处理器有三种工作模式:实模式、保护模式和虚拟 86模式。
<1> 实模式
CPU复位或加电的时候以实模式启动,处理器以实模式工作。
所有的段都是可以读、写和可执行的
没有特权级的概念,所有的指令都工作在最高的特权级。
不支持硬件上的多任务切换,所有的指令都在同一个环境下执行。
<2>保护模式
在保护模式下的时候,80386提供了多任务、
内存分段分页管理和特权级保护等功能。
段的大小可以设置为 4GB,段内的偏移量为 32位。
在编程时不必考虑内存的分段问题。
特权级保护,将应用程序和操作系统隔离起来。
支持虚拟内存。
支持多任务。
<3>虚拟 86模式
以任务形式在保护模式下执行的;
在虚拟 86模式下,80386支持任务切换和内存分页。
在 Windows操作系统中,有一部分程序专门用来管理虚拟 86模式的任务,称为虚拟 86管理程序。它既提供了一个环境,允许 DOS及其程序在保护模式下运行,又对 DOS及其程序的行为进行限制。
2.4.2 寄存器
32位 CPU支持的寄存器有以下几种:
1,通用 32位寄存器
2,标志寄存器
3,EIP和 ESP
4,CS,DS,ES,SS,FS,GS
1.通用 32位寄存器
CPU中有 8个 32位寄存器。它们主要用于算术运算、逻辑运算以及对内存操作数的寻址。
32 16 15 0
EAX AX
EBX BX
ECX CX
EDX DX
ESI SI
EDI DI
EBP BP
ESP SP
2.标志寄存器标志寄存器 EFLAGS也扩展为 32位 。
31~19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
EFLAGS 00..00 VM RF NT IOPL OF DF IF TF SF ZF AF PF CF
86模式位 VM:
此位为 1时,表示当前 CPU正工作在 V86模式下 。
此位为 0,表示当前 CPU工作在实模式或保护模式下 。
嵌套任务位 NT:
若当前的任务嵌套在其他任务中,此位为 1,否则为 0。
恢复位 RF:与程序调试有关的一个控制位 。
I/O域 IOPL,IOPL占 2位,取值为 0,1,2,3。
它规定了那些特权级的程序可以执行 I/O指令 。
3.指令指针寄存器 EIP和堆栈指针寄存器 ESP
指令指针寄存器总是保存下一次将要执行的指令的偏移地址,偏移地址指这条指令在代码段中的位置 。
堆栈指针寄存器 ESP用于存放当前堆栈段中栈顶的偏移地址 。
EIP和 ESP都 32位寄存器,它们的低 16位分别是 IP和 SP。
31 16 15 0
EIP IP
ESP SP
4.段寄存器 CS,DS,ES,SS,FS,GS
32位 CPU有 6个段寄存器,分别为 CS,DS,ES,SS,FS,
GS,比 16位 CPU增加了 FS,GS两个段寄存器。这些段寄存器也是 16位的,在实模式下,它们的用法和 16位 CPU
相同。
在实模式和 V86模式下,段寄存器的内容是 20位段基址的高 16位。
在保护模式下,段寄存器中的内容是一个选择符,用于在段描述符表中选择段描述符的选择符。
2.4.3 Windows应用程序的内存布局
1.虚拟内存
2.,平坦,内存模式
3.段寄存器
4.内存布局
1.虚拟内存
Windows系统一般在硬盘上建立一个交换文件用做虚拟内存 。
在读写这个内存地址时,CPU要通知操作系统将交换文件的内容读入物理内存 。
如果内存紧张,操作系统还可以将物理内存的内容写到交换文件中,以后程序在访问这个地址时,要从交换文件中读入 。
2.,平坦,内存模式程序员在编程时可以使用的内存空间最大是
4GB,而不必考虑内存的分段问题。
3.段寄存器
在 Windows系统中,段寄存器仍然是 16位的。
他们内容就不再像实模式那样存放段首址的内容,而是存放选择符。
选择符指向一个 64位的描述符,在描述符中规定了段的基地址、长度、类型、特权级等信息。
例如,在一个程序的运行过程中,各个段寄存器和其他寄存器的值为:
3.段寄存器(续)
CS:EIP=001B:3017FFD2 SS:ESP=0023:0012F16C
EAX=00000002 EBX=00E903C8 ECX=00E903C8 EDX=00000DE4
ESI=0012F736 EDI=00000DE4 EBP=0012F180 EFL=00000202
DS=0023 ES=0023 FS=003B GS=0000
再观察各个段的基地址和长度信息:
:gdt 001B
Sel,Type Base Limit DPL Attributes
001B Code32 00000000 FFFFFFFF 3 P RE
:gdt 0023
Sel,Type Base Limit DPL Attributes
0023 Data32 00000000 FFFFFFFF 3 P RW
3.段寄存器(续)
程序中,CS=001BH,001BH是一个索引。以这个索引为依据到 GDT表中去找这个段的描述符,再从描述符中获得它的基地址为 00000000H,长度为 FFFFFFFFH。 这个段的属性为 RE,可读,但不可写。
DS=ES=SS=0023H,数据段和堆栈段是同一个段。数据段的属性为 RW,可读可写,但不可执行。
代码段和数据 /堆栈段的空间是统一的,都是
00000000H~ FFFFFFFFH。
在这个地址空间中,一部分用来存放程序,一部分作为数据区,还有一部分作为堆栈来使用,且不重复。
4.内存布局
Windows系统将 4GB内存地址空间分为两个部分:
用户地址空间和系统地址空间,这两个部分各占 2GB。
对于每一个任务,它的用户地址空间是独有的。
而所有的任务共享系统地址空间,操作系统内核及各种设备的驱动程序都放在系统地址空间中。
举例说明各个任务的独立地址空间程序清单,task1.c( 任务独立地址空间 )
结果,main=0x00401005
&random=0x0042ADB0,random=0
&random=0x0042ADB0,random=27443
程序清单,task2.c( 任务独立地址空间)
结果,main=0x00401005
&ticks=0x00428C3C,ticks=0
&ticks=0x00428C3C,ticks=11553031
举例说明各个任务的独立地址空间(续)
执行下面的命令可以编译 task1.c,task2.c,生成
task1.exe,task2.exe文件 。
cl task1.c
cl task2.c
task1.c程序中设置了一个 random全局变量,用于存放获得的随机数,每次运行时这个数字是不同的 。
task2.c程序中设置了一个 ticks全局变量,用于存放
Windows启动后已运行的毫秒数,这个数字是不断变化的 。
举例说明各个任务的独立地址空间(续在,开始 → 运行,中 输 入 运 行 c:\asm\task1.exe 和
c:\asm\task2.exe各两次,一共产生了 4个任务 。 自己验证 。
对 task1.exe的两个任务来说,逻辑地址 00408A10H表示的内存单元在两个任务中的值并不相同 。 这就意味着在 Windows系统中,每个任务都有它自己独立的逻辑地址空间 。 对 task2.exe的两个任务来说,逻辑地址 004068F0H表示的内存单元在两个任务中的值也不相同,它们被映射到不同的物理内存单元上 。
从 task1.exe和 task2.exe的运行结果中可以看到,main函数的地址都是 00401000H。 而这两个 main函数中的代码内容肯定是不同的,
但它们的逻辑地址是相同的。
2.4.4 Windows的保护机制
80386设置了 4个特权级,编号为 0~ 3。最高的是特权级 0,其次是 1,2,3。 Windows只使用了特权级 0和特权级 3。
特权级 0中运行的是操作系统内核和各种硬件驱动程序;
特权级 3中运行的是各种应用程序。
CS段寄存器的最低 2位表示当前运行程序的特权级。
操作系统内核使用特权级 0,CS设置为 0008H;
应用程序使用特权级 3,CS设置为 0023H。
Windows采用保护机制主要为了检查和防止应用程序的越权操作,保护机制主要由下列几方面组成:
( 1)段的类型检查
( 2)页的类型检查
( 3)段的特权级
( 4)控制转移的检查。
( 5)对 I/O地址的保护
( 6)对系统资源的保护
1 段的类型检查
段的类型是由段描述符指定的
主要属性有是否可执行、是否可读和是否可写等
2 页的类型检查
特权级 0的程序可以读写所有的内存,而特权级 3的程序不能使用属于操作系统的内存空间
( 系统地址空间 ) 。
3 段的特权级
应用程序中段寄存器的最低 2位为 112,即特权级为 3
应用程序不能给段寄存器赋值为特权级 0,即最低 2位只能为 112
4 控制转移的检查
特权级 3上的程序不能直接调用特权级 0中的子程序,而只能利用 80386的调用门,中断门等手段调用指定地址的子程序
通过调用门,中断门时,80386会判断应用程序是否有足够的权限
在子程序的入口处,也可以判断应用程序传递过来的参数是否合法
5 对 I/O地址的保护应用程序能够访问的 I/O地址空间受到操作系统限制 。
6 对系统资源的保护
有一些指令是用来设置系统的各种寄存器和描述符表的,操作系统不允许应用程序执行这些指令
如果违反了上述保护规则,会引发保护异常,
处理器将会进入到对应的异常处理程序中去
Intel 80x86系列微处理器提纲
2.1 Intel CPU的发展
2.2 PC机操作系统的发展
2.3 16位 CPU及 DOS基础
2.4 32位 CPU及 Windows基础
2.1 Intel CPU的发展
4位 CPU,4004
45条指令
执行速度为 50kIPS
8位 CPU,8008,8080
执行速度达到 500KIPS
寻址范围达到 64KB
16位 CPU,8086,8088,80286
16位 CPU,
能够进行 16位数据的运算和处理
寻址范围达到 1MB
32位 CPU,80386,80486
准 64位 CPU,Pentium,PⅡ,P Ⅲ,P4
64位 CPU,Itanium
2.2 PC机操作系统的发展
PC机操作系统主要有以下系列:
2.2.1 MS-DOS
2.2.2 桌面 Windows系统
2.2.3 Windows NT系列
2.2.4 Linux
2.3 16位 CPU及 DOS基础
8086/8088 CPU按功能可分成两大部分:
总线接口单元 BIU( Bus Interface Unit)
执行单元 EU( Execution Unit)
8086一次可存取 2字节,比 8088的性能要高
8088微处理器的内部结构如图所示。 (下页 )
内存接口 C- BUS
AH AL
BH BL
CH CL
DH DL
SP
BP
SI
DI
ES
CS
SS
DS
IP
总线接口单元执行单元指令执行队列执行单元控制系统
A-BUS
算术 /
逻辑单元标志寄存器标志寄存器
2.3.1 执行单元
执行单元主要包括
标志寄存器 Flags、
算术逻辑单元 ALU、
通用寄存器 。
执行单元主要实现两种操作:
一是根据指令进行算术逻辑等运算
二是给出程序要访问的内存单元地址,交给总线接口单元
2.3.2 总线接口单元
负责 CPU与存储器和外设之间的信息传送
由地址加法器,段寄存器 ( CS,DS,ES,SS),
指令指针 IP,指令队列和总线控制逻辑组成 。
在执行单元执行指令的过程中,总线接口单元负责从内存指定部分取出指令送至指令队列中排队 。
在执行指令时,所需要的内存操作数也是由总线接口单元从内存的指定区域取出传送给执行单元 。
总线接口单元中指示器 IP的作用及用法
保存着下一次将要从内存中取出的指令的偏移地址
根据 IP的内容 ( 16位 ) 和段寄存器 CS的内容 ( 16位 )
形成指令的物理地址 ( 20位 )
根据该地址从主存中取出指令,送入指令队列中排队
指令执行完毕后 IP增加,指向下一条要执行的指令 。
2.3.3 寄存器
GS
CS
SS
DS
ES
FS
代码段寄存器堆栈段寄存器数据段寄存器附加段寄存器段寄存器
1615
CH CL
(AH) AX (AL)EAX
EBX
(CH) CX (CL)ECX
(DH) DX (DL)EDX
位 08731
AH AL SPESP
AH AL BPEBP
AH AL SIESI
DIEDI
IPEIP
(BH) BX (BL)
FLAGS
数据寄存器堆栈指针基址指针源变址目的变址指令指针标志指针寄存器变址寄存器控制寄存器通用寄存器
FLAGS
1.段寄存器( CS,DS,ES,SS)
段寄存器用来确定该段在内存中的起始地址 。 包括:
代码段寄存器 CS
数据段寄存器 DS
堆栈段寄存器 SS
附加数据段寄存器 ES
2.指令指针 IP
指令指针 IP总是保存下一次将要执行的指令的偏移地址,偏移地址指的是这条指令在代码段中的位置。
在程序运行时,IP的内容由 CPU自动调整 。
3.堆栈指针 SP
堆栈指针寄存器 SP用于存放当前堆栈段中栈顶的偏移地址 。
4.数据寄存器 AX,BX,CX,DX
数据寄存器通常用来保存操作数或运算结果等信息,也有如下专门用途 。
AX寄存器称为累加器,它的使用频度最高,用于算术,逻辑运算以及与外设传送信息等 。
BX寄存器称为基址寄存器,可用于存放存储器地址 。
CX寄存器称为计数器,可作为循环或串操作等指令中的隐含计数器 。
DX寄存器称为数据寄存器,可用来存放双字数据的高 16位,或存放外设端口地址 。
AX,BX,CX,DX都是 16位的寄存器,每一个又可以分为高 8位和低 8位来使用 。
例如,AX的值为 0E9FH,那么,AH=0EH,AL=9FH 。
15 8 7 0
AX AH AL
BX BH BL
CX CH CL
DX DH DL
5.基址寄存器 BP
基址寄存器
可用来保存操作数或运算结果等信息
也用于存放某一存储单元的偏移地址,此时多用于对堆栈段中数据的非顺序存取
BX寄存器也是基址寄存器 。
6.变址寄存器 SI,DI
SI是源变址寄存器,DI是目标变址寄存器
可用来保存操作数或运算结果等信息
也用于存放某一存储单元的偏移地址
在数据块操作中,SI和 DI分别指向源地址和目标地址。
7.标志寄存器 Flags
包含 9个标志位,表示 CPU所处状态信息及运算结果的特征,
在执行指令的过程中,根据指令执行的结果自动改变这些标志位,
在程序中可以取出这些标志位
标志寄存器如下图
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Flags OF DF IF TF SF ZF AF PF CF
标志寄存器
辅助进位标志 AF:
在字操作时若低位字节向高位字节有进位或借位时,
则 AF= 1,否则 AF= 0。
进位标志 CF:
当结果的最高位产生一个进位或借位时,CF= 1,
否则 CF= 0。
在移位或循环移位指令中,会把操作数的最高位
(左移时)或最低位(右移时)移入 CF中。
标志寄存器
溢出标志 OF:
有符号数运算时,当其运算结果超出了 8位或 16位有符号数所能表达的范围时,将产生溢出,置 OF为
1,否则置 OF= 0。
符号标志 SF:
它与运算结果的最高位相同。
奇偶标志 PF:
当执行结果的低 8位中 1的个数为奇数时,PF为 0;
否则为 1。
标志寄存器
零标志,
当运算结果为零时,ZF为 1;否则为 0。
方向标志 DF:
在字符串操作指令中,当 DF=0时,串操作为自动增址;当 DF=1时,串操作为自动减址。
标志寄存器
中断允许标志,
当 IF=1时,允许 CPU接收外部中断请求,此时为
,开中断,状态。
当 IF=0时,则屏蔽外部中断请求,此时为,关中断,
状态。
单步标志 TF:
当 TF=1时,CPU进入单步方式,在每条指令执行以后产生一个内部中断(单步中断)。
当 TF=0时,CPU执行指令后不产生单步中断。
2.3.4 存储器的分段
CPU在确定一个内存单元的地址时,用逻辑地址来描述
逻辑地址分为两部分:段首址和偏移,
逻辑地址的格式表示为:段首址,偏移由逻辑地址,段首址,偏移,转换为物理地址的公式为物理地址? 段首址? 16? 偏移? 段基址? 偏移如,求出 317FH:2B83H的物理地址的过程为:
段首址? 317FH
偏移? 2B83H
段基址? 317FH? 16? 317FH? 10H? 317F0H
物理地址? 段基址?偏移?317F0H? 2B83H? 34373H
2.3.5 DOS的内存布局
DOS操作系统运行于实模式中,CPU在实模式下的寻址范围只有 1MB。
系统硬件使用的内存位于地址区域的高端,范围从 A0000H~ FFFFFH,共 384 KB,其中有用于显示的视频缓冲区和 BIOS程序空间。
DOS系统和程序使用 16位,段首址,偏移,的格式,只能使用 00000H~ 9FFFFH共 640 KB,这就是有名的,640 KB”限制。
突破限制的方法
一种技术是使用高端内存区 HMA,它利用了
80286以上 CPU的 A20地址线。
第二种方法师利用 UMB/EMS/XMS技术,能够使程序使用到更多的物理内存。
1.UMB使用的映射是固定的
2,EMS将高于 1MB的各个 16KB内存块进行编号,
程序可以设置一个号码,把对应的内存块映射到地址上。如果想使用另外一个 16KB内存块,
则设置一个新的号码。
突破限制的方法(续)
UMB/EMS技术只能在 80386及以上的 CPU才能实现。
3.XMS技术能够在 80286及以上的 CPU中实现。
它的原理是在 640KB内存中开辟一个缓冲区,
再调用 XMS功能将缓冲区中的内容传送到高于
1MB的内存中去,也可以将高于 1MB的内存传送到缓冲区中。
2.3.6 I/O地址空间
CPU需要和外部设备之间执行输入 /输出操作。
每个外部设备的接口中都有一组寄存器,用来存放要和 CPU相交换的数据、状态和命令信息。
每个寄存器都有一个端口地址,由这些端口地址组成了 I/O地址空间。
I/O地址空间为 64KB,寻址范围为 0000H~
FFFFH。
2.4 32位 CPU及 Windows基础
2.4.1 三种工作模式
2.4.2 寄存器
2.4.3 Windows应用程序的内存布局
2.4.4 Windows的保护机制
2.4.1 三种工作模式
80386处理器有三种工作模式:实模式、保护模式和虚拟 86模式。
<1> 实模式
CPU复位或加电的时候以实模式启动,处理器以实模式工作。
所有的段都是可以读、写和可执行的
没有特权级的概念,所有的指令都工作在最高的特权级。
不支持硬件上的多任务切换,所有的指令都在同一个环境下执行。
<2>保护模式
在保护模式下的时候,80386提供了多任务、
内存分段分页管理和特权级保护等功能。
段的大小可以设置为 4GB,段内的偏移量为 32位。
在编程时不必考虑内存的分段问题。
特权级保护,将应用程序和操作系统隔离起来。
支持虚拟内存。
支持多任务。
<3>虚拟 86模式
以任务形式在保护模式下执行的;
在虚拟 86模式下,80386支持任务切换和内存分页。
在 Windows操作系统中,有一部分程序专门用来管理虚拟 86模式的任务,称为虚拟 86管理程序。它既提供了一个环境,允许 DOS及其程序在保护模式下运行,又对 DOS及其程序的行为进行限制。
2.4.2 寄存器
32位 CPU支持的寄存器有以下几种:
1,通用 32位寄存器
2,标志寄存器
3,EIP和 ESP
4,CS,DS,ES,SS,FS,GS
1.通用 32位寄存器
CPU中有 8个 32位寄存器。它们主要用于算术运算、逻辑运算以及对内存操作数的寻址。
32 16 15 0
EAX AX
EBX BX
ECX CX
EDX DX
ESI SI
EDI DI
EBP BP
ESP SP
2.标志寄存器标志寄存器 EFLAGS也扩展为 32位 。
31~19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
EFLAGS 00..00 VM RF NT IOPL OF DF IF TF SF ZF AF PF CF
86模式位 VM:
此位为 1时,表示当前 CPU正工作在 V86模式下 。
此位为 0,表示当前 CPU工作在实模式或保护模式下 。
嵌套任务位 NT:
若当前的任务嵌套在其他任务中,此位为 1,否则为 0。
恢复位 RF:与程序调试有关的一个控制位 。
I/O域 IOPL,IOPL占 2位,取值为 0,1,2,3。
它规定了那些特权级的程序可以执行 I/O指令 。
3.指令指针寄存器 EIP和堆栈指针寄存器 ESP
指令指针寄存器总是保存下一次将要执行的指令的偏移地址,偏移地址指这条指令在代码段中的位置 。
堆栈指针寄存器 ESP用于存放当前堆栈段中栈顶的偏移地址 。
EIP和 ESP都 32位寄存器,它们的低 16位分别是 IP和 SP。
31 16 15 0
EIP IP
ESP SP
4.段寄存器 CS,DS,ES,SS,FS,GS
32位 CPU有 6个段寄存器,分别为 CS,DS,ES,SS,FS,
GS,比 16位 CPU增加了 FS,GS两个段寄存器。这些段寄存器也是 16位的,在实模式下,它们的用法和 16位 CPU
相同。
在实模式和 V86模式下,段寄存器的内容是 20位段基址的高 16位。
在保护模式下,段寄存器中的内容是一个选择符,用于在段描述符表中选择段描述符的选择符。
2.4.3 Windows应用程序的内存布局
1.虚拟内存
2.,平坦,内存模式
3.段寄存器
4.内存布局
1.虚拟内存
Windows系统一般在硬盘上建立一个交换文件用做虚拟内存 。
在读写这个内存地址时,CPU要通知操作系统将交换文件的内容读入物理内存 。
如果内存紧张,操作系统还可以将物理内存的内容写到交换文件中,以后程序在访问这个地址时,要从交换文件中读入 。
2.,平坦,内存模式程序员在编程时可以使用的内存空间最大是
4GB,而不必考虑内存的分段问题。
3.段寄存器
在 Windows系统中,段寄存器仍然是 16位的。
他们内容就不再像实模式那样存放段首址的内容,而是存放选择符。
选择符指向一个 64位的描述符,在描述符中规定了段的基地址、长度、类型、特权级等信息。
例如,在一个程序的运行过程中,各个段寄存器和其他寄存器的值为:
3.段寄存器(续)
CS:EIP=001B:3017FFD2 SS:ESP=0023:0012F16C
EAX=00000002 EBX=00E903C8 ECX=00E903C8 EDX=00000DE4
ESI=0012F736 EDI=00000DE4 EBP=0012F180 EFL=00000202
DS=0023 ES=0023 FS=003B GS=0000
再观察各个段的基地址和长度信息:
:gdt 001B
Sel,Type Base Limit DPL Attributes
001B Code32 00000000 FFFFFFFF 3 P RE
:gdt 0023
Sel,Type Base Limit DPL Attributes
0023 Data32 00000000 FFFFFFFF 3 P RW
3.段寄存器(续)
程序中,CS=001BH,001BH是一个索引。以这个索引为依据到 GDT表中去找这个段的描述符,再从描述符中获得它的基地址为 00000000H,长度为 FFFFFFFFH。 这个段的属性为 RE,可读,但不可写。
DS=ES=SS=0023H,数据段和堆栈段是同一个段。数据段的属性为 RW,可读可写,但不可执行。
代码段和数据 /堆栈段的空间是统一的,都是
00000000H~ FFFFFFFFH。
在这个地址空间中,一部分用来存放程序,一部分作为数据区,还有一部分作为堆栈来使用,且不重复。
4.内存布局
Windows系统将 4GB内存地址空间分为两个部分:
用户地址空间和系统地址空间,这两个部分各占 2GB。
对于每一个任务,它的用户地址空间是独有的。
而所有的任务共享系统地址空间,操作系统内核及各种设备的驱动程序都放在系统地址空间中。
举例说明各个任务的独立地址空间程序清单,task1.c( 任务独立地址空间 )
结果,main=0x00401005
&random=0x0042ADB0,random=0
&random=0x0042ADB0,random=27443
程序清单,task2.c( 任务独立地址空间)
结果,main=0x00401005
&ticks=0x00428C3C,ticks=0
&ticks=0x00428C3C,ticks=11553031
举例说明各个任务的独立地址空间(续)
执行下面的命令可以编译 task1.c,task2.c,生成
task1.exe,task2.exe文件 。
cl task1.c
cl task2.c
task1.c程序中设置了一个 random全局变量,用于存放获得的随机数,每次运行时这个数字是不同的 。
task2.c程序中设置了一个 ticks全局变量,用于存放
Windows启动后已运行的毫秒数,这个数字是不断变化的 。
举例说明各个任务的独立地址空间(续在,开始 → 运行,中 输 入 运 行 c:\asm\task1.exe 和
c:\asm\task2.exe各两次,一共产生了 4个任务 。 自己验证 。
对 task1.exe的两个任务来说,逻辑地址 00408A10H表示的内存单元在两个任务中的值并不相同 。 这就意味着在 Windows系统中,每个任务都有它自己独立的逻辑地址空间 。 对 task2.exe的两个任务来说,逻辑地址 004068F0H表示的内存单元在两个任务中的值也不相同,它们被映射到不同的物理内存单元上 。
从 task1.exe和 task2.exe的运行结果中可以看到,main函数的地址都是 00401000H。 而这两个 main函数中的代码内容肯定是不同的,
但它们的逻辑地址是相同的。
2.4.4 Windows的保护机制
80386设置了 4个特权级,编号为 0~ 3。最高的是特权级 0,其次是 1,2,3。 Windows只使用了特权级 0和特权级 3。
特权级 0中运行的是操作系统内核和各种硬件驱动程序;
特权级 3中运行的是各种应用程序。
CS段寄存器的最低 2位表示当前运行程序的特权级。
操作系统内核使用特权级 0,CS设置为 0008H;
应用程序使用特权级 3,CS设置为 0023H。
Windows采用保护机制主要为了检查和防止应用程序的越权操作,保护机制主要由下列几方面组成:
( 1)段的类型检查
( 2)页的类型检查
( 3)段的特权级
( 4)控制转移的检查。
( 5)对 I/O地址的保护
( 6)对系统资源的保护
1 段的类型检查
段的类型是由段描述符指定的
主要属性有是否可执行、是否可读和是否可写等
2 页的类型检查
特权级 0的程序可以读写所有的内存,而特权级 3的程序不能使用属于操作系统的内存空间
( 系统地址空间 ) 。
3 段的特权级
应用程序中段寄存器的最低 2位为 112,即特权级为 3
应用程序不能给段寄存器赋值为特权级 0,即最低 2位只能为 112
4 控制转移的检查
特权级 3上的程序不能直接调用特权级 0中的子程序,而只能利用 80386的调用门,中断门等手段调用指定地址的子程序
通过调用门,中断门时,80386会判断应用程序是否有足够的权限
在子程序的入口处,也可以判断应用程序传递过来的参数是否合法
5 对 I/O地址的保护应用程序能够访问的 I/O地址空间受到操作系统限制 。
6 对系统资源的保护
有一些指令是用来设置系统的各种寄存器和描述符表的,操作系统不允许应用程序执行这些指令
如果违反了上述保护规则,会引发保护异常,
处理器将会进入到对应的异常处理程序中去