目标缓冲器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
ADD AL,BYTE PTR [BX][SI]
(3)用寄存器BX实现寄存器相对寻址方式(位移量为100H),将DX的内容和存储单
元中的一个字相加,和放到存储单元中。 ADD 100H[BX],DX (4)用直接寻址方式(地址为0500H)实现将存储器中的一个字与立即数3ABCH相加,和放回该存储单元中。 ADD [0500H],3ABCH
(5)用串操作指令实现将内存定义好的两个字节串BUF1和BUF2相加后,存放到另一
个串BUF3中的功能。 ??
MOV CX,COUNT MOV SI,OFFSET BUF1 MOV DI,OFFSET BUF3 MOV BX,OFFSET BUF2 AGAIN:LODSB ADD AL,[BX] STOSB INC BX DEC CX JNZ AGAIN ??
9. 指出下列指令中,源操作数及目的操作数的寻址方式。
(1)SUB BX,[BP+35] ;寄存器寻址、寄存器相对寻址 (2)MOV AX,2030H ;寄存器寻址、立即寻址
(3)SCASB ;隐含操作数为寄存器寻址和寄存器间接寻址 (4)IN AL,40H ;寄存器寻址、立即寻址 (5)MOV [DI+BX],AX ;基址加变址寻址、寄存器寻址 (6)ADD AX,50H[DI] ;寄存器寻址、寄存器相对寻址 (7)MOV AL,[1300H] ;寄存器寻址、直接寻址
(8)MUL BL ;寄存器寻址、目的操作数为隐含寄存器寻址
10. 已知(DS)= 1000H,(SI)= 0200H,(BX)= 0100H,(10100H)= 11H,(10101H)=
22H,(10600H)= 33H,(10601H)= 44H,(10300H)= 55H,(10301H)= 66H,(10302H)= 77H,(10303H)= 88H,试分析下列各条指令执行完后AX寄存器的内容。 (1)MOV AX,2500H (AX)=2500H (2)MOV AX,500H[BX] (AX)==4433H (3)MOV AX,[300H] (AX)=6655H (4)MOV AX,[BX] (AX)=2211H (5)MOV AX,[BX][SI] (AX)=6655H (6)MOV AX,[BX+SI+2] (AX)=8877H
11. 判断下列指令是否有错,如果有错,说明理由。 (1)SUB BL,BX ;两个操作数的宽度不一样
9
(2)MOV BYTE PTR[BX],3456H ;将16位的立即数传送到一个字节的内存单元 (3)SHL AX,CH ;移位指令的移位位数用CL给出,不能用CH。 (4)MOV AH,[SI][DI] ;不能用两个变址寄存器来实现寻址操作 (5)SHR AX,4 ;只有当移位位数为1时,才能用立即数表达 (6)MOV CS,BX ;不能对CS实现传送操作
(7)MOV 125,CL ;立即数不能做目的操作数
(8)MOV AX,BYTE PTR[SI] ;源操作数限定为字节,与目的操作数宽度不一致 (9)MOV [DI],[SI] ;两个操作数不能同时为内存数
12. 设(DS)= 1000H,(ES)= 2000H,(SS)= 3000H,(SI)= 0080H,(BX)= 02D0H,
(BP)= 0060H,试指出下列指令的源操作数字段是什么寻址方式?它的物理地址是多少?
(1)MOV AX,0CBH 立即寻址
(2)MOV AX,[100H] 直接寻址,物理地址为:10100H (3)MOV AX,[BX] 寄存器间接寻址,物理地址为:102D0H (4)MOV AX,[BP] 寄存器间接寻址,物理地址为:20060H (5)MOV AX,[BP+50] 寄存器相对寻址,物理地址为:200B0H (6)MOV AX,[BX][SI] 基址加变址寻址,物理地址为:10350H
13. 分别说明下列每组指令中的两条指令的区别.
(1) AND CL,0FH 按位相“与”,高4位为“0000”,低4位保留原值;
OR CL,0FH 按位相“或”,高4位为原值,低4位为“1111”。 (2) MOV AX,BX 将BX寄存器的内容传送到AX寄存器中;
MOV AX,[BX] 将BX寄存器所指的内存单元的内容送AX寄存器中。
(3) SUB BX,CX BX寄存器内容减去CX寄存器的内容,结果送回到BX; CMP BX,CX BX内容减去CX内容,但结果不送回,而根据标志位的情
况做进一步的动作。
(4) AND AL,01H AL内容与01H相“与”,结果为“0000000x”送回AL寄存器;
TEST AL,01H AL内容与01H相“与”,结果为“0000000x”不送回AL寄存器,而根据标志位(ZF)情况做进一步的动作。
(5) JMP NEAR PTR NEXT NEXT所指指令在当前指令的同段内(16位地址范围);
JMP SHORT NEXT NEXT所指指令在当前指令的8位地址范围内。
(6) ROL AX,CL 循环左移,进位标志位不参与循环;
RCL AX,CL 循环左移,进位标志位参与循环。 (7) PUSH AX 将AX内容存入栈顶指针处,即进栈操作;
POP AX 将栈顶内容弹出装入AX寄存器中,即出栈操作。
14. 试分析以下程序段执行完后BX的内容为何?
MOV BX,1030H
MOV CL,3 SHL BX,CL DEC BX
10