微机原理与汇编语言程序设计课后习题参考答案

更新时间:2023-11-14 12:06:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章习题与参考答案

1. 微处理器,微型计算机和微型计算机系统三者之间有何区别?

答:微处理器即CPU,它包括运算器、控制器、寄存器阵列和内部总线等部分,用于实现微型计算机的运算和控制功能,是微型计算机的核心;一台微型计算机由微处理器、内存储器、I/O接口电路以及总线构成;微型计算机系统则包括硬件系统和软件系统两大部分,其中硬件系统又包括微型计算机和外围设备;由此可见,微处理器是微型计算机的重要组成部分,而微型计算机系统又主要由微型计算机作为其硬件构成。

2. CPU在内部结构上由哪几部分构成?CPU应具备哪些主要功能?

答:CPU在内部结构上由运算器、控制器、寄存器阵列和内部总线等各部分构成,其主要功能是完成各种算数及逻辑运算,并实现对整个微型计算机控制,为此,其内部又必须具备传递和暂存数据的功能。

3. 累加器和其它通用寄存器相比有何不同?

答:累加器是通用寄存器之一,但累加器和其它通用寄存器相比又有其独特之处。累加器除了可用做通用寄存器存放数据外,对某些操作,一般操作前累加器用于存放一个操作数,操作后,累加器用于存放结果。

4. 微型计算机的总线有哪几类?总线结构的特点是什么?

答:微型计算机的总线包括地址总线、数据总线和控制总线三类,总线结构的特点是结构简单、可靠性高、易于设计生产和维护,更主要的是便于扩充。 5. 举出10个微型计算机应用的例子。 答:略

6. 计算机I/O接口有何用途?试列出8个I/O接口。 答:计算机I/O接口是连接计算机和外部设备的纽带和桥梁,它主要用于协调和控制计算机与外设之间的信息流通和交换。例如:串行通讯口(COM口)、并行打印机口、软盘驱动器接口、硬盘驱动器接口、光驱接口、显示器接口、音响设备接口、其它通用设备接口(USB、SCSI等)。

7. 现在,计算机主板上一般都包括哪些I/O接口?I/O接口卡如何与主板相连?

答:现在,计算机主板上一般包括串行通讯口、并行打印口、软盘驱动器接口、硬盘驱动器接口、光驱接口、USB接口等。象显示器适配器、网卡、modem卡等I/O接口卡一般通过总线插槽与主板相连。

8. 简述系统总线,AGP总线,PCI总线及ISA总线的作用。

答:系统总线是CPU与存储器及桥接器之间传递信息的通道,AGP总线专门用与连接CPU与显示器适配器,PCI总线一般用于连接一些高速外设接口作为高速外设与CPU或内存交换信息的通道,而ISA总线一般用于连接一些非高速外设接口作为非高速外设与CPU或内存交换信息的通道。

9. 试说明计算机用户,计算机软件,计算机硬件三者的相互关系。

答:计算机用户,计算机软件系统,计算机硬件系统共同构成一个计算机应用系统,三者在该系统中处于三个不同的层次。计算机用户处于最高层,计算机软件处于中间层,计算机硬件系统处于最下层。在这里计算机用户是系统的主宰,他们通过软件系统与硬件系统发生关系,指挥计算机硬件完成指定的任务。即,计算机用户使用程序设计语言编制应用程序,在系统软件的干预下使用硬件系统进行工作。

10. 简述DOS操作系统各部分的作用及相互关系。

答:DOS操作系统包括3个模块:DOS-Shell(COMMAND.COM)、DOS-Kernel(IBMDOS.COM)、DOS-BIOS(IBMBIO.COM).

DOS-Shell模块对用户输入的DOS命令行或应用程序行作出响应。即负责DOS命令的解释和

任务的分配,具体工作则要靠DOS-Kernel模块所提供的系统功能完成。

DOS-Kernel模块尽管提供了许多的系统功能,但由于执行每一个系统功能过程中,完全依赖各种设备实现指定的功能,因此,它还要进一步调用DOS-BIOS模块中的设备驱动程序才能工作。

DOS-BIOS模块对DOS-Kernel传送的\请求\进行解释,最终转换为对固化在ROM-BIOS中的设备控制程序的请求并由它们去控制硬件,完成指定的操作。 11. 存储单元的选择由什么信号控制?读、写靠什么信号区分?

答:存储单元的选择由地址信号控制,而对存储单元进行读操作还是写操作则要靠读、写信号区分。

12. 以一个可执行文件的运行为例,简述程序执行过程。

答:当在DOS提示符下键入一个可执行文件名称(或在其它操作系统环境下执行有关操作)后,操作系统自动将该文件从外存装入内存并使指令指针指向其第一条指令,从而启动文件执行过程。首先将第一条指令从内存取入CPU中译码执行,同时指令指针自动加1或按指令的要求作出相应改变,指向下一条要执行的指令,接着将下一条指令从内存取入CPU译码执行,这样不断重复取指令和执行指令的过程,逐条执行指令,直至程序结束。 第二章习题与参考答案 第一节

1.把下列各数化成二进制数和八进制数(二进制取3位小数,八进制取一位小数): 7+3/4,±3/64,73.5, 725.9375,25.34

答:7+3/4=111.110B; 7+3/4=7.6O; ±3/64=±0.000B; ±3/64=±0.0O; 73.5=1001001.100B; 73.5=111.4O;

725.9375=1011010101.111B; 725.9375=1325.7O; 25.34=11001.011B; 25.34=31.3O 2.把下列各数化成十进制数:101.10011B ,22.2O, AD.4H 答:101.10011B=5.59375; 22.2O=18.25; AD.4H=173.25

3.完成下列二进制数运算:101.111+11.011,1001.10-110.01,101.11*11.01, 101110111/1101

答:101.111+11.011=1001.01; 1001.10-110.01=11.01;

101.11*11.01=10010.1011; 101110111/1101=11100.11

4.完成下列各十六进制数的运算: A39E+28DC,D5AB-7CE5,2BF*4C,C16E/3A 答:A39E+28DC=CC7A; D5AB-7CE5=58C6; 2BF*4C=D014; C16E/3A=355.C2

5.先将15B*8E/2A中的十六进制数化成十进制数,再进行计算,最后再将结果化为十六进制数。

答:15BH*8EH/2AH=347*142/42=49274/42=1173.19=495.30AH 6.试分别判断下列各组数据中哪个数据最大?哪个数据最小? (1) A=0.1001B,B=0.1001D,C=0.1001H (2) A=10111101B,B=1001D,C=111H

答:(1) A最大, C最小; (2) B最大, A最小; 第二节

1.写出下列各数的二进制原码和补码(最后两个用双字节): 0,96,-128,-38H,127,105,879H,-32768

答:上述各数的原码依次为:00000000(10000000), 01100000, 无, 10111000, 01111111, 01101001, 0000100001111001, 无; 上述各数的补码依次为:00000000, 01100000, 10000000, 11001000, 01111111, 01101001, 0000100001111001, 1000000000000000;

2.分别列出下述10进制数的16进制数、非压缩的BCD数、压缩的BCD数、ASCII数字串(用16进制形式写出):10, 64, 78, 81, 92, 100, 125, 255

答:上述各数的16进制数依次为:AH,40H,4EH,51H,5CH,64H,7DH,FFH;

上述各数的非压缩的BCD数依次为:0100H,0604H,0708H,0801H,0902H,010000H, 010205H,020505H;

上述各数的压缩的BCD数依次为:10H,64H,78H,81H,92H,0100H,0125H,0255H;

上述各数的ASCII数字串依次为:3130H,3634H,3738H,3831H,3932H,313030H,313235H, 323535H;

3.用10进制数写出下列补码表示的机器数的真值:71H,1BH,80H,F8H,397DH,CF42H,9350H

答:上述补码表示的各机器数的真值用10进制数分别表示为:

+113,+27,-128,-8,+14717,-20670,-27828

4.若用一个字节来表示带符号数,判断下列各运算在机内进行时是否会产生溢出,写出判断过程。

A. 5BH+32H; B. -08H-15H; C. -51H+(-3DH); D. 2DH+3CH 答:A. 产生溢出, 5BH=01011011B其补码表示的机器数为:01011011 32H=00110010B其补码表示的机器数为:00110010 相加的结果为:10001101

数值最高位向符号位进位,但符号位向前无进位,故产生溢出。 B. 不产生溢出, -08H=-00001000B其补码表示的机器数为:11111000 -15H=-00010101B其补码表示的机器数为:11101011 相加的结果为:111100011 数值最高位向符号位进位,符号位同时也向前进位,故不产生溢出. C.产生溢出,-51H=-01010001B其补码表示的机器数为:10101111 -3DH=-00111101B其补码表示的机器数为:11000011 相加的结果为:101110010 数值最高位向符号位无进位,但符号位向前进位,故产生溢出. D.不产生溢出,2DH=00101101B其补码表示的机器数为:00101101 3CH=00111100B其补码表示的机器数为:00111100 相加的结果为:01101001 数值最高位向符号位无进位,符号位向前也无进位,故不产生溢出。

5.从键盘敲入一个大写字母,如何转换为与其相对应的小写字母?从键盘敲入16进制数字符0~F,如何转换为其相对应的二进制数(00000000~00001111)?

答:从键盘敲入一大写字母后,将其ASCII码加上20H,就转换成了与其相对应的小写字母。 从键盘敲入16进制数字符0~9后,将其ASCII码值减去30H,就转换成了与其相对应的二进制数.

从键盘敲入16进制数字符A~F后,将其ASCII码值减去37H,就转换成了与其相对应的二进制数.

6.已知A=37、B=28,若A、B均以压缩的BCD码、非压缩的BCD码或ASCII码表示,分别写出三种情况下A+B的运算过程。注:A、B的各位以ASCII码表示时,运算结果的各位用非压缩的BCD码表示。 答:6.(1) A=37以压缩的BCD码表示为:00110111,B=28以压缩的BCD码表示为:00101000,A+B的运算为:

00110111

+ 00101000 01011111 + 00000110 01100101

(2) A=37以非压缩的BCD码表示为:0000001100000111, B=28以非压缩的BCD码表示为:0000001000001000, A+B的运算为:

