汇编语言程序设计教程第二版.docx
《汇编语言程序设计教程第二版.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计教程第二版.docx(66页珍藏版)》请在冰点文库上搜索。
汇编语言程序设计教程第二版
汇编语言程序设计教程(第二版)
习题参考答案
第1章计算机基础知识
1.计算机的应用分哪几个方面,请举例说明书中未提到的领域的计算机应用。
科学计算、数据处理、计算机控制、计算机辅助设计、人工智能、企业管理、家用电器、网络应用。
书中未提及的如:
远程教育、住宅小区控制、飞行系统控制与管理等。
2.简述计算机的发展过程,请查阅相关资料,列出微机的发展过程。
电子管、晶体管、集成电路、大规模集成电路
以IBM为例,微机的发展:
4004、8008、8080、8086/8088、80286、80386、80486、Pentium系列
3.计算机的字长是怎么定义的,试举例说明。
计算机能同时处理二进制信息的位宽定义为计算机的字长。
如8086能同时进行16位二进制数据的运算、存储和传输等操作,该机器的字长为16位。
4.汇编语言中的基本数据类型有哪些?
数值型数据和非数值型数据。
非数值数据如字符、字符串、逻辑值等。
5.简述定点数和浮点数的区别。
指标
定点数
浮点数
表示范围
较小
比定点数范围大
精度
决定于数的位数
规格化时比定点高
运算规则
简单
运算步骤多
运算速度
快
慢
控制电路
简单,易于维护
复杂,难于维护
成本
低
高
程序编制
选比例因子,不方便
方便
溢出处理
由数值部分决定
由阶码大小判断
6.按要求完成进制转换。
(1)7BCH=011110111100B=1980D
(2)562Q=101110010B=370D
(3)90D=01011010B=5AH
(4)1110100.111B=164.7Q=74.EH
7.当字长为八位时,写出下列各数的原码、补码和反码
真值
原码
反码
补码
25
00011001
00011001
00011001
-25
10011001
11100110
11100111
100
01100100
01100100
01100100
-100
11100100
10011011
10011100
8.列出数字0~9、大写字母A~Z及小写字母a~z的ASCII码值。
30H~39H41H~5AH61H~7AH
9.在汇编语言中,如何表示二进制、八进制、十进制和十六进制的数值?
用相应进制的数值加上进制标记即可。
二进制用B,如10101010B
八进制用Q,如437Q。
十进制用D或不用,如54D,或54。
十六进制用H,如27A8H
10.完成下列二进制数的加减运算。
(1)10101010+11110000
(2)11001100+01010100
=110011010=100100000
(3)11011010-01010010(4)11101110-01001101
=10001000=10100001
11.完成下列十六进制数的加减运算。
(1)0FEA9-8888=7621H
(2)0FFFF-1234=EDCBH
(3)0EAC0+0028=EAE8H(4)3ABC+1678=5134H
12.完成下列BCD码的运算。
(1)3+5=8
0011+0101=1000不用进行十进制调整
(2)4+7=11
0100+0111=1011此码不是BCD码,需要进行十进制调整
1011+0110=10001=0001,0001
(3)6+5=11
0110+0101=1011此码不是BCD码,需要进行十进制调整
1011+0110=10001=0001,0001
(4)8+8=16
1000+1000=10000此码不是BCD码,需要进行十进制调整
10000+0110=10110=0001,0110
第2章微型计算机系统概述
1.说明二进制位(bit),字节(byte),字(word),双字(doubleword)的含义及相互之间的关系。
位(bit):
一个二进制位
字节(byte):
8位二进制位
字(word):
一般为机器字长,在8086机器中为16位二进制位,即两个字节。
双字(doubleword):
双倍字长,在8086机器中为32位二进制位。
2.一台微型计算机,数据线有8根,地址线有16根,如果采用字节编址,那么它可以访问的最大存储空间是多少字节?
试用十六进制数表示该机的地址范围。
216=64KB,0000H~FFFFH
3.8088CPU内部分为哪两个大的功能部件?
试述这两个部件的作用是什么?
8088微处理器内部分为执行单元(EU)和总线接口单元(BIU)两部分。
BIU单元用来实现EU的所有总线操作。
它由地址加法器,段寄存器CS、DS、SS、ES,指令指针IP,指令队列缓冲器和总线控制逻辑组成。
BIU负责CPU与存储器或外部设备之间的信息交换。
地址加法器将段和偏移地址相加,生成20位的物理地址。
EU单元负责指令的执行,由算术逻辑单元ALU、标志寄存器F、通用寄存器及EU控制器等组成,主要进行16位的各种运算及有效地址的计算。
EU不与计算机系统总线相关,而从BIU中的指令队列取得指令。
这个指令队列中,存放着BIU预先由存储器中取出的若干个字节的指令。
4.8088微处理器中有哪些寄存器?
说明它们的功能及分组情况。
5.8086的寄存器中,有哪些16位寄存器可分为两个8位寄存器来使用?
AX(AH,AL)、BX(BH,BL)、CX(CH,CL)、DX(DH,DL)
6.8086/8088的标志寄存器F中有哪些标志位?
它们的名称和功能是什么?
CF——进位标志(CarryFlag)。
若CF=1,表示算术运算时产生进位或借位,否则CF=0。
移位指令会影响CF。
PF——奇偶标志(ParityFlag)。
若PF=1,表示操作结果中“1”的个数为偶数,否则PF=0。
这个标志位主要用于检查数据传送过程中的错误。
AF——辅助进位标志(AuxiliaryCarryFlag)。
若AF=1表示字节运算产生低半字节向高半字节的进位或借位,否则AF=0。
辅助进位也称半进位标志,主要用于BCD码运算的十进制调整。
ZF——全零标志(ZeroFlag)。
若ZF=1,表示操作结果全为零,否则ZF=0。
SF——符号标志(SignFlag)。
若SF=1,表示符号数运算后的结果为负数,否则SF=0。
OF——溢出标志(OverflowFlag)。
若OF=1,表示当进行算术运算时,结果超过了最大范围,否则OF=0。
IF——中断允许标志(InterruptEnableFlag)。
若IF=1,则CPU可以响应外部可屏蔽中断请求;若IF=0,则CPU不允许响应中断请求。
IF的状态可由中断指令设置。
DF——方向标志(DirectionFlag)。
若DF=1,表示执行字符串操作时按着从高地址向低地址方向进行;否则DF=0。
DF位可由指令控制。
TF——单步标志(TraceFlag)。
又称跟踪标志。
该标志位在调试程序时可直接控制CPU的工作状态。
当TF=1时为单步操作,CPU每执行一条指令就进入内部的单步中断处理,以便对指令的执行情况进行检查;若TF=0,则CPU继续执行程序。
7.80386有哪几种工作方式?
简述每种工作方式的特点。
80386有三种工作方式:
实地址方式、保护方式和虚拟8086方式。
实地址方式——80386在实地址方式下的工作原理与8086相同,主要差别是80386可以处理32位的数据,如进行32位的寄存器的运算,以及偏移地址在64KB以内的32位的数据传送。
另外,在实地址方式下80386新增加的两个段寄存器FS和GS是可用的。
实地址方式是80386复位后立即出现的工作方式。
保护方式——80386在保护方式下可以访问4G字节的物理存储空间,段的长度在启动页功能时是4G字节,不启动页功能时是1M字节,页功能是可选的。
在此方式下,可以引入虚拟存储器的概念,以扩充软件所占有的存储器空间。
保护方式是支持多任务的方式,提供了一系列的保护机制,如任务地址空间的分离、0~3共四个特权级、特权指令、段和页的访问权限(只读或只执行等)以及段限检查。
虚拟8086方式——这是一种既有保护功能,又能执行8086代码的工作方式,是一种动态方式。
在此方式下,80386能够迅速、反复进行虚拟8086方式和保护方式的切换。
从保护方式进入虚拟8086方式执行8086程序,然后离开虚拟8086方式,进入保护方式继续执行固有的80386程序。
8.80486有哪些寄存器?
简述各寄存器的功能。
表2-480486的寄存器组
基本结构寄存器组
系统级寄存器组
浮点寄存器组
通用寄存器
指令指针寄存器
标志寄存器
段寄存器
系统地址寄存器
控制寄存器
测试寄存器
调试寄存器
数据寄存器
标记字寄存器
指令和数据指针寄存器
控制字寄存器
9.Pentium有哪些主要的寄存器,简述各组寄存器的功能。
Pentium的寄存器组织可以分成三大类,即基本寄存器组、系统寄存器组和浮点寄存器组。
其中系统寄存器组只供系统程序访问,其他两组寄存器则供系统程序和应用程序共同访问。
Pentium微处理器对80486的寄存器作了一些扩充。
EFLAGS标志寄存器增加了两位:
VIF(位19)和VIP(位20),它们用于控制Pentium虚拟8086方式扩充部分的虚拟中断。
控制寄存器CR0的CD位和NW位被重新定义以控制Pentium的片内高速缓存,并新增了CR4控制寄存器对80486结构扩充。
此外,还增加了几个模式专用寄存器,用于控制可测试性、执行跟踪、性能检测和机器检查错误等功能。
10.在8086系统中,段地址和偏移地址如下所示,请分别计算它们的物理地址。
(1)F000:
0100物理地址为:
F0000H+0100H=F0100H
(2)2350:
1ABC物理地址为:
23500H+1ABCH=24FBCH
(3)3200:
1234物理地址为:
32000H+1234H=33234H
(4)5000:
010E物理地址为:
50000H+010EH=5010EH
(5)10E0:
2020物理地址为:
10E00H+2020H=12E20H
(6)2010:
1020物理地址为:
20100H+1020H=21120H
(7)1000:
1000物理地址为:
10000H+1000H=11000H
(8)C0C0:
C0C0物理地址为:
C0C00H+C0C0H=CCCC0H
11.从8086开始的所有80x86系列微机系统中,寻址内存的地址总线有多少位?
内存的寻址范围为多少?
数据宽度为多少?
机型
地址总线宽度
内存地址范围
数据总线宽度
8086
20位
00000H~FFFFFH
16位
80286
24位
000000H~FFFFFFH
16位
80386
32位
00000000H~FFFFFFFFH
32位
80486
32位
00000000H~FFFFFFFFH
32位
Pentium
32位
00000000H~FFFFFFFFH
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提供了一个称为分支目标缓冲器BTB(BranchTargetBuffer)的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的堆栈操作指令
格式
功能
PUSH32位立即数
将32位立即数压入堆栈。
该指令执行后SP的值将减4。
PUSHAD
将所有通用寄存器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
将32位标志寄存器EFLAGS的内容压入堆栈。
POPFD
将当前栈顶的4字节内容弹至EFLAGS寄存器。
5.简述80386微处理器中“系统设置和测试指令”的功能。
系统设置和测试指令80386新增加的,它们一般出现在操作系统中,用于对系统的设置和测试。
(1)清除TS标志指令CLTS,这条指令用来清除机器状态字中的任务切换标志TS。
(2)存储全局/局部/中断描述符表寄存器指令SGDT/SLDT/SIDT,这三条指令分别将全局描述符表寄存器、局部描述符表寄存器或中断描述符表寄存器的内容送到存储器中。
(3)装入全局/局部/中断描述符表寄存器指令LGDT/LLDT/LIDT,这三条指令分别将存储器中的字节装入全局描述符表寄存器、局部描述符表寄存器或中断描述符表寄存器。
局部描述符表寄存器为两个字节,其他两个寄存器为六字节宽。
(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判别处理器是否支持某些新增指令。
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的指令
格式为:
MOVCR4,R32
8、将控制寄存器CR4的内容送32位寄存器的指令
格式为:
MOVR32,CR4
7.什么是堆栈操作?
以下关于堆栈操作的指令执行后,SP的值是多少?
PUSHAX
PUSHCX
PUSHDX
POPAX
PUSHBX
POPCX
POPDX
堆栈被定义为一种先进后出的数据结构,即最后进栈的元素将被最先弹出来。
堆栈从一个称为栈底的位置开始,数据进入堆栈的操作称为压入(或压栈),数据退出堆栈的操作称为弹出,每进行一次弹出操作,堆栈就减少一个元素,最后一次压入的元素,称为栈顶元素,压入弹出操作都是对栈顶元素进行的堆栈的两种基本的操作。
在进行以上一系列堆栈操作后,SP指针的值是原SP+2。
8.用汇编语言指令实现以下操作。
(1)将寄存器AX、BX和DX的内容相加,和放在寄存器DX中。
ADDAX,BX
ADDDX,AX
(2)用基址变址寻址方式(BX和SI)实现AL寄存器的内容和存储器单元BUF中的一个字节相加的操作,和放到AL中。
ADDAL,BYTEPTR[BX][SI]
(3)用寄存器BX实现寄存器相对寻址方式(位移量为100H