为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

汇编语言卜艳萍(第二版)习题答案

2010-09-17 39页 doc 622KB 123阅读

用户头像

is_662204

暂无简介

举报
汇编语言卜艳萍(第二版)习题答案汇编语言程序设计教程(第二版) 汇编语言程序设计教程(第二版) 习题参考答案 第1章 计算机基础知识 1.​ 计算机的应用分哪几个方面,请举例说明书中未提到的领域的计算机应用。 科学计算、数据处理、计算机控制、计算机辅助设计、人工智能、企业管理、家用电器、网络应用。 书中未提及的如:远程教育、住宅小区控制、飞行系统控制与管理等。 2.​ 简述计算机的发展过程,请查阅相关资料,列出微机的发展过程。 电子管、晶体管、集成电路、大规模集成电路 以IBM为例,微机的发展:4004、8008、8080、8086/8088、80286、8...
汇编语言卜艳萍(第二版)习题答案
汇编语言程序教程(第二版) 汇编语言程序设计教程(第二版) 习参考答案 第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~39H 41H~5AH 61H~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),双字(double word)的含义及相互之间的关系。 位(bit):一个二进制位 字节(byte):8位二进制位 字(word):一般为机器字长,在8086机器中为16位二进制位,即两个字节。 双字(double word):双倍字长,在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——进位标志(Carry Flag)。若CF=1,表示算术运算时产生进位或借位,否则CF=0。移位指令会影响CF。 PF——奇偶标志(Parity Flag)。若PF=1,表示操作结果中“1”的个数为偶数,否则PF=0。这个标志位主要用于检查数据传送过程中的错误。 AF——辅助进位标志(Auxiliary Carry Flag)。若AF=1表示字节运算产生低半字节向高半字节的进位或借位,否则AF=0。辅助进位也称半进位标志,主要用于BCD码运算的十进制调整。 ZF——全零标志(Zero Flag)。若ZF=1,表示操作结果全为零,否则ZF=0。 SF——符号标志(Sign Flag)。若SF=1,表示符号数运算后的结果为负数,否则SF=0。 OF——溢出标志(Overflow Flag)。若OF=1,表示当进行算术运算时,结果超过了最大范围,否则OF=0。 IF——中断允许标志(Interrupt Enable Flag)。若IF=1,则CPU可以响应外部可屏蔽中断请求;若IF=0,则CPU不允许响应中断请求。IF的状态可由中断指令设置。 DF——方向标志(Direction Flag)。若DF=1,表示执行字符串操作时按着从高地址向低地址方向进行;否则DF=0。DF位可由指令控制。 TF——单步标志(Trace Flag)。又称跟踪标志。该标志位在调试程序时可直接控制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-4 80486的寄存器组 基本结构寄存器组 系统级寄存器组 浮点寄存器组 通用寄存器 指令指针寄存器 标志寄存器 段寄存器 系统地址寄存器 控制寄存器 测试寄存器 调试寄存器 数据寄存器 标记字寄存器 指令和数据指针寄存器 控制字寄存器 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(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位立即数 将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的指令 格式为: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中。 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 ;两个操作数的宽度不一样 (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 程序执行完后,BX=817FH,执行过程如下。 15.​ 写出下列指令序列中每条指令的执行结果,并在DEBUG环境下验证,注意各标志位的变化情况。 MOV BX,126BH ADD BL,02AH MOV AX,2EA5H ADD BH,AL SBB BX,AX ADC AX,26H SUB BH,-8 第4章 8086/8088汇编语言 1.​ 8086汇编语言指令由几部分组成?各部分的作用是什么? [名字] 指令操作符 [操作数] [;注释] 名字可以是常量名、变量名、过程名、段名等标识符等,起标识和标记的作用;指令操作符字段说明指令的功能;操作数字段提供指令操作所需要的源数据和目的数据;注释字段用于程序员对语句或程序段落进行解释说明,增加可读性。 2.​ 请解释变量和标号的含义,两者有何区别? 所定义内存单元的名称为变量,可进行读、写操作,一般为数据区。 标号是某条指令的地址标记,在代码段。 3.​ 试描述汇编语言源程序的一般结构。 STACK SEGMENT STACK DW 256 DUP(?) STACK ENDS DATA SEGMENT …… DATA ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA START:…… …… CODE ENDS END START 4.​ 开发汇编语言源程序的主要步骤有哪些? 首先用EDIT等编辑程序产生汇编语言的源程序,源程序是用汇编语言的语句编写的且不能为机器所识别的程序,所以要经过汇编程序加以翻译,因此汇编程序的作用就是把源文件转换成用二进制代码表示的目标文件(称为OBJ文件)。在转换的过程中,如果源程序中有语法错误,则汇编结束后,汇编程序将指出源程序中的错误信息,如非法格式,未定义的助记符、标号,漏掉操作数等。用户还可以用编辑程序来修改源程序中的错误,最后得到无语法错误的目标文件。目标文件虽然已经是二进制文件,但它还不能直接上机运行,必须经过连接程序(LINK)把目标文件与库文件或其他目标文件连接在一起形成可执行文件(EXE文件),才可以在机器上运行。 5.​ 数值返回运算符有哪几种?简述LENGTH与SIZE的区别。 数值返回运算符有TYPE、LENGTH、SIZE、OFFSET和SEG5种。这些操作符把一些特征或存储器地址的一部分作为数值回送,但不改变原操作数的属性。其中: TYPE是类型操作符。 LENGTH是分配单元长度操作符。 SIZE是分配字节操作符。 OFFSET是偏移量操作符。 SEG是段基址操作符。 且有关系:SIZE=TYPE*LENGTH。 6.​ 在BUF1变量中依次存储了5个字数据,接着定义了一个名为BUF2的字单元,表示如下: BUF1 DW 8765H,6CH,0,1AB5H,47EAH BUF2 DW ? (1)​ 设BX中是BUF1的首地址,请编写指令将数据50H传送给BUF2单元。 ADD BX,10 MOV WORD PTR[BX],50H (2)​ 请编写指令将数据FFH传送给数据为0的单元。 ADD BX,4 MOV WORD PTR[BX],FFH 7.​ 下面是一个数据段的定义,请用图表示它们在内存中存放的形式。 DATA SEGMENT A1 DB 25H,35H,45H A2 DB 3 DUP(5) A3 DW 200,3AB6H A4 DW 3000H,6A6FH DATA ENDS A1 25H 35H 45H A2 05H 05H 05H A3 00H 02H B6H 3AH A4 00H 30H 6FH 6AH 8.​ 说明下列语句所分配的存储空间及初始化的数据值。 (1)BYTE_VAR DB ‘BYTE’,21,-42H,3 DUP(0,?,2 DUP(2,3),?) (2)WORD_VAR DW 5 DUP(4,2,0),?,-8,‘BY’,‘TE’256H BYTE_VAR 42H WORD_VAR 04H 59H 00H 54H 02H 45H 00H 15H 00H 10111110B 00H 0 04H — 00H 2 02H 3 00H 2 00H 3 00H — 04H 0 00H — 02H 2 00H 3 00H 2 00H 3 04H — 00H 0 02H — 00H 2 00H 3 00H 2 04H 3 00H — 02H 00H 00H 00H — — 11111000B 11111111B 42H 59H 54H 45H 56H 02H 9.​  10.​ 在下列数据传送程序段中有些使用不当的语句,请改正之。 A DB 10H,20H,‘OPQ’,4FH B DB N DUP(?) ;改为B DB 6 DUP(?) MOV DI,A ;改为MOV DI,OFFSET A MOV SI,B ;改为MOV SI,OFFSET B MOV CX,LENGTH A ;改为MOV CX,LENGTH B CC: MOV AX,[DI] MOV [SI],AX INC SI INC DI DEC CX ;去掉该句 LOOP CC 11.​ 以下程序段落拟实现在同一个段内的调用过程,试判断可行性,如不能实现,请改正。 CODE SEGMENT ASSUME CS:CODE BEGIN: ┇ CALL SUB1 ┇ CALL SUB2 ┇ SUB1 PROC FAR MOV AX,X MOV BX,Y MUL BX RET SUB1 ENDP CODE ENDS END START SUB1应为NEAR型,过程SUB2并未定义,应定义SUB2。程序段落改为: CODE SEGMENT ASSUME CS:CODE BEGIN: ┇ CALL SUB1 ┇ CALL SUB2 ┇ SUB1 PROC NEAR MOV AX,X MOV BX,Y MUL BX RET SUB1 ENDP SUB2 PROC NEAR …… RET SUB2 ENDP CODE ENDS END BEGIN 12.​ 有一个数据段定义了如下6个变量,请写出该数据段。 (1)BUF1为十进制数字节变量:64; (2)BUF2为字符串变量:‘Teacher’; (3)BUF3为十六进制数字节变量:2FH; (4)BUF4为双字变量:657AH; (5)BUF5为字变量:657AH; (6)BUF6为二进制数字节变量:10101101B。 DATA SEGMENT BUF1 DB 64 BUF2 DB ‘Teacher’ BUF3 DB 2FH BUF4 DD 657AH BUF5 DW 657AH BUF6 DB 10101101B 第5章 高级汇编技术 1.​ 何谓宏指令?宏指令在程序中如何被调用?宏指令定义和子程序有什么区别? 在编写程序过程中,若遇到一些要多次使用的程序段,为了简化程序,通常采用定义子程序的方法,同样,也可以采用宏定义的方法来达到这个目的。宏定义是源程序中一段有独立功能的程序代码。但必须先将这一段程序定义为一条宏指令,并具有一个相应的宏指令名,在程序中就可以多次调用它,调用时只需要引用一个宏指令名来代替这一段程序就可以了。 宏定义: 格式为:宏名 MACRO [形参表] ┇ (宏体) ENDM 子程序定义: 格式为:过程名 PROC [类型] ┇ (过程体) 过程名 ENDP 2.​ 结构数据类型如何说明?结构变量如何定义?结构字段如何引用? 定义结构的格式为: 结构名 STRUC [字段名] (数据类型定义语句) ┇ 结构名 ENDS 定义结构变量: 结构变量名 结构名 〈字段值表〉 引用结构变量的一般格式为: 结构变量名 引用结构变量的字段的一般格式为: 结构变量名﹒字段名 3.​ 试述宏指令与子程序的区别。 宏与子程序有本质的区别,主要反映在调用方式、传递参数和使用细节上。 子程序和宏定义都可以节省存储空间及程序设计所花的时间,可提供模块化程序设计的条件,便于程序的调试及修改等。但是在子程序结构中,为转子程序和返回、保存及恢复寄存器以及参数的传递等操作都要增加程序的开销,这些操作所消耗的时间以及它们所占用的存储空间,都是为取得子程序结构使程序模块化的优点而增加的额外开销。因此,在子程序本身较短或者是需要传递的参数较多的情况下使用宏汇编技术。 子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间,它不仅是源程序级别的简化,还是目标程序级的简化,形成的目标代码较短;而宏调用则是在汇编期间展开的,每调用一次就把宏定义体展开一次,它是源程序级的简化。因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间也越大。如果宏调用次数较多的话,则其空间上的开销也是应该考虑的因素。 宏调用的参数通过形参、实参结合实现传递,简洁直观、灵活多变。子程序需要利用寄存器、存储单元或堆栈等传递参数。对宏调用来说,参数传递错误通常是语法错误,会由汇编程序发现;而对子程序来说,参数传递错误通常反映为逻辑或运行错误,不易排除。 4.​ 用条件汇编实现:如果AL寄存器的值小于20,则对语句块1进行汇编,否则对语句块2进行汇编。 IF AL LT 20 语句块1 ELSE 语句块2 ENDIF 5.​ 记录数据类型如何说明?简述MASK和WIDTH运算符的功能。 <记录名> RECORD <字段名>:<宽度>[=<表达式>] [,<字段名>:<宽度>[=<表达式>]┅┅] 说明:记录定义时,记录名和字段名不能省略。字段的宽度是指相应字段占的二进制位数,且所有的字段宽度之和不能大于16。如宽度之和大于8位,该记录按字处理,否则按字节处理。表达式是给字段赋的初值。 MASK运算符返回一个8位或16位的二进制数,在这个数中,记录字段名所指定的字段的对应位为1,其他位为0。 WIDTH运算符返回记录长度或记录字段在记录中所占的二进制位数。 6.​ 定重复汇编与不定重复汇编有哪些区别? 定重复汇编使汇编程序对重复体作重复汇编,以整数表达式的值作为重复次数。 不定重复汇编使汇编程序对重复体作重复汇编,汇编时,依次将参数表中的参数取出代替形参,重复体部分的语句序列的重复次数由参数表中的参数个数决定。 7.​ 使用重复汇编结构,在内存建立起0~9的立方值表。 NUM1=0 REPT 10 NUM2=1 NUM2=NUM2*NUM1 DW NUM2*NUM1 NUM1=NUM1+1 ENDM 8.​ 可以实现条件汇编的伪指令有几条,简述这些伪指令之间的区别。 条件汇编伪指令及其功能如下 伪指令 功能 IF 表达式 如果汇编程序求出的表达式非0,条件为真 IFE 表达式 如果汇编程序求出的表达式等于0,条件为真 IFDEF 符号 如果符号在程序中有定义或被说明为EXTRN,条件为真 IFNDEF 符号 如果符号在程序中无定义或未被说明为EXTRN,条件为真 IFB <参数> 如果参数为空,条件为真 IFNB <参数> 如果参数不为空,条件为真 IFIDN <字符串1>,<字符串2> 如果字符串1和字符串2相同,条件为真 IFDIF <字符串1>,<字符串2> 如果字符串1和字符串2不相同,条件为真 IF1 如果是第一遍扫描,条件为真 IF2 如果是第二遍扫描,条件为真 9.​ 下面是用STRUC伪指令定义的参数表SUBLIST,请定义结构变量以实现此结构的存储区的分配。 SUBLIST STRUC MXLEN DB 60 ACLEN DB ? SUBIN DB 60 DUP(‘ ’) SUBLIST ENDS 结构变量定义如下: LIST1 SUBLIST < > 10.​ 编写宏定义DISPLAY,使其能在当前光标位置显示字符串,字符串的首地址由BX寄存器指出。 DISPLAY MACRO MOV DX,BX MOV AH,9 INT 21H ENDM 11.​ 编写宏定义SUM,其功能是将一组数据累加。数据存放的首地址在SI寄存器中,数据的个数在CL寄存器中。 SUM PROC SUMM MOV AX,0 LOP:ADD AX,[SI] INC SI DEC CL JNZ LOP ENDM 12.​ 定义20名教师的记录变量,通过输入数据得到教师的基本信息,然后统计年龄满40岁的男教师的人数。 DATA SEGMENT TEACHER RECORD NUM:4,SEX:1,AGE:6,MAJOR:5 ARRAY TEACHER 40 DUP (< >) COUNT DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV CH,40 MOV BX,OFFSET ARRAY NEXT: MOV AX,[BX] TEST AX,MASK SEX JZ NEXT1 MOV CL,AGE MOV DX,MASK AGE AND AX,DX SHR AX,CL CMP AL,40 JL NXET1 INC COUNT NEXT1:ADD BX,2 DEC CH JNE NEXT RET CODE ENDS END START 13.​ 编程实现如下功能:如果变量A=‘MA32’,则汇编MOV RESULT,0,否则汇编MOV RESULT,1。 IF A=‘MA32’ MOV RESULT,0 ELSE MOV RESULT,1 ENDIF 14.​ 定义一个能实现多个字节数据连减功能的宏,即(a -b -c -d - ┄)→RESULT,减数的个数存放在某内存单元中,最后结果RESULT存入另一内存单元中。 SUBM MACRO X,Y,Z MOV DI,OFFSET X MOV CX,[DI] MOV DI,OFFSET Y MOV AX,[DI] INC DI LOP:SUB AX,[DI] INC DI DEC CX JNZ LOP MOV DI,OFFSET Z MOV [DI],AX ENDM 第6章 汇编语言程序设计 1.​ 在8086/8088汇编语言中,如何实现过程的定义与调用。 子程序的定义是由过程定义伪指令来实现的,一个过程是一段程序,以PROC伪指令语句开始,以ENDP伪指令语句结束。格式如下: 过程名 PROC [NEAR或FAR] ┇ ┇ 过程体语句 RET 过程名 ENDP 子程序(过程)调用指令CALL的格式为: CALL OPRD 2.​ 在8086/8088汇编语言中,调用程序与子程序(过程)传递参数的方法有哪几种? (1)利用寄存器传递参数 这是最常用的一种方法,但受到寄存器个数的限制,一般用于参数较少的情况。在主程序中将要传递的参数放入到指定的寄存器中,然后在子程序中再从相应的寄存器获取参数。 (2)利用内存缓冲区传递参数 用存储器传递参数的最简单方法是定义位置、格式确定的缓冲存储区,凡是需要过程处理的参数,无论原来存在什么地方,必须按格式要求先传入缓冲区。过程从缓冲区取得数据进行规定的处理,产生的结果按格式要求存入这个或另外的缓冲存储区,调用程序(主程序)再从缓冲区取走结果。 (3)利用堆栈区传递参数 将子程序(过程)要用的参数放在堆栈区中,设置好指针(BP),子程序(过程)执行时从堆栈区取出参数,完成相应的功能。 3.​ 循环由哪几部分组成?循环的控制方法有哪几种? ​ 循环初始化部分。这是循环准备工作阶段,如建立地址指针、设置循环次数、必要的数据保护以及为循环体正常工作而建立的初始状态等。这一部分本身只执行一次。 ​ 循环体。即循环程序要完成的具体操作,是需要重复执行的程序段。它是循环的核心部分,没有循环体就不能构成循环。 ​ 循环控制部分。循环控制部分主要用来结束整个循环过程,根据循环所给定的条件,判别循环是否结束,完成对循环的控制。 ​ 循环控制修改部分。这一部分是为保证每一次循环时,参加执行的信息能发生有规律的变化而建立的程序段。循环控制主要是一些运算控制单元(变量、寄存器)的修改间距、修改操作数地址、修改循环计数器、改变变量的值等。 4.​ 为了编写具有良好风格的子程序,一般需要书写哪些重要的说明性信息? 为了正确和方便地使用子程序,在编制出子程序的同时必须给出子程序的说明信息,一般应该包含如下几个方面: ​ 子程序名。 ​ 功能:用尽量简明的文字描述子程序的功能。 ​ 入口参数:调用子程序前的准备工作。 ​ 出口参数:从子程序返回后可获得的结果。 5.​ 简述指令CALL和转移指令JMP之间的主要区别。 执行CALL指令时,首先把子程序的返回地址(CALL指令后面一条指令的地址,称为断点地址,即当前指令指针寄存器IP的内容)入栈保护,以便当返回主程序时,从下一条指令继续往下执行,然后把主程序的入口地址送入IP,无条件地转移到OPRD所指的目标地址去执行子程序。子程序执行结束后,断点地址从堆栈中弹回IP中,从而使程序返回到CALL语句的下一条语句继续执行程序。 JMP指令是无条件转移指令,无需保护断点,也不返回断点的功能,只是简单的转移。 6.​ 简述子程序嵌套与递归的区别。 一个子程序可以作为调用程序去调用另一个子程序,这种情况就称为子程序的嵌套。嵌套的层次不限,其层数称为嵌套深度。嵌套子程序的设计并没有什么特殊要求,除子程序的调用和返回应正确使用CALL和RET指令外,要注意寄存器的保存和恢复,以避免各层子程序之间发生因使用寄存器冲突而出错的情况。 在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这就称为递归调用。这样的子程序称为递归子程序。在子程序递归调用时,也不可避免地要用到堆栈,所以递归调用的嵌套层数往往会受堆栈容量的限制。 7.​ 在内存BUFFER单元中定义有10个16位数,试寻找其中的最大值及最小值,并放至指定的存储单元MAX和MIN中。画出程序流程图。 STACK SEGMENT STACK DW 256 DUP(?) STACK ENDS DATA SEGMENT BUFFER DW 56H,29H,10H,22H,09H,8FH,1AH,6DH,3DH,33H MAX DW ? MIN DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA START:MOV AX,DATA MOV DS,AX MOV BX,OFFSET BUFFER MOV CX,10 DEC CX MOV AX,[BX] INC BX LOP1:CMP AX,[BX] JG BIG MOV AX,[BX] BIG:INC BX LOOP LOP1 MOV MAX,AX JMP EXIT MOV BX,OFFSET BUFFER MOV CX,10 DEC CX MOV AX,[BX] INC BX LOP2:CMP AX,[BX] JL SMALL MOV AX,[BX] SMALL:INC BX LOOP LOP2 MOV MIN,AX EXIT:MOV AH,4CH INT 21H CODE ENDS END START 8.​ 统计字型变量DATBU
/
本文档为【汇编语言卜艳萍(第二版)习题答案】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索