汇编语言程序设计教程(第二版)卜艳萍著 下载本文

80486 Pentium 32位 32位 00000000H~FFFFFFFFH 00000000H~FFFFFFFFH 32位 64位

12. 简述上题所涉及的各种微机系统的内存组织方式。

8086:存储器分段管理。

80286:存储器分段管理,在保护方式下,存储器寻址使用32位指针,包含一个16位的选择子分量和一个16位的偏移量分量。但选择子的内容不再是一个物理存储器的地址的高16位,而是进入某一个存储器常驻表的变址值,所要求的段的24位段基地址要从存储器中的表内取得。16位偏移量用来加到段基址上,形成24位的物理地址

80386:CPU可直接寻址的物理空间达4GB,除了保留存储器分段管理外,还增加了内存分页管理。

80386的段选择寄存器是在80286选择寄存器基础之上新增了两个支持当前数据段的段选择寄存器FS和GS,与段选择寄存器相关联的段描述符高速缓冲器扩充到64位。

80486:80486具有32位的内存地址空间,对存储器段的访问采用段描述符管理机制。具有三种工作方式,即实地址方式、虚拟地址保护方式和虚拟8086方式。在虚拟地址保护方式下,可寻址4GB物理地址空间以及64TB虚拟地址空间。

80486内部的存储器管理部件MMU由分段部件和分页部件组成。分段部件用来把指令给出的逻辑地址转换成线性地址,并对逻辑地址空间进行管理,实现多任务之间存储器空间的隔离和保护,同时也实现了指令和数据区的再定位。分页部件用来把线性地址转换成物理地址,并对物理地址空间进行管理,实现虚拟存储器技术。

Pentium:地址总线仍为32位,因此物理寻址范围仍为4GB。Pentium微处理器在工作方式方面,还增加了一种“系统管理方式(SMM)”,以实现对电源和OS进行管理等高级功能。

13. 简述从8086到Pentium微处理器在组成结构上的变化,分析这些变化,你能得出什么

结论?

8086:8086微处理器内部分为执行单元(EU)和总线接口单元(BIU)两部分。BIU单元用来实现EU的所有总线操作,EU单元负责指令的执行。

80286:在内部结构上,8086中的总线接口部件BIU在80286中又分成了地址部件AU、指令部件IU和总线部件BU,从而加快了处理器的运行速度。

80386:80386的内部结构由总线接口单元、指令预取部件、指令译码部件、执行部件、分段部件和分页部件6个逻辑功能部件组成,每个部件都能独立操作,又可以对同一条指令的不同部分同时并行操作,使多条指令重叠进行,大大提高了CPU的速度。80386是对80286微处理器的彻底改进,在内存管理和处理速度上比80286之前的CPU有了很大的突破,是一种功能完善高可靠性的CPU,并在目标代码上保持与8086、80286的向上兼容。

80486:80486芯片的内部结构由总线接口、高速缓存、指令预取、指令译码、控制、算术逻辑运算、浮点运算、分段和分页九大部件组成。这些部件可以重叠工作,并构成五级流水线的指令处理。芯片内具有8KB的数据/指令高速缓存Cache,可为频繁访问的数据和指令提供高速缓存,从而加快CPU与存储器之间的信息交换。片内集成了浮点运算部件,可支持32位、64位和80位的浮点算术运算。由于与CPU之间的数据通道总线加宽,而引线缩短,它们之间的信息交换速度也得到提高。片内具有存储管理部件MMU,可支持对存储器地址实施管理和对存储器空间进行保护。

Pentium:Pentium微处理器的基本组成包括总线接口部件、分页部件、片内Cache存储器、浮点部件、控制部件、执行部件以及分支目标缓冲器等。Pentium提供了一个称为分支

5

目标缓冲器BTB(Branch Target Buffer)的1KB的Cache来动态地预测程序的分支操作。Pentium芯片内部集成了16KB的Cache,其中8KB作为数据Cache,另外8KB作为指令Cache,这两个超高速的Cache可以并行工作。将指令Cache和数据Cache分离的目的是使指令预取和数据操作之间可能发生的冲突降至最低,从而提高CPU的效率。浮点指令流水线具有8级,实际上它是U流水线的扩充。U流水线的前4级用来准备一条浮点指令,浮点部件中的后4级执行特定的运算操作并报告执行错误。