0000001100000111 + 0000001000001000 0000010100001111 + 0000000011110110 0000011000000101 (3) A=37以ASCII码表示为:0011001100110111,B=28以ASCII码表示为:0011001000111000,A+B的运算为:

0000001100000111 先将各字节高4位清0 + 0000001000001000 0000010100001111 + 1111000011110110

1111011000000101 各字节高4位清0 0000011000000101

7.如果采用偶校验,下述两个数据的校验位的值是什么? 如果采用奇校验呢? (1)0101010 (2)0011011

答:采用偶校验时,数据0101010的校验位的值是1,数据0011011的校验位的值是0; 采用奇校验时,数据0101010的校验位的值是0,数据0011011的校验位的值是1; 第三节

###

1. 已知一个逻辑函F=A+BC+CD+BD,试写出其真值表。 答:其真值表为:

A 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 B 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 C 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 D 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 F 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 2.用公式法将下列逻辑函数化简为最简\与或\式:

##

(1) F=AB+AC+(BC)

####

(2) F=AB+(AB+AB+AB)C

###########

答:(1)F=AB+AC+B+C=AB+B+AC+C=A+B+A+C=1+B+C=1

################

(2)F=AB+(A(B+B)+AB)C=AB+(A+AB)C=AB+(A+B)C=AB+(AB)C=AB+C

3.现约定采用奇校验方法,且用每个字节的最高位做为该字节的校验位,试设计一个逻辑电路,传输前产生校验位,接收后进行校验。 答:与本节中给出的偶校验电路相比区别如下:(1)将校验位生成电路的最末级异或门改为同或门;(2)接收端校验电路相同,不过输出F为1时,可认为传输“无误”,输出F为0时,表示传输有误。 第四节

1.试述同步式R-S触发器与异步式R-S触发器的主要区别。

答:异步式R-S触发器时刻处于工作状态,只要输入端数据发生变化,马上可对输出端产生影响。而同步式R-S触发器是在异步式R-S触发器上增加了编人员构成的,只有在控制端C有效时才工作,此时其功能与异步式R-S触发器完全相同,而当控制端C无效时,触发器不工作。

2.边沿触发的触发器与电平触发的触发器相比优点是什么?

答:由于电平的维持时间相对较长,在打入一个有效数据后,若有效电平尚未消失时,数据端发生了变化,则有可能将这个不该打入的数据打入,造成错误。而对边沿触发型触发器,只要保证有效数据在电平变化的边沿处(瞬间)不变化,即可正确打入有效数据。 3.试述时序电路(如触发器)和组合逻辑电路(如译码器)的区别。

答:组合逻辑电路的输出只依赖于当前的输入,即输出是输入的一个逻辑函数。而时序电路的输出不仅依赖于当前的输入,而且还依赖于该电路的当前状态,即其输出(次态)是输入和现态度的一个逻辑函数。

4.画出一个2-4译码器的逻辑电路图。 答:图略

5.画出串行加法器的逻辑电路图。

答:说明:在讲义图2-23(串行加法器的电路原理图)中的两个寄存器位置放上图2-12中的并行输入移位寄存器简化电路,并做出正确连接。 6.详细叙述总线缓冲器的作用。 答:总线缓冲器的作用主要是控制各路数据在总线上的交叉传送避免相互冲突,当几路数据都要向总线上传送时,就通过各路的缓冲器来解决,当一路传送时,缓冲器使其它各路数据与总线断开。

7.锁存器和寄存器有什么不同?

答:锁存器与寄存器都是用来暂存数据的器件,在本质上没有区别,不过寄存器的输出端平时不随输入端的变化而变化,只有在时钟有效时才将输入端的数据送输出端(打入寄存器),而锁存器的输出端平时总随输入端变化而变化,只有当锁存器信号到达时,才将输出端的状态锁存起来,使其不再随输入端的变化而变化。 第三章习题与参考答案

1.8086从功能上分成了EU和BIU两部分。这样设计的优点是什么?

答:传统计算机在执行程序时,CPU总是相继地完成取指令和执行指令的动作,即,指令的提取和执行是串行进行的。而8086CPU 在功能上分成了EU和BIU两部分,BIU负责取指令,EU负责指令的执行,它们之间既互相独立又互相配合,使得8086可以在执行指令的同时进行取指令的操作,即实现了取指令和执行指令的并行工作,大大提高了CPU和总线的利用率,从而提高了指令的处理速度。

2.8086 CPU中地址加法器的重要性体现在哪里?

答:地址加法器是8086 CPU的总线接口单元中的一个器件,在8086存储器分段组织方式中它是实现存储器寻址的一个关键器件,地址加法器将两个16位寄存器中的逻辑地址移位相加,得到一个20位的实际地址,把存储器寻址空间从64K扩大到1M,极大地扩大了微型计算机的程序存储空间,从而大大提高了程序运行效率。 3.8086 CPU中有哪些寄存器?分组说明用途。哪些寄存器用来指示存储器单元的偏移地址? 答:8086 CPU中有8个通用寄存器AX、BX、CX、DX、SP、BP、SI、DI;两个控制寄存器IP、FL;四个段寄存器CS、DS、SS、ES。8个通用寄存器都可以用来暂存参加运算的数据或中间结果,但又有各自的专门用途。例如,AX专用做累加器,某些指令指定用它存放操作数和运算结果;CX为计数寄存器,在某些指令中做计数器使用;DX为数据寄存器;BX为基址

寄存器,BP为基址指针,SI为源变址寄存器,DI为目的变址寄存器,这4个寄存器在数据寻址中用来存放段内偏移地址(有效地址)或段内偏移地址的一部分;SP为堆栈指示器,用来存放栈顶有效地址。两个控制寄存器用来存放有关的状态信息和控制信息。例如,标志寄存器FL用来存放状态标志和控制标志;而指令指针用来存放下一条要取指令的有效地址。四个段寄存器用来存放段地址。例如,CS寄存器用来存放代码段的段地址;DS寄存器用来存放数据段的段地址;SS寄存器用来存放堆栈段的段地址;ES寄存器用来存放扩展段的段地址。

4.8086系统中存储器的逻辑地址由哪两部分组成?物理地址由何器件生成?如何生成?每个段的逻辑地址与寄存器之间有何对应关系?

答:8086系统中存储器的逻辑地址由段地址(段首址)和段内偏移地址(有效地址)两部分组成;存储单元的物理地址由地址加法器生成,寻址时,CPU首先将段地址和段内偏移地址送入地址加法器,地址加法器将段地址左移4位并与段内偏移地址相加,得到一个20位的物理地址。数据段的段地址在DS寄存器中,段内偏移地址可能在BX、BP、SI或DI寄存器中。代码段的段地址在CS寄存器中,段内偏移地址在IP寄存器中。堆栈段的段地址在SS寄存器中,段内偏移地址在SP寄存器中。扩展段的段地址在ES寄存器中,段内偏移地址可能在BX、BP、SI或DI寄存器中。

5.设CPU中各有关寄存器的当前状况为:SS=0a8bH、DS=17ceH、CS=dc54H、BX=394bH、IP=2f39H、SP=1200H,BX 给出的是某操作数的有效地址,请分别写出该操作数、下一条要取的指令及当前栈顶的逻辑地址和物理地址。

答:该操作数的逻辑地址为DS:BX=17CE:394BH,物理地址=17CEH*10H+394BH=1B62BH;下一条要取的指令的逻辑地址为CS:IP=DC54:2F39H,物理地址=DC54H*10H+2F39H=DF479H;当前栈顶的逻辑地址=SS:SP=0A8B:1200H,物理地址=0A8BH*10H+1200H=0BAB0H。

6.若DS=157DH时,某操作数的物理地址是215FAH,当DS=18DEH时,该操作数的物理地址是多少?

答:该操作数的段内偏移地址=该操作数的物理地址-DS=215FAH-157D0H=BE2AH, 故当DS=18DEH时,该操作数的物理地址=DS*10H+BE2AH=18DE0H+BE2AH=24C0AH 7.设 AX=2875H、BX=34DFH、SS=1307H、SP=8H,依此执行 PUSH AX、PUSH BX、POP AX、POP CX后栈顶指针变为多少?AX=? BX=? CX=?

答:当前栈顶指针=SS*10H+SP=13070H+8H=13078H, 依此执行PUSH AX、PUSH BX、POP AX、POP CX后栈顶指针仍为13078H。但AX=34DFH,BX=34DFH,CX=2875H。 第四章习题与参考答案 1. 假定(BX)=637DH,(SI)=2A9BH,位移量D=3237H,试确定在以下各种寻址方式下的有效地址是什么? (1)立即寻址 (2)直接寻址

(3)使用BX的寄存器寻址 (4)使用BX的间接寻址

(5)使用BX的寄存器相对寻址 (6)基址变址寻址

(7)相对基址变址寻址 答:(1)立即数寻址的有效地址是当前IP的内容;

(2)直接寻址,若使用位移量D=3237H进行,则有效地址为3237H;

(3)使用BX的寄存器寻址时,操作数在BX寄存器中,因此无有效地址; (4)使用BX的间接寻址时,有效地址在BX寄存器中,即有效地址=637DH;

(5)使用BX的寄存器相对寻址的有效地址=(BX)+D=637DH+3237H=95B4H; (6)基址变址寻址的有效地址=(BX)+(SI)=637DH+2A9BH=8E18H; (7)相对基址变址寻址的有效地址=(BX)+(SI)+D=C050H;

2. 写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。要求使用以下几种寻址方式:

(1)寄存器间接寻址 (2)寄存器相对寻址 (3)基址变址寻址 答:(1)使用寄存器间接寻址,把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令为:

MOV BX,BLOCK ADD BX,12 MOV DX,[BX] (2)使用寄存器相对寻址,把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令为: MOV BX,BLOCK MOV DX,[BX+12]

(3)使用基址变址寻址,把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令为: MOV BX,BLOCK MOV SI,12

MOV DX,[BX+SI]

3. 现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,试说明下列各条指令执行完后AX寄存器的内容。 (1)MOV AX,1200H (2)MOV AX,BX

(3)MOV AX,[1200H] (4)MOV AX,[BX]

