第1章 CPU
资源和存储器
1.
16
位寄存器组
4个16位数据寄存器:AX、BX、CX、DX,每个又可分为2个8位寄存器
2个变址寄存器:DI和SI
2个指针寄存器:SP和BP
4个段寄存器:ES、CS、SS和DS
1个标志寄标:FLAG
1个指令指针寄存器:IP
2.
32
位寄存器组
8个32位通用寄存器EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP,完全兼容16位寄存器。
通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。
1.
数据寄存器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
作用
|
寄存器
|
累加器(Accumulator),可用于乘,除,I/O
|
EAX AX AL
|
基址寄存器(Base Register),存储器指针
|
EBX BX
|
计数寄存器(Count Register)。在循环和字符串操作中,用ECX和CX来控制循环次数;在位操作中只能用CL来指明移动的位数。
|
ECX CX CL
|
数据寄存器(Data Register)。在进行乘除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
|
EDX DX
|
源变址寄存器:存储器指针、串指令中的源操作数指针
|
ESI SI
|
源目标变址寄存器::存储器指针、串指令中的目标操作数指针
|
EDI DI
|
基地址指针:存储器指针、存取堆栈的指针
|
EBP BP
|
栈顶指针:堆栈的栈顶指针
|
ESP SP
|
2.
变址和指针寄存器
变址和指针寄存器主要用于存放存储单元在段内的偏移量,用它们可表达多种访问内存的寻址方式。
变址和指针寄存器不可分割成8位寄存器。作为通用寄存器,它们也可存储算术逻辑运算的操作数和运算结果。
32位处理器共有6个16位段寄存器CS、DS、ES、SS、FS、GS
段寄存器
|
段的名称及其含义
|
CS
|
代码段(Code Segment Register):存储程序指令序列的段
|
DS
|
数据段(Data Segment Register):存储程序指令执行时所需要数据的段
|
SS
|
堆栈段(Stack Segment Register):实施堆栈操作的段
|
ES
|
附加数据段(Extra Segment Register):存放程序执行时所需要的数据
|
FS
|
附加数据段:(80386及其以后CPU所增加的)
|
GS
|
附加数据段:(80386及其以后CPU所增加的)
|
位
|
标志位
|
作用
|
CF(Carry Flag)
|
进位标志:如果运算结果的最高位产生了一个进位或借位,值为1
|
|
1
|
|
|
2
|
PF(Parity Flag)
|
奇偶标志:如果1的个数为偶数,则值为1
|
3
|
|
|
4
|
AF(Auxiliary Carry Flag)
|
辅助进位标志:在发生下列情况时值为1
1. 字操作时,低字节向高字节进位或借位
2. 在字节操作时,低4位向高4位进位或借位
|
5
|
|
|
6
|
ZF(Zero Flag)
|
零标志:运算结果是否为0,若为0,值为1
|
7
|
SF(Sign Flag)
|
符号标志:反映运算结果的符号位,与运算结果的最高位相同。即结果为正则为0.
|
8
|
TF(Trap Flag)
|
陷阱标志:置1时,CPU进入单步执行方式。这种方式主要用于程序的调试。
|
9
|
IF(Interrupt-enable Flag)
|
中断允许标志:用来决定CPU是否响应其外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应其外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
IF=0时,CPU可以响应其外部的的可屏蔽中断发出的中断请求
IF=1时,CPU不响应其外部的可屏蔽中断发出的中断请求
|
10
|
DF(Direction Flag)
|
决定在串操作指令执行时有关指针寄存器发生调整的方向。
DF=0,SI(或DI)增加1、2、4
DF=1,SI(或DI)减少1、2、4
|
11
|
OF(Overflow Flag)
|
溢出标志:用于反映有符号数算术运算所得结果是否溢出。溢出置1(
溢出和进位不同,要注意)
|
12
|
IOPL(I/O Privilege Level)
|
I/O特权标志:指定要求执行I/O指令的特权级。如果当前的特权级别在数值上小于等于IOPL的值,则可执行,否则发生一个保护异常。
|
13
|
||
14
|
NT(Nested Task)
|
嵌套任务标志:控制中断返回指令IRET的执行
1. 当NT=0时,用堆栈中的值恢复EFLAGS CS和EIP,执行常规的中断返回操作
2. 当NT=1时,通过任务转换实现中断返回。
|
15
|
|
|
16
|
RF(Restart Flag)
|
重启动标志:用来控制是否接受调试故障。RF=0时,表示“接受”调试故障。
在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。
|
17
|
VM(Virtual 8086 Mode)
|
虚拟8086方式标志:如果为1,则表示处理机处于虚拟8086方式下工作状态,否则处理机处于一般保护方式下的工作状态。
|
18
|
AC(Alignment Check)
|
队列检查标志:为1表示在一个不是字和双字的边界寻址一个字或双字。
|
19
|
VIF(Virtual Interrupt Flag)
|
虚拟中断标志:对Pentium以上处理器有效。是在虚拟方式下中断标志的拷贝。
|
20
|
VIP(Virtual Interupt Pause)
|
虚拟中断暂挂标志:用于多任务环境下,给操作系统提供虚拟虚拟中断标志和中断暂挂信息
|
21
|
ID(Identification)
|
标识:指示Pentium及以上处理器支持指令“CPUID”。该指令可给出CPU的有关信息,如版本号和制造商等。
|
22
|
|
|
23
|
|
|
24
|
|
|
25
|
|
|
26
|
|
|
27
|
|
|
28
|
|
|
29
|
|
|
30
|
|
|
31
|
|
|
32
|
|
|
1.2.1 16
位微机的内存管理模式
1.
存储器的分段
计算机的内存单元是以“字节”为最小单位进行线性编址的。物理地址是一个无符号的二进制数。通常用十六进制来表示。
16位CPU内部有20根地址线,其编码区间为00000H~0FFFFFH,所以它可直接访问的物理空间为1MB(2
20)。
16位微机把内存空间划分成若干个逻辑段,每个段的要求如下:
l 逻辑段起始地址(简称段地址)必须是16的倍数,即最低4位二进制数必须全为0;
l 逻辑段的最大容量为64KB;
由此得出1MB内存最多可分成64K个段(65535个相互重叠的段),至少可分成16个互不重叠的段。
2.
物理地址的形成方式
物理地址=段地址×16+偏移量(即段首地址左移4位再加上偏移地址)
汇编语言程序中,存储单元通常不是用其物理地址标识的,而是用逻辑地址标识。逻辑地址的段地址由段寄存器给出,偏移量可由各类指针寄存器(IP SP BP或BX等)给出。
3.
段寄寄存器的引用
表2.3 段寄存器及其指针寄存器的引用关系
访问存储器方式
|
缺省的段寄存器
|
可选用的段寄存器
|
偏移量
|
|
取指令
|
CS
|
|
IP
|
|
堆栈操作
|
SS
|
|
SP
|
|
一般取操作数
|
DS
|
CS ES SS
|
有效地址
|
|
串操作
|
源操作数
|
DS
|
|
SI
|
目标操作数
|
ES
|
|
DI
|
|
使用指针寄存器BP
|
SS
|
CS DS ES
|
有效地址
|
l 取指令所用的段寄存器和偏移量一定是用CS和IP;
l 堆栈操作所用的段寄存器和偏移量一定是SS和SP;
l 串操作的源操作数和目标操作数所用的段寄存器和偏移量分别是DS和SI,ES和DI;
4.
存储单元的内容
l 一个字节的内容是该字节单元内储存的二进制信息;
l 一个字的内容是由该字地址所指向的单元及其后断一个单元的内容拼接而成;
l 一个双字的内容是由该字地址所指向的单元及其后继3个单元的内容拼接而成;
拼接“字内容”时,按“高高低低”的原则来处理(这与我们平时的习惯不一样,要特别注意):
内存地址
|
12340H
|
12341H
|
12342H
|
12343H
|
12344H
|
。。。
|
内容(值)
|
12H
|
34H
|
56H
|
78H
|
90H
|
。。。
|
在上图中:
l 字节12340H的内容是12H,12341H的内容是34H
l 字12340H的内容是3412H,12341H的内容是5643H(“高低”)
l 双字12340H的内容是78563412H,12341H的内容是90785634H(“高高低低”)
1.2.2 32
位微机的内存管理模式
提供了两种模式:实模式和保护模式
1.
物理地址的计算方式
l 实模式
与16位微机一致。
l 保护模式
段地址长32位,其值可以不是16的倍数,每个段最大容量可达4GB。段寄存器的值是表示段地址的“选择器”(Selector),物理地址就是该段地址加上段内偏移。
2.
段寄存器的引用
l 实模式下,段寄存器的值就是段地址。
l 保护模式下,段寄存器的值不是段地址,是段地址的“选择器”,它间接指出一个32位段地址。
l
3.
存储单元的内容
与16位微机完全一致。
习题
1. 在16位CPU中,有哪些8位寄存器、16位寄存器?哪些16位寄存器可分为两个8位寄存器来使用?
16位寄存器:AX BX CX DX DI SI BP SP ES CS SS DS FLAGS IP。其中AX BX CX DX可以分为两个8位寄存器。
32位寄存器:除以上的E类寄存器外(均由32个二进制位组成),还增加了两个段寄存器: FS GS
2. 同16位CPU相比,在32位CPU中,扩展了哪些寄存器?哪些寄存器的位数没变?所增加的寄存器是什么?
扩展的寄存器主要是通用寄存器和指令指针寄存器,还有标志寄存器。段寄存器的位数没变,增加了两个段寄存器:FS GS
3. 简述各通用寄存器的主要功能
数据寄存器
l 寄存器EAX AX AL通常称为累加器,用累加器运算可加快处理速度。累加器可用于乘、除、I/O等操作。
l 寄存器EBX BX称为基地址寄存器,可作为存储器指针。
l ECX CX CL称为计数寄存器。在循环和字符串操作中,用ECX和CX来控制循环次数;
在位操作中只能用CL来指明移动的位数。
l EDX和DX称为数据寄存器。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O端口地址。
变址和指针寄存器
l SI和DI称为变址寄存器,它们可作为一般的存储器指针使用。
寄存器名称
|
寄存器号
|
主要用途
|
累加器
|
EAX AX AL
|
乘、除、I/O等操作,中间结果的缓存
|
基地址寄存器
|
EBX BX
|
在数据段中作基地址指针
|
计数器
|
ECX CX CL
|
循环计数器、重复操作计数器、移位操作计数器
|
数据寄存器
|
EDX DX
|
字的乘、除运算,间接的输入输出
|
源变址寄存器
|
ESI SI
|
存储器指针、串指令中的源操作数指针
|
目标变址寄存器
|
EDI DI
|
存储器指针、串指令中的目的操作数指针
|
基地址指针
|
EBP BP
|
存储器指针、存取堆栈的指针
|
栈顶指针
|
ESP SP
|
堆栈的栈顶指针
|
4. 简述各段寄存器所指段的含义
段寄存器
|
段的名称及其含义
|
CS
|
代码段(Code Segment Register):存储程序指令序列的段
|
DS
|
数据段(Data Segment Register):存储程序指令执行时所需要数据的段
|
SS
|
堆栈段(Stack Segment Register):实施堆栈操作的段
|
ES
|
附加数据段(Extra Segment Register):存放程序执行时所需要的数据
|
FS
|
附加数据段:(80386及其以后CPU所增加的)
|
GS
|
附加数据段:(80386及其以后CPU所增加的)
|
5. IP/EIP寄存器的用作是什么?它是“计算机组成原理”课中的什么概念在CPU中的体现?
它属于专用寄存器,叫指令指针寄存器,用来存放下次将要执行的指令在代码段的偏移量。
当80386及其高档处理器处于保护模式时,其指令指针寄存器是32位的EIP。在实模式下,由于每个段的最大范围是64K,所以,EIP中的高16位肯定都为0,相当于只用其低16位来反映程序中指令的执行次序,这样,EIP低16位就与先前CPU中的IP作用相同。
6. 在标志寄存器中,用于反映运算结果属性的标志位有哪些?它们每一位所表示的含义是什么?在Debug环境下用什么符号来表示之?
见5-6页的表
反映运算结果属性的标志位主要有:
CF(进或借位置1)
AF(字操作时,低字节向高字节进或借位,字节操作时,低4位向高4位进借位时置1)
PF(运算结果中1的个数为偶时置1)
ZF(结果为0置1)
SF(与运算结果最高位相同)
OF(溢出时置1)
7. 在标志寄存器中,用于反映CPU状态控制的标志位有哪些?它们每一位所表示的含义是什么?在Debug环境下用什么符号来表示之?
见5—6页
反映CPU
状态控制的标志位有:
DF(DF=0,SI(或DI)增加1、2、4, DF=1,SI(或DI)减少1、2、4)
IF(IF=1,CPU可以响应其外部的可屏蔽中断发出的中断请求)
TF(置1时CPU进入单步执行方式)
IOPL(2位二进制表示I/O特权级。如果当前特权级别在数值上小于等于IOPL值,那么该I/O指令可执行否则发生保护异常)
NT(NT=0时,用堆栈中的值恢复EFLAGS CS和EIP,执行常规的中断返回操作,NT=1时,通过任务转换实现中断返回)
RF(RF=0时,接受调试故障)
VM(1表示处理机处于虚拟的8086方式下的工作状态,否则为一般保护方式下的工作状态)
AC(1为在一个不是字和双字的边界寻址一个字或双字)
VIF(在虚拟方式下中断标志的拷贝)
ID(给出CPU的有关信息,如版本号和制造商等)
8. 填空
1) 16位/32位CPU在取指令时,分别需要用到的寄存器有
CS 和
IP 、
CS 和
EIP 。
2) 访问堆栈栈顶单元要由
SS 段寄存器和
SP 寄存器组合来寻址,访问堆栈段中的单元要由
SS 段寄存器和
BP 寄存器组合来寻址。
3) 用基指针(BP)寻址存储器,则其用到的默认段寄存器是
SS 。
4) 访问数据段中的单元要由
DS 段寄存器和
DI 寄存器组合来寻址。
5) 在16位/32位微机系统中,程序最多能同时使用
2 数据段和
4 数据段。
9. 假设用以下寄存器组合来访问存储单元,试分别求出它们所访问单元的物理地址。
a) DS=1000H和DI=2000H;物理地址:12000H
b) DS=2000H和SI=1002H;物理地址:21002H
c) SS=2300H和BP=3200H;物理地址:26200H
d) DS=0A000H和BX=1000H;物理地址:0A1000H
e) SS=2900H和SP=3A00H;物理地址:2CA00H
6) 在实模式下,一个20位的物理地址最多可有
64K 个段值和偏移量来表示。
10. 在默认情况下,哪些寄存器可用于读取堆栈段的数据?
默认情况下,SS段寄存器和SP寄存器用于进行堆栈操作。
11. 按组画出下列数值在内存中的存储形式(假设同组分配在连续存储单元中)
a) 字节值:1、2、‘1’‘A’‘a’和0
物理地址
|
1
|
2
|
3
|
4
|
5
|
|
内容
|
1
|
2
|
‘1’
|
‘A’
|
‘a’
|
|
值
|
1H
|
2H
|
31H
|
41H
|
61H
|
0H
|
b) 字值:12H、6502H、-1和0
物理地址
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
||
内容
|
12H
|
6502H
|
-1
|
|
|||||
值
|
12H
|
0H
|
02H
|
65H
|
0FEH
|
0FFH
|
0H
|
0H
|
c) 双字值:-765H、12345678H和0
物理地址
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
|
内容
|
-765H
|
12345678H
|
||||||||||
值
|
F8H
|
9BH
|
FFH
|
FFH
|
56H
|
78H
|
12H
|
34H
|
0H
|
0H
|
0H
|
0H
|