CPU内部的功能部件数量增加,集成度依次提高,将某些原在CPU外部的功能部件集成到CPU内部,功能越来越完善。

第3章 微型计算机的指令系统

1. 8086/8088指令系统中操作数的类型有哪几种?关于操作数的寻址方式有哪几类? 立即数、寄存器数和内存单元数。

立即寻址、寄存器寻址、寄存器间接寻址、直接寻址、寄存器相对寻址、基址加变址寻址、基址加变址相对寻址。

2. 指出段地址、偏移地址与物理地址之间的关系。有效地址EA又是指什么?

段地址左移四位加上偏移地址形成20位的物理地址。

EA是指段内偏移地址,即表示段内某单元相对于段起始地址的空间位置。

3. 指出能用于寄存器间接寻址及变址寻址的寄存器有哪些?它们通常与哪个段寄存器配

合形成物理地址?

能用于寄存器间接寻址及变址寻址的寄存器有基址寄存器BX和BP,变址寄存器SI和DI,BX、SI、DI与DS配合形成物理地址,而BP与SS配合形成物理地址。 4. 与8086相比,80386的堆栈操作类指令有那些改变?

80386的堆栈操作指令 格式 PUSH 32位立即数 PUSHAD 功能 将32位立即数压入堆栈。该指令执行后SP的值将减4。 将所有通用寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI的内容顺序压入堆栈,其中压入堆栈的ESP是该指令执行前ESP的值。执行该指令后,ESP的值减32。 POPAD 将当前栈顶内容顺序弹至EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX,但是最终ESP的值为弹出操作对堆栈指针调整后的值(而不是堆栈中保存的ESP的值)。即执行该指令后ESP的值,可以通过增加32来恢复。 PUSHFD POPFD 将32位标志寄存器EFLAGS的内容压入堆栈。 将当前栈顶的4字节内容弹至EFLAGS寄存器。

5. 简述80386微处理器中“系统设置和测试指令”的功能。

系统设置和测试指令80386新增加的,它们一般出现在操作系统中,用于对系统的设置和测试。

(1)清除TS标志指令CLTS,这条指令用来清除机器状态字中的任务切换标志TS。 (2)存储全局/局部/中断描述符表寄存器指令SGDT/SLDT/SIDT,这三条指令分别将全局描述符表寄存器、局部描述符表寄存器或中断描述符表寄存器的内容送到存储器中。

(3)装入全局/局部/中断描述符表寄存器指令LGDT/LLDT/LIDT,这三条指令分别将存储器中的字节装入全局描述符表寄存器、局部描述符表寄存器或中断描述符表寄存器。局

6

部描述符表寄存器为两个字节,其他两个寄存器为六字节宽。

(4)存储任务寄存器指令STR,例如:STR [EBX] ;将任务寄存器的两个字节内容送到内存,内存首字节地址由EBX指出。

(5)装入任务寄存器指令LTR,这条指令一般用于多任务操作系统中,它将内存中两个字节装入任务寄存器TR。执行LTR指令后,相应的任务状态段TSS标上“忙”标志。

(6)装入访问权指令LAR,本指令将两个字节选择子中的访问权字节送到目的寄存器。 (7)装入段界限值指令LSL,LSL将描述符中的段界限值送目的寄存器,在指令中,由选择子来指出段描述符。

(8)检测段类型指令VERR/VERW,VERR检测一个选择子所对应的段是否可读,VERW则检测一个选择子所对应的段是否可写。

(9)调整请求特权级指令ARPL,这条指令的功能为调整选择子的RPL字段,由此常用来阻止应用程序访问操作系统中涉及安全的高级别的子程序。ARPL的第一个操作数可由存储器或寄存器指出,第二个操作数则必定为寄存器。如果前者的RPL(最后两位)小于后者的RPL,则ZF置为1,且将前者的RPL增值,使其等于后者的RPL;否则,ZF=0,并不改变前者的RPL。

(10)存储机器状态字指令SMSW,将机器状态字MSW存到内存指定单元对应的两个字节中。

(11)装入机器状态字指令LMSW