(5)MOV AX,[BX+1100] (6)MOV AX,[BX+SI]

(7)MOV AX,[BX+SI+1100] 答:(1)指令MOV AX,1200H执行完后AX寄存器的内容为1200H; (2)指令MOV AX,BX执行完后AX寄存器的内容为0100H;

(3)指令MOV AX,[1200H]是将从物理地址=(DS)*10H+1200H=21200H开始的两个单元内容送AX,执行完后AX寄存器的内容为4C2AH;

(4)指令MOV AX,[BX]是将从物理地址=(DS)*10H+(BX)=20100H开始的两个单元内容送AX,故执行完后AX寄存器的内容为3412H;

(5)指令MOV AX,[BX+1100]是将从物理地址=(DS)*10H+(BX)+1100H=21200H开始的两个单元内容送AX,故执行完后AX寄存器的内容为4C2AH;

(6)指令MOV AX,[BX+SI]是将从物理地址=(DS)*10H+(BX)+(SI)=20102H开始的两个单元内容送AX,故执行完后AX寄存器的内容为7856H; (7)指令MOV AX,[BX+SI+1100]是将从物理地址=(DS)*10H+(BX)+(SI)+1100H=21202H开始的两个单元内容送AX,故执行完后AX寄存器的内容为65B7H;

4.假设已知(DS)=2900H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)= 0100H,(BP)=0010H,数据段中变量名VAL的偏移地址值为0050H,试指出下列源操作数字段的寻址方式是什么?

其物理地址值是多少?

(1) MOV AX,0ABH (2) MOV AX,BX (3) MOV AX,[100H] (4) MOV AX,VAL

(5) MOV AX,[BX] (6) MOV AX,ES:[BX] (7) MOV AX,[BP] (8) MOV AX,[SI]

(9) MOV AX,[BX+10] (10) MOV AX,VAL[BX] (11) MOV AX,[BX][SI] (12) MOV AX,[BP][SI] 答:(1)在指令 MOV AX,0ABH 中,源操作数字段的寻址方式是立即数寻址,其物理地址值=(CS)*10H+(IP);

(2)在指令 MOV AX,BX 中,源操作数字段的寻址方式是寄存器寻址,操作数在BX中,无物理地址;

(3)在指令 MOV AX,[100H] 中,源操作数字段的寻址方式是直接寻址,其物理地址值=(DS)*10H+100 =29000H+100H=29100; (4)在指令 MOV AX,VAL 中,源操作数字段的寻址方式是直接寻址,其物理地址值=(DS)*10H+50H =29000H+50H=29050H;

(5)在指令 MOV AX,[BX] 中,源操作数字段的寻址方式是寄存器间接寻址,其物理地址值=(DS)*10H +(BX)=29000H+100H=29100H;

(6)在指令 MOV AX,ES:[BX] 中,源操作数字段的寻址方式是寄存器间接寻址,其物理地址值=(ES)*10H+(BX)=21000H+100H=21100H;

(7)在指令 MOV AX,[BP] 中,源操作数字段的寻址方式是寄存器间接寻址,其物理地址值=(SS)*10H +(BP)=15000H+10H=15010H;

(8)在指令 MOV AX,[SI] 中,源操作数字段的寻址方式是寄存器间接寻址,其物理地址值=(DS)*10H +(SI)=29000H+0A0H=290A0H; (9)在指令 MOV AX,[BX+10] 中,源操作数字段的寻址方式是寄存器相对寻址,其物理地址值=(DS)*10H+(BX)+0AH= 29000H+100H+0AH =2910AH;

(10)在指令 MOV AX,VAL[BX] 中,源操作数字段的寻址方式是寄存器相对寻址,其物理地址值=(DS)*10H+(BX)+50H= 29000H+100H+50H= 29150H; (11)在指令 MOV AX,[BX][SI] 中,源操作数字段的寻址方式是基址变址寻址,其物理地址值=(DS)*10H+(BX)+(SI) =29000H+100H+0A0H =291A0H; (12)在指令 MOV AX,[BP][SI] 中,源操作数字段的寻址方式是基址变址寻址,其物理地址值=(SS)*10H+(BP)+(SI)=15000H+10H+0A0H =150B0H 5.分别指出下列指令中的源操作数和目的操作数的寻址方式。 (1)MOV SI,200

(2)MOV CX,DATA[SI] (3)ADD AX,[BX+DI] (4)AND AX,BX (5)MOV [SI],AX (6)PUSHF 答:(1)目的操作数字段的寻址方式是寄存器寻址,源操作数字段的寻址方式是立即数寻址; (2)目的操作数的寻址方式是寄存器寻址,源操作数的寻址方式是寄存器相对寻址; (3)目的操作数的寻址方式是寄存器寻址,源操作数的寻址方式是基址变址寻址; (4)目的操作数的寻址方式是寄存器寻址,源操作数的寻址方式也是寄存器寻址; (5)目的操作数的寻址方式是寄存器间接寻址,源操作数的寻址方式是寄存器寻址; (6)目的操作数的寻址方式是寄存器间接寻址,源操作数的寻址方式是寄存器寻址;

6.试述指令MOV AX,2010H和MOV AX,DS:[2010H] 的区别。

答:指令MOV AX,2010H是将立即数2010H送AX寄存器,而指令MOV AX,DS:[2010H]是将DS段有效地址为2010H的两个单元的内容送AX。 7.写出以下指令中内存操作数的所在地址。 (1)MOV AL,[BX+5] (2)MOV [BP+5],AX

(3)INC BYTE PTR [SI+3] (4)MOV DL,ES:[BX+DI] (5)MOV BX,[BX+SI+2] 答:(1)指令MOV AL,[BX+5]中内存操作数的所在地址=(DS)*10H+(BX)+5; (2)指令MOV [BP+5],AX中内存操作数的所在地址=(SS)*10H+(BP)+5和(SS)*10H+(BP)+6;

(3)指令INC BYTE PTR[SI+3]中内存操作数的所在地址=(DS)+(SI)+3;

(4)指令MOV DL,ES:[BX+DI]中内存操作数的所在地址=(ES)*10H+(BX)+(DI); (5)指令MOV BX,[BX+SI+2]中内存操作数的所在地址=(DS)*10H+(BX)+(SI)+2和(DS)*10H+(BX)+(SI)+3;

8.判断下列指令书写是否正确,如有错误,指出错在何处并用正确的程序段(一条或多条指令)实现原错误指令((8)、(13)除外)期望实现的操作。 (1)MOV AL,BX (9)MOV ES,3278H (2)MOV AL,SL (10)PUSH AL (3)INC [BX] (11)POP [BX]

(4)MOV 5,AL (12)MOV [1A8H],23DH (5)MOV [BX],[SI] (13)PUSH IP

(6)MOV BL,F5H (14)MOV [AX],23DH (7)MOV DX,2000H (15)SHL AX,5 (8)POP CS (16)MUL AX,BX 答:(1)MOV AL,BX 错,源操作数为字类型,目的操作数为字节类型,二者不一致。应改为:MOV AX,BX 或 MOV AL,BL ;

(2)MOV AL,SL 错,SI寄存器不能分为高8位和低8位使用,即没有SL寄存器。应改为:MOV AX,SI

(3)INC [BX] 错,未指定操作数的类型。应改为:INC BYTE PTR [BX] (4)MOV 5,AL 错,目的操作数使用了立即数,在指令中一般不允许。应改为:MOV DS:[5],AL (5)MOV [BX],[SI] 错,源操作数和目的操作数均为内存单元,不允许。 应改为:MOV AX,[SI]

MOV [BX],AX

(6)MOV BL,F5H 错,源操作数错,以A~F开头的数字前应加0。应改为:MOV BL,0F5H (7)MOV DX,2000H 正确。

(8) POP CS 错,不能将栈顶数据弹至CS中。

(9)MOV ES,3278H 错,立即数不能直接送ES寄存器。应改为:MOV AX,3278H

MOV ES,AX

(10)PUSH AL 错,栈操作不能按字节进行。应改为:PUSH AX (11)POP [BX] 正确。 (12)MOV [1A8H],23DH 错,源操作数是立即数,目的操作数必须使用寄存器指出。应改为: MOV BX,1A8H

MOV [BX],23DH

(13)PUSH IP 错,不能用IP寄存器做源操作数。

(14)MOV [AX],23DH 错,不能用AX寄存器间接寻址。应改为:MOV BX,AX MOV [BX],23DH (15)SHL AX,5 错,不能用大于己于1的立即数指出移位位数。应改为:

MOV CL,5 SHL AX,CL

(16)MUL AX,BX 错,目的操作数AX是隐含的,不能在指令中写出。应改为:MUL BX 9.设堆栈指针SP的初值为2000H,AX=3000H,BX=5000H,试问: (1)执行指令PUSH AX后 (SP)=?

(2)再执行PUSH BX及POP AX后 (SP)=?(AX)=?(BX)=? 答:(1)执行指令PUSH AX后 (SP)=2000H-2=1FFEH;

(2)再执行PUSH BX及POP AX后 (SP)=1FFEH, (AX)=5000H, (BX)=5000H

10.要想完成把[2000H]送[1000H]中,用指令:MOV [1000H],[2000H]是否正确?如果不正确,应用什么方法? 答:把[2000H]送[1000H]中,用指令 MOV [1000H],[2000H]不正确,应改为:MOV AX,[2000H]

MOV [1000H],AX

11.假如想从200中减去AL中的内容,用SUB 200,AL是否正确?如果不正确,应用什么方法?

答:想从200中减去AL中的内容,用SUB 200,AL不正确,应改为: MOV BL,200

SUB BL,AL

12分别写出实现如下功能的程序段

(1)双字减法(被减数7B1D2A79H,减数53E2345FH)。 (2)使用移位指令实现一个字乘18的运算。 (3)使用移位指令实现一个字除以10的运算。

(4)将AX中间8位,BX低四位,DX高四位拼成一个新字。

(5)将数据段中以BX为偏移地址的连续四个单元的内容颠倒过来

(6)将BX中的四位压缩BCD数用非压缩BCD数形式顺序放在AL、BL、CL、DL中。 答:(1)双字减法的程序段是:

MOV AX,2A79H ;被减数的低位字送AX SUB AX,345FH ;低位字相减,结果送AX MOV BX,7B1DH ;被减数的高位字送BX

SBB BX,53E2H ;高位字相减处并减去低位字相减产生的借位,结果送BX (2)使用移位指令实现一个字乘18的程序段是: MOV AX,05F7H ;被乘数送AX

SHL AX,1 ;被乘数乘以2,结果在AX中 MOV BX,AX ;被乘数乘以2的结果暂存到BX MOV CL,3 ;设置移位位数3

SHL AX,CL ;被乘数再乘以8(共乘以16),结果在AX中 ADD AX,BX ;被乘数再乘以18,结果在AX中

(3)使用移位指令实现一个字除以10的运算,必须将X/10拆分成多项的和,而每一项都应是非的某次幂的倒数。利用等比级数的前N项和公式,可求出A0=X/8,公比Q=-1/4,故X/10=X/8-X/32+X/128-X/512+..., 所求的程序段是:

MOV AX,FE00H ;被除数送AX MOV CL,3 ;设置移位位数3

SHR AX,CL ;被乘数除以8,结果在AX中 MOV BX,AX ;被乘数除以8的结果暂存到BX MOV CL,2 ;设置移位位数2

SHR AX,CL ;被乘数除以4(累计除32),结果在AX中 SUB BX,AX ;被除数/8-被除数/32,结果在BX中 MOV CL,2 ;设置移位位数2

SHR AX,CL ;被乘数除以4(累计除128),结果在AX中

ADD BX,AX ;被除数/8-被除数/32+被除数/128,结果在BX中 MOV CL,2 ;设置移位位数2

SHR AX,CL ;被乘数除以4(累计除512),结果在AX中

SUB BX,AX ;被除数/8-被除数/32+被除数/128-被除数/512,结果在BX中 (4) 将AX中间8位,BX低四位,DX高四位拼成一个新字的程序段是: AND DX,0F000H ;将DX的低12位清零,高4位不变

AND AX,0FF0H ;将AX的低4位清零,高4位清零,中间8位不变 AND BX,0FH ;将BX的高12位清零,低4位不变 ADD AX,BX

ADD AX,DX ;按要求组成一个新字,结果放在AX中。

(5) 将数据段中以BX为偏移地址的连续四个单元的内容颠倒过来的程序段是: MOV AL,[BX] ;数据段中BX为偏移地址的字单元内容送AX

XCHG AL,[BX+3] ;数据段中BX+3为偏移地址的字单元内容与AX的内容交换

MOV [BX],AL ;数据段中BX+3为偏移地址的字单元内容送BX为偏移地址的字单元 MOV AL,[BX+1] ;数据段中BX+1为偏移地址的字单元内容送AX

XCHG AL,[BX+2] ;数据段中BX+2为偏移地址的字单元内容与AX的内容交换

MOV [BX+1],AL ;数据段中BX+2为偏移地址的字单元内容送BX+1为偏移地址的字单元 (6)将BX中的四位压缩BCD数用非压缩BCD数形式顺序放在AL、BL、CL、DL中的程序段是: MOV DL,BL ;四位压缩BCD数的低位字节送DL

AND DL,0FH ;DL的高4位清零,得四位非压缩BCD数的最低位,放入DL中 MOV CL,4 ;设置移位位数4

SHR BX,CL ;BX中的数据逻辑右移4位,使四位压缩BCD数的次低位位于BL的低4位 MOV CH,BL ;将BL的内容暂存到CH中保留

AND CH,0FH ;CH的高4位清零,得四位非压缩BCD数的次低位,放CH中 MOV CL,4 ;设置移位位数4

SHR BX,CL ;BX中的数据逻辑右移4位,使四位压缩BCD数的次高位位于BL的低4位 MOV AL,BL ;将BL的内容暂存到AL中保留

AND BL,0FH ;BL的高4位清零,得四位非压缩BCD数的次高位,放BL中 MOV CL,4 ;设置移位位数4 SHR AL,CL ;使四位压缩BCD数的最高位位于AL的低4位,得四位非压缩BCD数的次高

;位,放入BL中

MOV CL,CH ;将四位非压缩BCD数的次低位移入CL中 第六章习题与参考答案

1.假设OP1,OP2是已经用DB定义的变量, W_OP3和W_OP4是已经用DW定义的变量,判断下列指令书写是否正确?如有错误,指出错在何处?并写出正确的指令(或程序段)实现原错

误指令期望实现的操作((19)、(20)不改)。 (1)PUSH OP1 (2)POP [W_OP4]

(3)MOV AX, WORD PTR [SI][DI] (4)MOV AX,WORD PTR ES:BX (5)MOV BYTE PTR [BX], 1000 (6)MOV BX, OFFSET [SI+200H] (7)MOV OP2,[BX]

(8)CMP HIGH W_OP3, 25 (9)CMP OP1, OP2 (10)CMP AX, OP2

(11)MOV W_OP3[BX+4*3][DI], SP (12)ADD W_OP3, W_OP4 (13)MOV AX, W_OP3[DX] (14)MOV OP1, LOW DS

(15)MOV SP, OP2[BX][SI] (16)MOV AX, W_OP3+W_OP4 (17)MOV AX,W_OP3-W_OP4+100 (18)SUB AL, W_OP3+7 (19)MOV AX,BX SHL 2

(20)MOV BX,W_OP3 AND 8FD7H

答:1. (1)PUSH OP1 错,OP1为字节类型,栈操作不能按字节进行,应改为:PUSH WORD PTR OP1 (2)POP [W_OP4] 正确。

(3)MOV AX, WORD PTR [SI][DI] 错,源操作数寻址方式有问题。 应改为: MOV BX, SI

MOV AX, WORD PTR [BX][DI]

(4)MOV AX,WORD PTR ES:BX错,若源操作数为寄存器寻址是不能加段说明及属性修改的。

显然,原意应为寄存器间接寻址,故应改为: MOV AX,WORD PTR ES:[BX]

(5)MOV BYTE PTR [BX], 1000 错,源操作数为字类型,目的操作数为字节类型,二者不一

致。应改为: MOV WORD PTR [BX], 1000 (6)MOV BX, OFFSET [SI+200H] 错,OFFSET运算应在汇编时完成,但[SI+200H]在执行指令时才可获得。应改为: LEA BX,[SI+200H] (7)MOV OP2,[BX] 错,源操作数和目的操作数均为内存单元,不允许。

应改为: MOV AL, [BX]

MOV OP2, AL

(8)CMP HIGH W_OP3, 25错,目的操作数中使用HIGH来分离存储器操作数,这是不允许的。

应改为: CMP BYTE PTR W_OP3+1,25

(9)CMP OP1, OP2错,源操作数和目的操作数均为内存单元,不允许。

应改为: MOV AL, OP2 CMP AL, OP1

(10)CMP AX, OP2错,源操作数为字节类型,目的操作数为字类型,二者不一致。

应改为: CMP AX, WORD PTR OP2 (11)MOV W_OP3[BX+4*3][DI], SP正确。

(12)ADD W_OP3, W_OP4错,源操作数和目的操作数均为内存单元,不允许。

应改为: MOV AX, W_OP4 ADD W_OP3, AX

(13)MOV AX, W_OP3[DX] 错,不能用DX寄存器间接寻址。应改为: MOV BX, DX

MOV AX, W_OP3[BX] (14)MOV OP1, LOW DS错,源操作数中使用LOW来分离寄存器操作数,这是不允许的。

应改为: MOV WORD PTR OP1,DS

(15)MOV SP, OP2[BX][SI] 错,源操作数为字节类型,目的操作数为字类型,二者不一致。

应改为:MOV SP, WORD PTR OP2[BX][SI]

(16)MOV AX, W_OP3+W_OP4错,两个标识符相加无意义。应改为: MOV AX, W_OP1 ADD AX, W_OP2 (17)MOV AX,W_OP3-W_OP4+100正确,源操作数为两个标识符(地址)相减再加一数,汇编时

得到一个数。

(18)SUB AL, W_OP3+7错,两个操作数类型不一致。应改为: SUB AL, BYTE PTR W_OP3+7 (19)MOV AX,BX SHL 2错,SHL只能对常量进行运算,左边不能使用寄存器

(20)MOV BX,W_OP3 AND 8FD7H错,AND只能对常量进行运算,左边不能使用变量 2.设某程序数据段中有下面两条伪指令 DATA1 EQU 25H DATA2 DW 25H

代码段中有下面的程序段 .........

MOV BX,DATA1 MOV DX,DATA2 .........

试问执行完MOV DX,DATA2指令后BX和DX内容是否相同,为什么?

答:执行完MOV DX,DATA2指令后BX和DX内容不一定相同,因为DATA1是常量25,故(BX)=25, 但DATA2是变量,虽然其初始值为25,如果前面(省略号位置)有指令对DATA2操作,其值

可能已发生变化。

3.下面各题中语句有语法错误,试分别用两种办法修改题中语句,使它们在汇编时都能分别获得通过:

(1) DATA1 DW 0FH ??

MOV AH,DATA1 (2) DATA2 EQU 10H ??

MOV DATA2,BL (3) DATA3 DW ‘EFDABC’ (4) DATA4 DB 3E2H (5) DASEG1 SEGMENT VAR1 DW 4FD2H DASEG1 ENDS DASEG2 SEGMENT VAR2 DW 0D8AH DASEG2 ENDS

COSEG SEGMENT

ASSUME CS:COSEG,DS:DASEG2 START:

......

MOV AX,VAR1 ...... COSEG ENDS

END START

答:(1)改为:DATA1 DB 0FH ??

MOV AH, DATA1 或改为:DATA1 DW 0FH ??

MOV AH, BYTE PTR DATA1 (2) 改为:DATA2 DB 10H ??

MOV DATA2,BL 或改为:DATA2 DW 10H ??

MOV BYTE PTR DATA2,BL (3)改为:DATA3 DB ‘FEADCB’

或改为:DATA3 DW ‘EF’,‘DA’,‘BC’ (4) 改为:DATA4 DB 0E2H,3H 或改为:DATA4 DW 3E2H (5)改为: DASEG1 SEGMENT VAR1 DW 4FD2H DASEG1 ENDS DASEG2 SEGMENT VAR2 DW 0D8AH DASEG2 ENDS COSEG SEGMENT