本指令将存储器中两个字节送到机器状态字MSW中,通过这种方式,可以使CPU切换到保护方式。

6. 列出80486和Pentium微处理器新增加的指令,并简述每条指令的功能。

除了浮点操作指令系统外,80486新增加了6条指令。

(1) BSWAP 双字交换。使32位寄存器中的操作数按字节首尾交换,即D31~D24与D7~D0交换,D23~D16

与D15~D8交换。

(2) XADD

将源操作数与目的操作数交换并相加,其中源操作数必须为寄存器,而目的操作数可以是寄存器也可以是内存单元,然后相加,其结果存放在源寄存器中。

(3) CMPXCHG

比较与交换。该指令使用3个操作数:一个寄存器中的源操作数、一个寄存器或内存储器单元的目的操作数和一个隐含(不出现在用户所书写的指令中)的累加器(AL/AX/EAX)。如果目的操作数与累加器的值相等,源操作数送目的单元,否则将目的操作数送累加器。

(4) INVD

Cache无效指令。擦除整个片内Cache,使之无效,并且启动一个擦除总线周期,使外部电路清除片外二级Cache的内容。

(5) WBINVD

Cache无效且回写指令。擦除整个片内Cache,使之无效,并启动一个回写总线周期,将片外二级Cache中的数据回写到内存中,再清除二级Cache中的内容。

(6) INVLPG

转换检测缓冲器TLB无效指令。该指令带有一个操作数,指示TLB中的某一项,使之无效。

与80486相比,Pentium新增加了3条处理器专用指令和5条系统控制指令,但某些新增的指令是否有效与Pentium的型号有关,可利用处理器特征识别指令CPUID判别处理器

7

是否支持某些新增指令。

1、处理器特征识别指令CPUID

根据EAX中的参数,将处理器的说明信息送EAX,特征标志字送EDX。 2、8字节比较交换指令CMPXCHG8B

该指令带有一个内存储器单元操作数。它能实现将EDX:EAX中的8字节值与指定的8字节存储器操作数相比较,若相等,则使ZF=1,且将ECX:EBX中的值送指定的8字节存储单元替换原有的存储器操作数;否则使ZF=0,且将指定的8字节存储器操作数送EDX:EAX。

3、读时间标记计数器指令RDTSC

将Pentium中的64位时间标记计数器的高32位送EDX,低32位送EAX。该计数器随每一个时钟递增,在Reset后该计数器被置0。利用该计数器可检测程序运行性能。

4、读模型专用寄存器指令RDMSR

将ECX所指定的模型专用寄存器的内容送EDX、EAX,具体来说,高32位送EDX,低32位送EAX。若所指定的模型寄存器不是64位,则EDX、EAX中的对应位无定义。

5、写模型专用寄存器指令WRMSR

将EDX、EAX的内容送到由ECX指定的模型专用寄存器。具体来说,EDX和EAX的内容分别作为高32位和低32位。若指定的模型寄存器有未定义或保留的位,则这些位的内容不变。

6、复位到系统管理模式指令RSM

7、将32位寄存器中的内容送控制寄存器CR4的指令 格式为:MOV CR4,R32

8、将控制寄存器CR4的内容送32位寄存器的指令 格式为:MOV R32,CR4

7. 什么是堆栈操作?以下关于堆栈操作的指令执行后,SP的值是多少?

PUSH AX PUSH CX PUSH DX POP AX PUSH BX

POP CX POP DX

堆栈被定义为一种先进后出的数据结构,即最后进栈的元素将被最先弹出来。堆栈从一个称为栈底的位置开始,数据进入堆栈的操作称为压入(或压栈),数据退出堆栈的操作称为弹出,每进行一次弹出操作,堆栈就减少一个元素,最后一次压入的元素,称为栈顶元素,压入弹出操作都是对栈顶元素进行的堆栈的两种基本的操作。

在进行以上一系列堆栈操作后,SP指针的值是原SP+2。

8. 用汇编语言指令实现以下操作。

(1)将寄存器AX、BX和DX的内容相加,和放在寄存器DX中。 ADD AX,BX

ADD DX,AX

(2)用基址变址寻址方式(BX和SI)实现AL寄存器的内容和存储器单元BUF中的

一个字节相加的操作,和放到AL中。

8