ASSUME CS:COSEG,DS:DASEG1 START:

??

MOV AX,VAR1 ?? COSEG ENDS

END START 或改为: DASEG1 SEGMENT VAR1 DW 4FD2H DASEG1 ENDS DASEG2 SEGMENT VAR2 DW 0D8AH DASEG2 ENDS

COSEG SEGMENT

ASSUME CS:COSEG,DS:DASEG2, ES:DASEG1 START:

??

MOV AX,ES:VAR1 ?? COSEG ENDS

END START 4.设已定义数据段 DATA SEGMENT ??

VAR2 DW 10H,7889H ??

VAR5 DB 20H,0

ADRR DW VAR2,VAR5 DATA ENDS

为使ADRR字存储单元中存放内容为“0010H”,ADRR+2字存储单元中存放内容为“0020H”,上述省略号位置应分别填写一条什么语句?说明理由。

答:为使ADRR字存储单元中存放内容为“0010H”,ADRR+2字存储单元中存放内容为

“0020H”,上述省略号位置应分别填写ORG 10H 和 ORG 20H, 或者分别填写语句 VAR1 DB 10H DUP(?) 和 VAR3 6 DUP(?) 5.下面的数据段中,有数据为‘4100H’的字存储单元有几个?它们的偏移量分别是多少? DATA SEGMENT DA1 DB 0 ORG 41H

DA2 DB 0,‘A’,41H,0,41H ADR DW DA1,DA2

DATA ENDS

答:给出的数据段中,有数据‘4100H’的字存储单元有3个,它们的偏移量分别是41H、 44H、47H。

6.下面语句中有数据4203H’的字存储单元有多少?有数据‘0342H’ 的字存储单元有多少?

DB 10H DUP(‘B’,2 DUP(3))

答:给出的语句中有数据‘4203H’的字存储单元有15个,有‘0342H’的字存储单元有16个。

7.试用数据定义语句DB或DW改写下述两语句中的某一个,使它们在存储器中有完全相同的存储情况。

VAR1 DB ‘abcdefghij’

VAR2 DW 6162H,6364H,6566H,6768H,696AH

答:将第一个伪指令语句改写为VAR1 DW ‘ab’,‘cd’,‘ef’,‘gh’,‘ij’,第二个伪指令语句不变。或第一个伪指令语句不变,而将第二个伪指令语句改写为:

VAR2 DB 61H,62H,63H,64H,65H,66H,67H,68H,69H,6AH

8.分析下面各程序的运行情况,按要求将中间结果及最终结果填入相应划线处。 (1)DATA SEGMENT

CUNT EQU 0fH

DB1 DB 0dfH,0,25H,13H,78H EVEN

DW1 DW 32H,50H,0de18H,4753H ADR1 DW DB1 ADR2 DW DW1

BUF DB 4 DUP(0) DATA ENDS

COSEG SEGMENT

ASSUME CS:COSEG,DS:DATA BEGIN:MOV AX,DATA MOV DS,AX

MOV CX,CUNT SHR 2 ;(CX)= ① ADD ADR1,CX SUB ADR2,CX

DEC ADR2 ;ADR2= ② MOV BX,ADR1 ;(BX)= ③ MOV DI,BX MOV SI,ADR2

MOV AL,DB1[BX] ;(AL)= ④ MOV BUF[DI],AL MOV AX,DW1[BX][SI]

MOV WORD PTR BUF,AX ;BUF[0]= ⑤,BUF[1]= ⑥ MOV AH,4CH ;BUF[2]= ⑦,BUF[3]= ⑧ INT 21H COSEG ENDS

END BEGIN (2)DATA SEGMENT ORG 32H DA_WD DW 20H NUM1 = 10*10 NUM2 EQU 70H

REL1 DW NUM1 LE NUM2

REL2 DB NUM1 NE NUM2,NUM1 EQ NUM2 NUM3 EQU 945H NUM4 = 35*35

ADRR DW REL1,9873H,REL2 DATA ENDS

COSEG SEGMENT

ASSUME CS:COSEG,DS:DATA BEGIN:MOV AX,DATA MOV DS,AX

MOV AX,DA_WD+1 ;(AX)= ① MOV BX,OFFSET DA_WD ;(BX)= ②

MOV CL,HIGH(OFFSET REL2)

MOV CH,TYPE DA_WD ;(CX)= ③ MOV DX,REL1 ;(DX)= ④ MOV AX,WORD PTR REL2 ;(AX)= ⑤ MOV BX,NUM4 LE NUM3 ;(BX)= ⑥ MOV CX,NUM4 GT NUM3 ;(CX)= ⑦ MOV DX,ADRR+1 ;(DX)= ⑧ LEA SI,ADRR+1 ;(SI)= ⑨ MOV AH,4CH INT 21H COSEG ENDS

END BEGIN (3)DATA SEGMENT ORG 100H NUM1 = 8

NUM2 = NUM1+10H DA1 DB ‘IBM PC’ DB 0AH,0DH CUNT EQU $-DA1

DA2 DW ‘IB’,‘M ’,‘PC’,0A0DH ORG 134H NUM3 = 20H

DA3 DW 10H,$+20H,30H,$+40H DA4 DW DA1+NUM3+14H DATA ENDS

COSEG SEGMENT

ASSUME CS:COSEG,DS:DATA BEGIN:MOV AX,DATA MOV DS,AX

MOV AX,OFFSET (DA1+1) ;(AX)= ① MOV BL,LOW OFFSET DA2 ;(BL)= ② MOV CX,CUNT ;(CX)= ③ MOV DX,DA2+5 ;(DX)= ④ MOV AX,DA3[2] ;(AX)= ⑤ MOV BX,DA3[6] ;(BX)= ⑥ MOV SI,DA4 ;(SI)= ⑦ MOV CX, [SI] ;(CX)= ⑧ MOV AH,4CH INT 21H COSEG ENDS

END BEGIN (4) data segment org 2

Va1 db 30h,36h

org 7

Va2 db 35h,38h len1 equ $-Va2 Va3 db 39h,32h data ends prog segment

assume cs:prog,ds:data start: mov ax,data mov ds,ax

mov dl,[Va1+1] ;(dl)= ① mov ah,2 int 21h

mov di,offset Va3

mov dl,[di+1] ;(dl)= ② mov ah,2 int 21h

mov dl,ds:[len1] ;len1= ③ ,(dl)= ④ mov ah,2 int 21h

lea ax,Va2 ;(al)= ⑤ or al,30h ;(al)= ⑥ mov dl,al mov ah,2 int 21h

mov ah,4ch int 21h prog ends

end start

;最终显示结果为: ⑦

答:(1) ① 3 ② 2 ③ 3 ④ 13H ⑤ deH ⑥ 53H ⑦ 0 ⑧ 13H (2) ① ff00H ② 32H ③ 200H ④ ffffH ⑤ ffH ⑥ ffffH

⑦ 0 ⑧ 7300H ⑨ 39H

(3) ① 101H ② 8 ③ 8 ④ 0d50H ⑤ 156H ⑥ 17aH ⑦ 134H ⑧ 10H (4) ① 36H ② 32H ③ 2 ④ 30H ⑤ 7 ⑥ 37H ⑦ 6207 9.按下面的要求写出程序的框架

(1)数据段的位置从0E000H开始,数据段中定义一个100字节的数组,其类型属性既是字又是字节;

(2)堆栈段从小段开始,段组名(类别名)为STACK;

(3)代码段中指定段寄存器,指定主程序从1000H开始,给有关段寄存器赋值; (4)程序结束。

答:所求程序框架为:

Data SEGMENT AT 0E000H Arr_w LABEL WORD

Arr_b DB 100 DUP(?)

Data ENDS

Sta_seg SEGMENT PARA ‘STACK’ DB 80 DUP(?) Top LABEL WORD Sta_seg ENDS Code SEGMENT

ASSUME CS:Code,DS:data,SS:sta_seg ORG 1000H Start: MOV AX, data MOV DS, AX

MOV AX,Sta_seg MOV SS, AX

MOV SP, OFFSET Top ??

MOV AH, 4CH INT 21H Code ENDS

END Start

10.编写一个程序,要求运行时屏幕显示‘BELL’,同时响铃一次(响铃的ASCII码为07)。 答:所求程序为: Code SEGMENT

ASSUME CS:code Start: MOV DL, 42H MOV AH, 2 INT 21H MOV DL, 45H MOV AH, 2 INT 21H MOV DL, 4CH MOV AH, 2 INT 21H MOV DL, 4CH MOV AH, 2 INT 21H MOV DL, 7 MOV AH, 2 INT 21H MOV AH, 4CH INT 21H Code ENDS

END Start

11.假设在数据段X_SEG、附加段Y_SEG和堆栈段Z_SEG中分别定义了字变量X、Y和Z,试编制一完整的程序计算 X+Y+Z,并将结果送X。 答:所求程序为:

X_SEG SEGMENT X DW 12eH

X_SEG ENDS Y_SEG SEGMENT Y DW 4d2H

Y_SEG ENDS

Z_SEG SEGMENT STACK ‘STACK’ Z DW 2CAH Z_SEG ENDS Code SEGMENT

ASSUME CS:Code,DS:X_SEG,ES:Y_SEG,SS:Z_SEG Start: MOV AX, X_SEG MOV DS, AX

MOV AX, Y_SEG MOV ES, AX MOV AX,ES:Y ADD X, AX MOV BP, 0

MOV AX, [BP+Z] ADD X, AX MOV AH, 4CH INT 21H

Code ENDS

END Start

12.写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的DADD1和附加段E_SEG中的DADD2相加,并把结果存放在D_SEG段中的SUM中。其中DADD1、DADD2和SUM均为双字类型,DADD1赋值为98765,DADD2赋值为-15893。 答:所求程序为:

D_SEG SEGMENT DADD1 DD 98765 SUM DD ?

D_SEG ENDS E_SEG SEGMENT

DADD2 DD -15893

E_SEG ENDS C_SEG SEGMENT

ASSUME CS: C_SEG,DS:D_SEG,ES:E_SEG Start: MOV AX, D_SEG MOV DS, AX MOV AX, E_SEG MOV ES, AX

MOV AX,WORD PTR DADD1 MOV BX,WORD PTR DADD1+2 ADD AX, WORD PTR ES:DADD2

(4)STOS错,指令中未明确表明是字节操作还是字操作。 (5)LODSB正确。

(6)REP STOS [SI] 错,指令中未明确表明是字节操作还是字操作。

4.字符串传送指令设计一个程序段,实现将内存CS:300H~400H处的一串数据传送至CS:400H~500H处。 答:所求程序为: code segment

assume ds:code, es:code, cs:code start: mov ax, code mov ds, ax mov es, ax mov cx, 100h mov si, 300h mov di, 400h rep movsb mov ah, 4ch int 21h code ends

end start

5.现有下列数据段: DATA SEGMENT

STR1 DB 'ABCDEFGHIJKL' COUNT EQU $-STR1

BUF DB COUNT DUP(0) DATA ENDS

试编制一程序,实现把STR1中所有字符逆向传送到BUF缓冲区(即STR1中第一个字符送到BUF的最后一个字节单元,STR1中最后一个字符送到BUF的第一字节单元),而且要求在程序中一定要使用串传送指令MOVS。

答:此类问题使用栈解决最好,但根据题目要求,程序应写为: data segment

str1 db ‘abcdefghijkl’ count equ $-str1 buf db count dup(0) data ends code segment

assume cs:code,ds:data,es:data start: mov ax, data mov ds, ax mov es, ax mov cx, count

mov si, offset str1

mov di, offset buf add di, count lop: movsb

dec di dec di loop lop mov ah, 4ch int 21h code ends

end start

6. 使用换码指令和循环指令设计一个程序段,实现一段文字的加密和解密。要求,加密和解密分别设计为两个子程序。主程序中进行加密/解密操作选择,明文和密文都存放到数据段中,同时通过显示器送出。

答:不妨选择一种加密规则为:a变b,b变c,......,z变a,空格变叹号,逗号变句号,句号变逗号。解密则为其逆变换。 d_seg segment org 20h

jiamitab db 21h org 2ch

db 2eh,?,2ch org 61h

db 'bcdefghijklmnopqrstuvwxyza' org 121h

jiemitab db 20h org 12ch

db 2eh,?,2ch org 161h

db 'zabcdefghijklmnopqrstuvwxy'

prompt1 db '请选择:1-加密;5-解密;0-结束' prompt2 db '请输入明文(‘#’结束):$' prompt3 db '请输入密文(‘#’结束):$' prompt4 db '明文是:$' prompt5 db '密文是:$' clear db 1000 dup (?) cipher db 1000 dup (?) d_seg ends c_seg segment

assume cs:c_seg,ds:d_seg,es:d_seg start:mov ax,d_seg mov ds,ax

mov es,ax

lop1: mov dx,offset prompt1 mov ah,9

int 21h mov ah,1 int 21h cmp al,'0'

jz close cmp al,'1' jnz zhlab1 call jiami jmp zhlab2

zhlab1:cmp al,'5'

jnz zhlab2 call jiemi

zhlab2:jmp lop1 close:mov ah,4ch

int 21h jiami proc

mov dx,offset prompt2

mov ah,9 int 21h

mov si,offset clear mov di,offset cipher xor bx,bx z1lab1:mov ah,1 int 21h cmp al,'#' jz z1lab2 mov [si],al inc si xlat stosb

jmp z1lab1 z1lab2:mov [si],'$' mov [di],'$'

mov dx,offset prompt4 mov ah,9 int 21h

mov dx,offset clear mov ah,9 int 21h

mov dx,offset prompt5 mov ah,9 int 21h

mov dx,offset cipher mov ah,9 int 21h ret jiami endp jiemi proc

mov dx,offset prompt3 mov ah,9 int 21h

mov si,offset cipher mov di,offset clear mov bx,100h z2lab1:mov ah,1 int 21h cmp al,'#' jz z2lab2 mov [si],al inc si xlat stosb

jmp z2lab1 z2lab2:mov [si],'$' mov [di],'$'

mov dx,offset prompt5 mov ah,9 int 21h

mov dx,offset cipher mov ah,9 int 21h

mov dx,offset prompt4 mov ah,9 int 21h

mov dx,offset clear mov ah,9 int 21h

ret

jiemi endp c_seg ends end start

*7. 试编一程序,比较两个字符串STR1和STR2中所包含的字符是否相同(两个字符串中字符的次序可以不相同,且允许有重复字符)。

*8. 试编写一个汇编语言程序,要求从键盘接收两个四位的10进制数,转换为二进制数相加,将和用十进制形式从显示器送出。

*9. 试编写一程序,先从键盘接收一段英文(以回车符结束),然后输入一个单词,查对该单词在该文中出现的次数,并以格式“‘单词’ XXXX”显示出次数。 *10. 试分别编制两个通用代码转换子程序: (1)将二进制数转换为P进制数子程序; (2)把P进制数转换为二进制数子程序。

ADC BX, WORD PTR ES:DADD2+2 MOV WORD PTR SUM, AX MOV WORD PTR SUM+2, BX MOV AH, 4CH INT 21H

C_SEG ENDS

END Start 第七章习题与参考答案

1. 分析下列程序的运行情况,按要求将中间结果及最终结果填入相应划线处。 (1) data segment

Str1 db‘ewaesstt’ Var1 db ? data ends

prog segment

assume cs:prog,ds:data start: mov ax,data mov ds,ax

mov cx,offset Var1 ;(cx)= ① Lab1: mov di,offset Var1 ;(di)= ② Sub di,cx ;(di)= ③ mov dl,[di] ;(dl)= ④ mov ah,2 int 21h

dec cx ;(cx)= ⑤ loop Lab1 mov ah,4ch int 21h prog ends end start

;最终显示结果为: ⑥

(2) DATA SEGMENT

DA1 DW 312H,876H,O34BOH DA2 DB 12H,34H,56H,OABH DB $-DA2

BUF DB 10H DUP(0,4,8) DATA ENDS

prog segment

assume cs:prog,ds:data start: mov ax,data mov ds,ax

MOV SI,OFFSET DA1+5 MOV DI,0FFSET BUF MOV CX,DA2+4 LOP:MOV AL,[SI]

(第二次循环) (第二次循环) (第二次循环)

(第二次循环)

MOV [DI],AL DEC SI INC DI LOOP LOP

mov ah,4ch ;BUF[0]= ①,BUF[1]= ②,BUF[2]= ③,

;BUF[3]= ④,BUF[4]= ⑤

int 21h prog ends

end start

(3) DATA SEGMENT

DA1 DW 312H,876H,O34BOH DA2 DB 12H,87H,0CBH,35H DB $-DA2

BUF DB 10H DUP(0,18,5) DATA ENDS prog segment

assume cs:prog,ds:data start: mov ax,data mov ds,ax

LEA SI,DA1

MOV DI,0FFSET DA2

MOV AL,[SI] CMP AL, [DI] JNE LAB1

MOV CX, 4[DA2] LEA DI, BUF LOP1: MOV AL,[SI] MOV [DI],AL INC SI INC DI LOOP LOP1 JMP LAB2 LAB1: MOV CX, 2 MOV SI, 0

LOP2: MOV [DI], LENGTH DA2 MOV AL, [DI] ADD BUF[SI], AL LO0P LOP2

LAB2: mov ah,4ch ;BUF[0]= ①, BUF[1]= ②, BUF[2]= ③,

;BUF[3]= ④ , BUF[4]= ⑤

int 21h prog ends

end start

若DA1[0]的初始值置为1234H,则执行到同一位置时,BUF[0]= ⑥ ,BUF[1]= ⑦,

BUF[2]= ⑧

(4) DATA SEGMENT

VA1 DB 10H DUP(3)

VA2 DW 1OH DUP(0205H) DB $-VA2

BUF DB 10H DUP(1,2,3) DATA ENDS

prog segment

assume cs:prog,ds:data start: mov ax,data mov ds,ax MOV BX,0 MOV AL,0 MOV CX,0

LOP1:ADD AL,VA1[BX]

ADD AL,BYTE PTR VA2[BX] ADD BUF[BX], AL

INC BX ;(BX)=1时,BUF[1]= ①,

;(BX)=2时,BUF[1]= ②,(CX)= ③

LOOP LOP1 mov ah,4ch int 21h prog ends

end start

(5) DATA SEGMENT

VA1 DB 4 DUP(1,3,0,4) CONST EQU $-VA1 BUF DB 10 DUP(0) DATA ENDS prog segment

assume cs:prog,ds:data start: mov ax,data mov ds,ax LEA BX,VA1 MOV SI, 0 MOV CX,CONST MOV AX,0

LOP:ADD AL,[BX][SI] TEST AL,8 JZ NEXT INC AH SUB AL,08 NEXT:INC SI LOOP LOP

MOV BUF, AX ;(AX)= ① mov ah,4ch int 21h prog ends

end start

如用指令LOOPNZ替代上述程序中的LOOP指令,那么执行到同一位置时,(AX)= ②,(CX)= ③

答:(1) ① 8 ② 8 ③ 2 ④ 61H ⑤ 5 ⑥ east (2) ① 34H ② B0H ③ 8 ④ 76H ⑤ 4

(3) ① 12H ② 3 ③ 76H ④ 8 ⑤ 18H ⑥ 2 ⑦ 18H ⑧ 5 (4) ① 2 ② F ③ -1 (5) ① 400H ② 100H ③ 0CH 2. 假设已知: (DS)=2100H,(BX)=3200H,(SI)=5300H,位移量 DISP=1000H,(CS)=1300H,(IP)=8200H,(24200H字单元)=5380H,25200H开始的连续4个字节为:38H、2AH、56H、2BH,29500H开始的连续4个字节为: 7AH、5CH、81H、92H。试为以下的转移或过程调用指令找出转移的物理地址。 (1)段内直接寻址

(2)使用SI及寄存器寻址方式的段内间接寻址 (3)使用BX及寄存器间接寻址方式的段内间接寻址 (4)使用BX及寄存器相对寻址方式的段间间接寻址 (5)使用BX和SI及基址变址寻址方式的段间间接寻址

答:(1)段内直接寻址时,转移或过程调用指令转去的物理地址为:

(CS)*10H+新(IP)=(CS)*10H+(IP)+DISP=13000H+8200H+1000H=1C200H

(2)使用SI及寄存器寻址方式进行段内间接寻址时,转移或过程调用指令转去的物理地址为: (CS)*10H+新(IP)=13000H+(SI)=13000H+5300H=18300H (3)使用BX及寄存器间接寻址方式进行段内间接寻址时,转移或过程调用指令转去的物理地址为:

(CS)*10H+新(IP)=13000H+((DS)*10H+(BX))=13000H+(21000H+3200H)=13000H+(24200H) =13000H+5380H=18380H

(4)使用BX及寄存器相对寻址方式进行段间间接寻址时,转移或过程调用指令转去的物理地址为:

新(CS)*10H+新(IP)=((DS)*10H+(BX)+DISP+2字单元)*10H+((DS)*10H+(BX)+DISP字单元) =(21000H+3200H+1000H+2字单元)*10H+(21000H+3200H+1000H字单元) =(25202H字单元)*10H+(25200H字单元)=2B56H*10H+2A38H=2DF98H

(5)使用BX和SI及基址变址寻址方式进行段间间接寻址时,转移或过程调用指令转去的物理地址为:

新(CS)*10H+新(IP)=((DS)*10H+(BX)+(SI)+2字单元)*10H+((DS)*10H+(BX)+(SI)字单元) =(21000H+3200H+5300H+2字单元)*10H+(21000H+3200H+5300H字单元) =(29502H字单元)*10H+(29500H字单元)=9281H*10H+5C7AH=9848AH

3. 已知: (DS)=3000H,(BX)=4000H,(SI)=2000H,位移量DIS=1000H,(CS)=5000H,(IP)=7000H,(35000H字单 元)=7BADH,36000H开始的连续4个字节为:0BH、04H、00H、80H,标号LAB1位于当前段,其有效地址为7020H ,标号LAB2所在段的段地址为8000H,其有效地址为400H,过程SUBPRO所在段的段地址为8000H,其有效地址 为200H。试为以下的转移或过程调用指令找出转移的物理地址。

(1)JZ LAB1 (2)JMP BX

(3)JMP WORD PTR DIS[BX] (4)CALL FAR PTR SUBPRO (5)JMP FAR PTR LAB2

(6)JMP DWORD PTR [BX][SI]

答:(1)执行JZ LAB1指令后, 转去执行的指令的物理地址为: (CS)*10H+新(IP)=5000H*10H+7020H=50000H+7020H=57020H (2)执行JMP BX指令后, 转去执行的指令的物理地址为:

(CS)*10H+新(IP)=5000H*10H+(BX)=50000H+4000H=54000H

(3)执行JMP WORD PTR DIS[BX]指令后, 转去执行的指令的物理地址为: (CS)*10H+新(IP)=5000H*10H+((DS)*10H+(BX)+DIS字单元) =50000H+(30000H+4000H+1000H字单元)

=50000H+(35000H字单元)=50000H+7BADH=57BADH

(4)执行CALL FAR PTR SUBPRO指令后, 转去执行的指令的物理地址为: 新(CS)*10H+新(IP)=8000H*10H+200H=80200H

(5)执行JMP FAR PTR LAB2指令后, 转去执行的指令的物理地址为: 新(CS)*10H+新(IP)=8000H*10H+400H=80400H

(6)执行JMP DWORD PTR [BX][SI]指令后, 转去执行的指令的物理地址为:

新(CS)*10H+新(IP)=((DS)*10H+(BX)+(SI)+2字单元)*10H+((DS)*10H+(BX)+(SI)字单元) =(30000H+4000H+2000H+2字单元)*10H+(30000H+4000H+2000H字单元) =(36002H字单元)*10H+(36000H字单元)=8000H*10H+40BH=8040BH

4. 假设VAR1和VAR2为字变量,LAB1为当前代码段中的标号,其有效地址为3000H,当前(IP)=2000H,LAB2是另一代码段中的标号。试指出下列指令的错误之处: (1)JMP VAR1 (2)JZ LAB1

(3)JMP LAB2 (4)JNZ FAR PTR LAB2 (5)CALL LAB2 (6)JMP VAR2

(7)JNZ WORD PTR [BX] (8)JMP [BX][SI+100H] (9)JZ BX (10)JMP DWORD PTR BX

答:(1)转移指令是转去执行另外一条指令,因此目标地址处应为指令。JMP VAR1的转向目标处为数据。

(2)条件转移指令要求当前指令和转去执行的另一条指令之间的距离不超过127字节,而已知LAB1的有效地址为3000H,当前(IP)=2000H, 3000H-2000H>>127。 (3)转移指令JMP LAB2是进行段间转移,故应写成JMP FAR PTR LAB2 (4)条件转移指令只允许段内转移,而JNZ FAR PTR LAB2是段间转移。

(5)过程调用指令是要转去执行另外一个过程,故CALL后应为过程名,而CALL LAB2的目标是标号。

(6)转移指令是转去执行另外一条指令,因此目标地址处应为指令。JMP VAR2的转向目标处为数据。

(7)条件转移指令不允许间接转移,而JNZ WORD PTR [BX]是要进行段内间接转移 (8)间接转移指令JMP [BX][SI+100H]中应加上WORD PTR或DWORD PTR指明是段内还是段间转移。

(9)条件转移指令不允许间接转移,而JZ BX是要进行段内间接转移

(10)不能修改寄存器的属性,如想实现段内转移应写为JMP BX,如想实现段间转移应

写为: JMP DWORD PTR [BX]

5. 试编写一个程序,要求能从键盘接收一个不超过9的数N,然后输出N个B。 答:所求程序为: data segment

var1 db '请输入一个不超过9的数:$' data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax

mov dx, offset var1 mov ah, 9 int 21h mov ah, 1 int 21h cmp al, 31h jl lab2 cmp al, 39h jg lab2 and ax, 0fh mov cx, ax lab1: mov ah, 2 mov dl, 42h int 21h loop lab1 lab2: mov ah, 4ch int 21h code ends

end start

6. 设一台计算机CPU主频为80M,执行一条LOOP指令用两个时钟,请设计一个延时2秒的程序段。

答:设延时2秒需执行X条LOOP指令,则有:2X=80*1000000*2,X=80000000=8000*10000所求延时2秒的程序段为: mov di, 10000 lab1: mov cx, 8000 lab2: loop lab2 dec di jnz lab1

7. 设一台计算机CPU主频为400M,执行一条LOOP指令用两个时钟,试编写一个程序,要求能从键盘接收一个不超过9的数N,然后每隔0.5秒响铃一次,共响铃N次(响铃的ASCII码为07)。

答:7.设延时0.5秒需执行X条LOOP指令, 则有:2X=400*1000000*0.5,X=100000000=10000*10000,所求程序段为: data segment

var1 db '请输入一个不超过9的数:$' data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax

mov dx, offset var1 mov ah, 9 int 21h mov ah, 1 int 21h

cmp al, 31h jl lab4

cmp al, 39h jg lab4

and ax, 0fh mov si, ax lab1: mov di, 10000 lab2: mov cx, 10000 lab3: loop lab3 dec di jnz lab2 mov ah, 2 mov dl, 7 int 21h dec si jnz lab1 lab4: mov ah, 4ch int 21h code ends

end start

8. 试编写一个程序,要求将键盘输入的一串小写英文字母用大写英文字母显示出来。当输入一个非英文小写字母时,结束工作。 答:所求程序为: data segment

var1 db '请输入一串小写英文字母(输入一个非英文小写字母时结束):$' data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax

mov dx, offset var1 mov ah, 9 int 21h

mov cx, 0 lab1: mov ah, 1 int 21h

cmp al, 61h jl lab2

cmp al, 7ah jg lab2

sub al, 20h mov ah, 2 mov dl, al int 21h loop lab1 lab2: mov ah, 4ch int 21h code ends

end start

9. 试编写一个程序,要求从键盘输入一串字符(不超过50个,遇回车结束),然后,按与输入时相反的顺序显示出来(用两种不同的方法来编写)。 答:所求程序为: data segment

var1 db '请输入一串字符(不超过50个,遇回车结束):$' data ends

sta1 segment stack dw 50 dup (?) sta1 end

code segment

assume cs:code, ds:data,ss:sta1 start: mov ax, data mov ds, ax

mov dx, offset var1 mov ah, 9 int 21h mov si,0 mov cx, 50 lab1: mov ah, 1 int 21h

cmp al, 0dh jz lab2 push ax inc si loop lab1 lab2: mov cx, si lab3: pop bx mov dl, bl

mov ah, 2 int 21h loop lab3 mov ah, 4ch int 21h code ends

end start

10. 从键盘输入一系列字符(以回车符结束),并按字母、数字及其它字符分类计数,最后显示出这三类的计数结果。 答:所求程序为: data segment

var1 db '请输入一串字符(不超过50个,遇回车结束):$' alpha dw ? number dw ? other dw data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax

mov dx, offset var1 mov ah, 9 int 21h mov cx, 50 lOP1: mov ah, 1 int 21h cmp al, 0dh jz close cmp al, 30h jl lab4 cmp al, 39h Jg lab2 inc number jmp lab5 lab2: cmp al, 41h jl lab4 cmp al, 5ah jg lab3 inc alpha jmp lab5 lab3: cmp al, 61h jl lab4 cmp al, 7ah jg lab4

inc alpha jmp lab5 lab4: inc other lab5: loop lOP1 close: mov ah, 4ch int 21h code ends

end start

11. 设平面上有一点P的直角坐标(X,Y),试编制完成以下操作的程序: (1)如P点落在第i(i=1,2,3,4)象限,则将i送quadrant单元; (2)如P点落在坐标轴上,则将0送quadrant单元。 答:所求程序为: data segment X dw -45 Y dw 82

quadrant dw ? data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax xor ax, ax cmp ax, x jz axis cmp ax, y jz axis cmp x, ax jl qua2_3 cmp y, ax jl qua4

mov quadrant, 1 jmp close

qua4: mov quadrant, 4 jmp close qua2_3: cmp y, ax jl qua3

mov quadrant, 2 jmp close

qua3: mov quadrant, 3 jmp close

axis: mov quadrant, 0 close: mov ah, 4ch int 21h code ends

end start

12.数据区中三个字节单元VAR1、VAR2及VAR3本应存放彼此相等的代码,现有一单元存错了代码。试编一程序,找出存错代码的单元,并将错误代码送入ERRO单元中,存放错误代码单元的偏移量送ADDR单元中。 答:所求程序为: data segment var1 db 74h var2 db 75h var3 db 74h erro db ? addr dw ? data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax lea bx, addr mov al, var1 cmp al, var2 jz lab3

cmp al, var3 jz lab2

mov ah, var1 mov erro, ah

mov [bx], offset var1 jmp close lab2: mov ah, var2 mov erro, ah

mov [bx], offset var2 jmp close lab3: mov ah, var3 mov erro, ah

mov [bx], offset var3 close: mov ah, 4ch int 21h code ends

end start

13. 试编一程序,统计出某数组中相邻两数间符号变化的次数。 答:所求程序为: data segment

array dw 74h,-28,32,-789h,456h,28h,795,-84h,-541h,48,-50 const equ ($-array)/type array -1 count db 0 data ends

code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax mov cx, const lea bx, array mov si, 0

lop: mov ax, [bx+si] and ax, 8000h mov dx, [bx+si+2] and dx, 8000h cmp ax, dx jz lab1 inc count lab1: add si, 2 loop lop mov ah, 4ch int 21h code ends

end start

14. 设某数据段已有N个学生的某科成绩,并按学号的次序存放在以STUDENT为首址各字单元的低字节中。现在要求按成绩的高低计算出名次,并把名次填入成绩所在字单元的高字节中,成绩相同者名次相同。试编制一程序实现上述要求。 答:所求程序为: data segment

student dw 74,82,52,67,76,82,74,74,87,95,92,78,61,78,65,72,73,75 const equ ($-array)/type student data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax mov bx, const lea si, student lop1: mov ax, [si] lea di, student mov cx, const lop2: cmp al, byte ptr [di] jge lab1

inc byte ptr [si+1] lab1: add di, 2 loop lop2 add si, 2

inc byte ptr [si+1]

dec bx jnz lop1 mov ah, 4ch int 21h code ends

end start

15. 设数据段有两组无符号数据DA1和DA2。试编制一程序,对两组数据一一对应比较,分别统计DA1中大于、等于、小于DA2对应数据的个数。数据段的数据安排如下: DATA SEGMENT

DA1 DW ××,××,××,...... DA2 DW ××,××,××,......

COUT DB 0 ;存大于的个数 DB 0 ;存等于的个数 DB 0 ;存小于的个数 DATA ENDS 答:所求程序为: data segment

DA1 DW 7832h,65h,3a8bh,43dch,539h,39h,74h,128h,79h,4aah,0adh DA2 DW 785h,98h,78adh,238ah,539h,48h,49h,23dh,79h,4aah,289h const equ ($-da2)/type da2

COUT DB 0 ;存大于的个数 DB 0 ;存等于的个数 DB 0 ;存小于的个数 data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax lea si, da1 lea di, da2 mov cx, const lop: mov ax, [si] cmp ax, [di] jle lab1 inc cout jmp lab3 lab1: jl lab2 inc cout+1 jmp lab3 lab2: inc cout+2 lab3: add si, 2 add di, 2 loop lop mov ah, 4ch

int 21h code ends

end start

16. 重写第7题的程序, 改用一个子程序实现0.5秒的延时。

答:设延时0.5秒需执行X条LOOP指令, 则有:2X=400*1000000*0.5,X=100000000=10000*10000 所求程序为: data segment

var1 db '请输入一个不超过9的数:$' data ends code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax

mov dx, offset var1 mov ah, 9 int 21h mov ah, 1 int 21h cmp al, 31h jl close cmp al, 39h jg close and ax, 0fh mov si, ax labm: call subp mov ah, 2 mov dl, 7 int 21h dec si jnz labm close:mov ah, 4ch int 21h subp proc

mov di, 10000 sup1: mov cx, 10000 sup2: loop sup2 dec di jnz sup1 ret subp endp code ends

end start

17. 重写第9题的程序, 改用一个子程序实现输入,一个子程序实现输出。

答:所求程序为: data segment

var1 db '请输入一串字符(不超过50个,遇回车结束):$' data ends

sta1 segment stack dw 50 dup (?) sta1 end code segment

assume cs:code, ds:data,ss:sta1 subp1 proc

mov si,0 mov cx, 50 sp11: mov ah, 1 int 21h cmp al, 0dh jz sp12 push ax inc si loop sp11 sp12: ret subp1 endp subp2 proc

mov cx, si sp21: pop bx mov dl, bl mov ah, 2 int 21h loop sp21 ret subp2 endp

start: mov ax, data mov ds, ax

mov dx, offset var1 mov ah, 9 int 21h call subp1 call subp2 mov ah, 4ch int 21h code ends

end start

18. 若下面的过程被同一代码段中的过程调用,请指出其中的错误。 SUBPR PROC

PUSH AX

ADD AX,BX ...... RET SUBPR ENDS

若被另一代码段中的过程调用呢?

答:被同一代码段中的过程调用时,过程定义的结束语句中有错误,应改为SUBPR ENDP 若被另一代码段中的过程调用时,过程定义的开始和结束语句中都有错误,应改为: SUBPR PROC FAR PUSH AX ADD AX,BX ...... RET SUBPR ENDP

19.试编制程序,对NUM中各数分别统计出有多少个20,余下有多少个5,再余下有多少个2,再余下有多少个1。 统计的各数分别存放在NUM20,NUM5,NUM2,NUM1的对应位置中,程序要求用主程序子程序形式编制,而且用两种参量传递方法分别编制主程序和子程序)数据段如下:

DATA SEGMENT

NUM DW 0133H,005FH,1234H COUNT EQU ($-NUM)/TYPE NUM NUM20 DB COUNT DUP(0) NUM5 DB COUNT DUP(0) NUM2 DB COUNT DUP(0) NUM1 DB COUNT DUP(0) DATA ENDS 答:所求程序为: DATA SEGMENT

NUM DW 0133H,005FH,1234H COUNT EQU ($-NUM)/TYPE NUM NUM20 DB COUNT DUP(0) NUM5 DB COUNT DUP(0) NUM2 DB COUNT DUP(0) NUM1 DB COUNT DUP(0) DATA ENDS code segment

assume cs:code, ds:data start: mov ax, data mov ds, ax mov cx, const mov si, 0

lop: mov ax, num[si] div 20 mov bh, ah

mov num20[si], al

xor ax, ax mov al, bh div 5

mov bh, ah

mov num5[si], al xor ax, ax mov al, bh div 2

mov num1[si], ah mov num2[si], al add si, 2 loop lop mov ah, 4ch int 21h code ends

end start

*20.在数据区有一九九乘法表,(Line1~Line9),乘数和被乘数分别在Var1,Var2的字单元中。试编制一程序,用查表法求出乘积:Var1*Var2 。 第八章习题与参考答案

1.分别编制子程序,完成AAA,DAA,AAS,DAS的指令功能。 答:①完成AAA指令功能的子程序为: subprog segment push bx push cx push dx pushf pop bx

and bl,10h jnz lab1 and al,0fh cmp al,9 jle lab2 lab1: add al,6 inc ah pushf pop bx or bx,10h push bx popf

lab2:and al,0fh pushf pop bx mov dx,bx and dx,10h

mov cl,4 shr dx,cl and bx,0feh

or bx,dx

push bx popf pop dx pop cx pop bx ret subprog endp

②完成DAA指令功能的子程序为: subprog segment push bx push dx pushf pop bx

and bl,10h jnz lab1 mov bl,al and bl,0fh cmp bl,9 jle lab2 lab1: add al,6 pushf pop bx or bx,10h push bx popf lab2:jc lab3 mov bl,al and bl,0f0h cmp bl,90h jle lab4 lab3: add al,60h stc lab4: pop dx pop bx ret subprog endp

③完成AAS指令功能的子程序为: subprog segment push bx push cx

push dx pushf pop bx

and bl,10h jnz lab1 and al,0fh cmp al,9 jle lab2 lab1: sub al,6 dec ah pushf pop bx or bx,10h push bx popf

lab2:and al,0fh pushf pop bx mov dx,bx and dx,10h mov cl,4 shr dx,cl and bx,0feh

or bx,dx

push bx popf pop dx pop cx pop bx ret subprog endp

④完成DAS指令功能的子程序为: subprog segment push bx push dx pushf pop bx

and bl,10h jnz lab1 mov bl,al and bl,0fh cmp bl,9 jle lab2 lab1: sub al,6

pushf pop bx or bx,10h push bx popf lab2:jc lab3 mov bl,al and bl,0f0h cmp bl,90h jle lab4 lab3: sub al,60h stc lab4: pop dx pop bx ret subprog endp

2.试编制一程序,实现十个一位十进制数的累加,最后累加和以非压缩形式存放在AH(高位)和AL(低位)中。 答:所求程序为: dseg segment

data db 7,5,8,5,9,4,7,5,7,3 dseg ends code segment

assume cs:code,ds:dseg sta:mov ax,dseg mov ds,ax

mov si,offset data mov cx,10 mov ax,0 clc

lop:addc ax,[si] aaa

inc si loop lop mov ah,4ch int 21h code ends end sta

3.判断下列指令书写是否正确,如有错误,指出错在何处? (1)REP CMPSW (2)REPZ MOVSB (3)SCAS [DI] (4)STOS (5)LODSB (6)REP STOS [SI]

答:(1)REP CMPSW 错,CMPSW不能加前缀REP,只能和REPZ、REPNZ连用;

(2)REPZ MOVSB错,MOVSB不能加前缀REPZ,只能和REP连用 (3)SCAS [DI] 错,指令中未明确表明是字节操作还是字操作。

本文来源:https://www.bwwdw.com/article/gv1v.html

Top