Top Banner
IBM- PC 汇编语言程序设计试题解 胡又农 主编 赵锦红
457

IBM-PC 汇编语言程序设计试题解

Apr 23, 2023

Download

Documents

Khang Minh
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: IBM-PC 汇编语言程序设计试题解

IBM-PC 汇编语言程序设计试题解

胡又农 主编

赵锦红 宋 宇 编

人 民 邮 电 出 版 社

Page 2: IBM-PC 汇编语言程序设计试题解

图书在版编目(CIP)数据

IBM-PC 汇编语言程序设计试题解 / 胡又农主编. —北京:人民邮电出版社,2004.9 ISBN 7–115–12508–2

Ⅰ.I… Ⅱ.①胡… ②赵…③宋… Ⅲ.汇编语言—程序设计—解题 Ⅳ.TP312-44

中国版本图书馆 CIP 数据核字(2004)第 092014 号

内 容 简 介

本书是学习 IBM-PC 汇编语言程序设计和参加汇编语言程序设计各类考试的参考书。适用于考前复习、

强化训练及能力提高阶段。

本书包含 1000 余道试题,内容包括填空、选择、判断及编程等常见题型,并给出全部题目的参考答案

和部分答案解析。针对汇编语言编程这个难度较大的题型,本书对算法及程序实现等内容都做了详细的说明,

这些内容将有助于读者提高汇编语言编程水平。

本书适合计算机、电子信息类大专及本科、成人教育、自学考试、文凭考试、等级考试等人员以及计算

机编程爱好者阅读和参考。

IBM-PC 汇编语言程序设计试题解 主 编 胡又农

编 赵锦红 宋 宇

责任编辑 向 伟

人民邮电出版社出版发行 北京市崇文区夕照寺街 14 号

邮编 100061 电子函件 [email protected] 网址 http://www.ptpress.com.cn

读者热线:010-67129259

北京汉魂图文设计有限公司制作

北京顺义振华印刷厂印刷

新华书店总店北京发行所经销

开本:787×1092 1/16

印张:28.75

字数:704 千字 2004 年 9 月第 1 版

印数:1 – 000 册 2004 年 9 月北京第 1 次印刷

ISBN 7-115-00000- /TP·

定价:37.00 元

本书如有印装质量问题,请与本社联系 电话:(010)67129223

Page 3: IBM-PC 汇编语言程序设计试题解

前 言

在很多科研、开发场合无法用高级语言进行编程,这时用汇编语言编写程序将是研发人

员惟一的选择。 汇编语言程序设计是计算机专业、电子信息工程专业学生的必修课程之一。学习汇编语

言编程,有助于理解计算机软件运行的过程,提高编程能力。汇编语言编程能力的训练,对

于专业硬件、软件研发人员而言是必需的。 汇编语言概念复杂、指令枯燥且不易记忆、规则繁多、使用灵活,利用其编写程序更是

困难重重、容易出错,很多学习者、使用者都会感到掌握汇编语言程序设计的难度较大。本

书编写了 1000 余道试题,力求通过这些试题,帮助读者全面复习、强化考前训练、加深对汇

编语言程序设计基本概念的理解和记忆。 本书内容包括填空题、选择题、判断题、简答题及编程题等常见题型,并给出了全部题

目的参考答案和部分答案解析。 本书中的编程题有部分难度较高,参考答案采取了用 C 语言研究算法和用汇编语言程序

实现的形式,分别给出了 C 语言程序及汇编语言程序,以便读者对照学习,相信这部分内容

将使读者获益匪浅。 由于作者水平有限,经验不多,书中难免存在有错误和不足之处,恳请广大读者批评

指正。

编者 2004 年 6 月

Page 4: IBM-PC 汇编语言程序设计试题解

目 录

第 1 章 填空题 ........................................................... 1

1.1 基础知识 ........................................................ 1

1.2 硬件知识 ........................................................ 3

1.3 指令及寻址 ...................................................... 9

1.4 伪指令 ......................................................... 22

1.5 程序分析 ....................................................... 29

第 2 章 选择题 .......................................................... 98

2.1 基础知识 ....................................................... 98

2.2 硬件知识 ...................................................... 106

2.3 寻址及指令 .................................................... 109

2.4 伪指令 ........................................................ 125

2.5 程序分析 ...................................................... 131

第 3 章 判断题 ......................................................... 153

第 4 章 简答题 ......................................................... 167

第 5 章 程序填空题 ..................................................... 192

第 6 章 编程题 ......................................................... 254

6.1 编程题题目 .................................................... 254

6.2 编程题参考答案 ................................................ 257

参考文献 ............................................................... 451

Page 5: IBM-PC 汇编语言程序设计试题解

第 1章 填 空 题

1.1 基 础 知 识

【1】用降幂法和除法将下列十进制数转换为二进制数和十六进制数。

十进制 369 10000 4095 32767

二进制 ( (1) ) ( (2) ) ( (3) ) ( (4) )

十六进制 ( (5) ) ( (6) ) ( (7) ) ( (8) )

答案:(1)101110001B;(2)10011100010000B;(3)111111111111B;

(4)111111111111111B;(5)171H;(6)2710H;(7)FFFH;(8)7FFFH

【2】将下列二进制数转换成十六进制数和十进制数。

二进制 101010B 1010101B 1000000000000000B 1111B

十六进制 ( (1) ) ( (2) ) ( (3) ) ( (4) )

十进制 ( (5) ) ( (6) ) ( (7) ) ( (8) )

答案:(1)2AH;(2)55H;(3)8000H;(4)FH;(5)42;(6)85;(7)32768;(8)15

【3】将下列十六进制数转换成十进制数。

十六进制 FFFFH F000H 100H 7AH

十进制 ( (1) ) ( (2) ) ( (3) ) ( (4) )

答案:(1)65535;(2)61440;(3)256;(4)122

【4】下列各数为十六进制表示的 8位二进制数,请说明当它们分别被看作是用补码表示

的带符号数或无符号数时,它们所表示的十进制数是什么。

十六进制补码 D8H FFH

带符号十进制数 ( (1) ) ( (2) )

无符号十进制数 ( (3) ) ( (4) )

答案:(1)-40;(2)-1;(3)216;(4)255

【5】内存是用于存放( (1) )、( (2) )信息及中间结果的地方。

答案:(1)程序;(2)数据

【6】下列各数均为用十六进制表示的 8 位二进制数。请说明当它们被看作是字符的

ASCII 码时,它们所表示的字符是什么。

ASCII 码 4FH 2BH 73H 59H

字符 ( (1) ) ( (2) ) ( (3) ) ( (4) )

Page 6: IBM-PC 汇编语言程序设计试题解

·2· IBM-PC 汇编语言程序设计试题解

答案:(1)O(大写字母);(2)+;(3)s;(4)Y

【7】n 位补码的表示范围为:( (1) )≤N≤( (2) )。

答案:(1)-2n−1;(2)2

n−1-1

【8】已知:[X]补=0075H,[Y]补=0FF8BH,则[X+Y]补=( (1) ),[X-Y]补=

( (2) )。

答案:(1)0000H;(2)00EAH

【9】计算机内表示机器数的常用码制表示法有( (1) )。

答案:(1)原码、补码、反码

【10】已知[-Y]补=7001H,则 Y=( (1) )H。

答案:(1)8FFF

【11】已知[X-Y]补=7001H,[X+Y]补=0001H,则[2X]补=( (1) )H。

答案:(1)7002

【12】 (11.25)10=( (1) )8。

答案:(1)13.2

【13】用 IEEE-754标准(32)来表示浮点数字,C1480000所表示的浮点数为( (1) )。

分析:IEEE-754 标准(32)的浮点形式为:±2K×(1+M1×2

-1+M2×2

-2+M3×2

-3+....

+M23×2-23

高字节 低字节

SEEE EEEE E M1M2M3M4M5M6M7 M8M9M10M11M12M13M14M15 M16M17M18M19M20M21M22M23

S:符号位,0=正,1=负;

E:阶码(8BIT),K=E-127;

M:尾数(23BIT),注意隐含的最高位为 1。

则 C1480000可表示为:

C1 48 00 00

1100 0001 0100 1000 0000 0000 0000 0000

S:符号位,1=负;

E:阶码(8BIT),K=100 0001 0B-127=82H-127=130-127=3;

M:尾数(23BIT),M1=1,M4=1。

则 N=-23×(1+1×2−

1+1×2−

4)=-12.5

答案:(1)-12.5

Page 7: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·3·

【14】同一个二进制码可以理解为不同的数据,请填写下表。

位形式 十六进制 无符号 有符号 压缩十进制 字符

0100 0000 (1) (2) (3) (4) (5)

1000 1000 (6) (7) (8) (9) (10)

1100 0101 (11) (12) (13) (14) (15)

答案:(1)~(15)见下表。

位形式 十六进制 无符号 有符号 压缩十进制 字符

0100 0000 40H 64D 64D 40D @

1000 1000 88H 136D -120D 88D ê

1100 0101 C5H 197D -59D 无效 ┼(图形字符)

【15】若[X]求补=X,则 X 为( (1) )。

答案:(1)0

【16】BCD 码是一种用二进制码编码的十进制数,它运用( (1) )位二进制表示一个

十进制数码。

答案:(1)4

【17】二进制数的基数为 2,只有 0、1两个数值,并遵循逢( (1) )的原则。

答案:(1)2进位

【18】汇编语言默认无标记数为( (1) )进制数。

答案:(1)十

1.2 硬 件 知 识

【19】软件是为了( (1) )、( (2) )和维护计算机而编制的各种( (3) )的

总和。

答案:(1)运行;(2)管理;(3)程序

【20】汇编语言是一种( (1) ),它用( (2) )来表示操作码,用( (3) )或

( (4) )来表示操作数或操作数地址,它与( (5) )是一一对应的。

答案:(1)符号语言;(2)助记符;(3)符号;(4)符号地址;(5)机器指令

【21】8086/8088 系统常用的汇编语言是( (1) )。

答案:(1)ASM-86

【22】用二进制代码组成的计算机能直接识别的语言称( (1) ),用机器指令的助记

Page 8: IBM-PC 汇编语言程序设计试题解

·4· IBM-PC 汇编语言程序设计试题解

符以及伪指令、宏指令表示的一种面向机器的语言称( (2) ),用该语言编写的程序需经

过( (3) )翻译,成为计算机能直接识别并执行的程序称( (4) )。

答案:(1)机器语言;(2)汇编语言;(3)汇编程序;(4)目标程序

【23】汇编语言指令通常由两部分组成。前面一部分指出计算机所要执行的操作,称

( (1) )部分;后面一部分指出指令所加工处理的对象,称( (2) )部分。

分析:我们应该知道,组成指令的两部分是操作码部分和操作数部分。在指令中,操作

数部分可以是双操作数(分别称目的操作数和源操作数)或单操作数,甚至可以是隐含操作

数,应该针对不同指令规定的格式来掌握。

答案:(1)操作码;(2)操作数

【24】地址总线上的信息可指出数据的( (1) )和( (2) ),而控制总线传送的

是 CPU 对( (3) )或( (4) )的控制命令和 I/O 设备对 CPU 的请求信号。

答案:(1)源地址;(2)目标地址;(3)存储器;(4)I/O 设备

【25】连接程序的作用是把要执行的( (1) )与( (2) )或其他已翻译过的

( (3) )连接在一起,形成机器( (4) )的程序。

答案:(1)程序;(2)库文件;(3)子程序;(4)可执行

【26】数据寄存器包括( (1) )、( (2) )、( (3) )、( (4) )四个通

用寄存器,但它们又有各自的专门用途,其中,( (5) )可用做累加器,( (6) )可

用做基址寄存器,( (7) )可用做循环和串处理中的隐含计数器,( (8) )在某些 I/O

操作中,可用来存放 I/O 的端口地址。

答案:(1)AX;(2)BX;(3)CX;(4)DX;(5)AX;(6)BX;(7)CX;(8)DX

【27】SP 称为( (1) ),用来指示栈顶的( (2) ),BP 称为( (3) ),用来

指示堆栈区中的( (4) )。SI 称为( (5) ),DI称为( (6) ),一般与段寄存器( (7) )

联用,用来确定数据段中某一存储单元的地址。

答案:(1)堆栈指针寄存器;(2)偏移地址;(3)基址指针寄存器;(4)基地址;(5)

源变址寄存器;(6)目的变址寄存器;(7)DS

【28】条件码中最主要的是( (1) )、( (2) )、( (3) )、( (4) )。

分析:8086/8088 的标志寄存器共有 6 个状态标志位和 3 个控制标志位。其中:状态标

志有 CF(进位标志)、ZF(零标志)、PF(奇偶标志)、SF(符号标志)、OF(溢出标志)和 AF

(辅助进位标志)。控制标志有 IF(中断标志)、TF(单步标志)、DF(方向标志)。

答案:(1)CF;(2)ZF;(3)SF;(4)OF

【29】8086/8088CPU 含有( (1) )条地址总线,直接寻址范围可达( (2) )。

答案:(1)20;(2)1MB

Page 9: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·5·

【30】8088 的内部数据总线是( (1) ),而外部数据总线是( (2) )。

答案:(1)16 位;(2)8位

【31】在程序运行过程中,IP 始终指向( (1) )的首地址,它与( (2) )寄存器

组合形成 20位的物理地址。

答案:(1)下一条要执行的指令;(2)CS

【32】存储器存储单元的物理地址是由两部分地址组成的,即 16 位的( (1) )和 16

位的( (2) )。

答案:(1)段地址;(2)偏移地址

【33】 8086/8088CPU的 I/O空间可有( (1) )个端口地址,端口地址的范围是( (2) )。

答案:(1)64K;(2)0000H—FFFFH

【34】在通用寄存器中,我们常将 BX作为( (1) )寄存器,而将 BP 作为( (2) )

寄存器。

答案:(1)基址;(2)基址指针

【35】 8086/8088 寄存器组可以分为 4类,它们分别是( (1) ),( (2) ),( (3) ),

( (4) )。

答案:(1)数据;(2)段;(3)指针及变址;(4)控制

【36】 8086 内部寄存器组中,通用寄存器有( (1) ),指针索引寄存器有( (2) ),

段寄存器有( (3) ),标志寄存器 PSW 的状态位有( (4) ),标志寄存器 PSW 的控制

位有( (5) )。

答案:(1)AX,BX,CX,DX;(2)BP,SP,SI,DI;(3)CS,DS,SS,ES;(4)SF,AF,

PF,CF,OF,ZF;(5)IF,TF,DF。

【37】外部设备与主机的通信是通过外设接口进行的,接口寄存器根据用途可以分为

( (1) ),( (2) ),( (3) )。

答案:(1)控制;(2)状态;(3)数据

【38】计算机中的指令由( (1) )字段和( (2) )字段两部分组成。

答案:(1)操作码;(2)操作数

【39】在基址变址寻址方式中,可用于基址的寄存器是( (1) ),( (2) );其

中( (3) )默认是相对于 SS 段寻址的。

答案:(1)BX;(2)BP;(3)BP

Page 10: IBM-PC 汇编语言程序设计试题解

·6· IBM-PC 汇编语言程序设计试题解

【40】用 DEBUG 调入一个数据文件后,寄存器对( (1) )表示的是该文件的长度,其

文件内容位于 DS:( (2) )开始的内存区域中。

答案:(1)BX:CX;(2)IP

【41】VGA 显示器的显示区域从物理地址( (1) )处开始,CGA 从( (2) )处开始,

单色显示器 MDA 从( (3) )处开始。

答案:(1)B0000、B80000、A0000;(2)B8000H;(3)B0000~B0400H

【42】 PC机 I/O设备的数据传送方式共有三种,分别是( (1) ),( (2) ),( (3) )。

答案:(1)查询;(2)中断;(3)DMA

【43】典型的计算机结构包括( (1) ),通过( (2) )连接在一起。

答案:(1)CPU,MEM,I/O;(2)BUS

【44】在 1M 字节的存储器中,每个存储单元都有一个惟一的( (1) )位地址,称为

该物理单元的物理地址。

答案:(1)20

【45】指令中所用到的操作数可存放于( (1) ),( (2) )或( (3) )中。

答案:(1)寄存器;(2)存储器;(3)立即数

【46】CPU 是通过( (1) )来实现对 I/O 进行测试检查的。

答案:(1)硬件接口和 I/O 控制程序

【47】内中断有三类中断源,分别为( (1) ),( (2) ),( (3) )。

答案:(1)除法错误;(2)单步;(3)指令

【48】 8086 处理器的地址总线为( (1) )位,这也决定了其寻址的最大内存为( (2) )

字节。

答案:(1)20;(2)1M

【49】8086 处理器的工作寄存器总共有( (1) )个,分为( (2) ),( (3) ),

( (4) ),( (5) )4 类。

答案:(1)4;(2)数据;(3)指针及变址;(4)段;(5)控制

【50】当键盘中断发生时,CPU 能否响应由两个条件控制,一是( (1) ),二是( (2) )。

答案:(1)中断是否允许;(2)当前中断级别是否比键盘中断级别高

Page 11: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·7·

【51】文本方式下,显示屏上的每个字符在存储器中用( (1) )字节表示,其中字符

保存在( (2) )。

答案:(1)2;(2)低字节

【52】在 4 色图形显示方式中,屏幕上的一点在存储器中是用( (1) )个位保存的。

答案:(1)2

【53】8086/8088 20位物理地址由( (1) )位段地址和( (2) )位偏移地址组成。

答案:(1)16;(2)16

【54】为方便主机访问外设,外设中每个寄存器给予一个( (1) )地址。

答案:(1)I/O 端口

【55】计算机内部存储器分为( (1) )和( (2) )。

答案:(1)随机存储器(RAM);(2)只读存储器(ROM)

【56】程序设计语言是指用于编写程序的语言,主要包括( (1) ),( (2) ),

( (3) )。

答案:(1)机器语言;(2)汇编语言;(3)高级语言

【57】在存储器的堆栈区中需要一个( (1) ),用它来指明( (2) )的变化。

答案:(1)堆栈指示器;(2)栈顶地址

【58】有一个 1024K 位的存储器,它由 4 个存储体组成,每个存储体为 8K 字,则每个字

的字长是( (1) )位。

答案:(1)32

【59】在下列寻址方式中为了取出操作数,各需访问内存几次?

a.立即寻址( (1) )次,b.直接寻址( (2) )次,c.一级间接寻址( (3) )

次,d.二级间接寻址( (4) )次。

答案:(1)0;(2)1;(3)2;(4)3

【60】8088/8086 CPU 中,通用寄存器中的 SP 和 BP 为( (1) )寄存器,SP 的作用是

( (2) )的位置。

答案:(1)指针;(2)指出当前堆栈的栈顶

【61】8088/8086 指令系统中的算术运算指令,可实现( (1) )数或( (2) )数的

四则运算。

答案:(1)无符号;(2)有符号

Page 12: IBM-PC 汇编语言程序设计试题解

·8· IBM-PC 汇编语言程序设计试题解

【62】IBM-PC计算机的内存地址单位为( (1) )。IBM-PC计算机的字长为 16 位。每

个字占用( (2) )的地址码。

答案:(1)字节;(2)2个

【63】使用 Intel 8086 CPU 的 IBM-PC计算机控制寄存器 PSW由以下标志位组成:进位、

溢出位、零位、符号位以及( (1) )位、( (2) )位、( (3) )位、( (4) )

位、( (5) )位 9 个标志位。

答案:(1)奇偶标志;(2)辅助进位;(3)方向标志;(4)中断;(5)陷阱

【64】在基址变址寻址方式中,计算物理地址时 SS 堆栈段寄存器与( (1) )基址寄

存器配合使用。其物理地址可以表示为( (2) )。

答案:(1)BP;(2)(SS)×16d+(BP)+(SI)或(DI)

【65】无条件转移指令 JMP 可使用以下 4 种与转移有关的寻址方式:( (1) )、

( (2) )、( (3) )、( (4) )。

答案:(1)段内直接;(2)段内间接;(3)段间直接;(4)段间间接

【66】条件转移指令分为( (1) )、( (2) )、( (3) )、( (4) )。

答案:(1)根据单个条件标志的转移;(2)比较两个无符号数,并根据比较结果转移;

(3)比较两个有符号数,并根据比较结果转移;(4)测试 CX 的值为 0 则转移

【67】IBM-PC 计算机的指令长度与( (1) )和( (2) )有关,其中常用指令较

( (3) ),非常用指令较( (4) )。

答案:(1)指令;(2)寻址方式;(3)短;(4)长

【68】DMA方式即直接存储器存取方式主要适用于一些( (1) )的 I/O设备,如磁盘、磁

带、模数转换器等设备。

答案:(1)高速

【69】存储器的物理地址是由( (1) )和( (2) )组合而成的。

答案:(1)16 位段地址;(2)16 位偏移地址

【70】8086/8088 CPU 可访问两个独立的地址空间,一个为存储器地址空间,其大小为

( (1) )个字节;另一个为( (2) ),其大小为( (3) )个字节。

答案:(1)1M;(2)端口地址空间;(3)64K

Page 13: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·9·

【71】 CPU 的任务是执行存放在内存中的( (1) ),8086/8088 CPU 中共有( (2) )

个 16 位的寄存器。

答案:(1)指令序列;(2)14 个

【72】8086/8088 中的物理地址是由( (1) )位的( (2) )数构成的。

答案:(1)20;(2)无符号

【73】 IP 始终指向( (1) )指令的首地址,它与 CS 寄存器组合确定其相应的( (2) )

地址。

答案:(1)下一条;(2)物理

【74】寻址存储单元所需的偏移地址称为( (1) ),指令中的操作数如不在规定的段

区内,则必须在指令中指定段寄存器,这种方式一般称为( (2) )。

答案:(1)有效地址;(2)段超越

【75】 既可作为 16 位也可作为 8 位的数据寄存器有( (1) ),( (2) ),( (3) ),

( (4) )。

答案:(1)AX;(2)BX;(3)CX;(4)DX

1.3 指令及寻址

【76】 8086与数据有关的寻址方式有( (1) ),与转移地址有关的寻址方式有( (2) )。

答案:(1)立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基

址变址寻址,相对基址变址寻址;(2)段内直接寻址,段内间接寻址,段间直接寻址,段间

间接寻址

【77】8086 指令系统中,数据传送指令有( (1) )。

答案:(1)MOV,PUSH,POP,XCHG,XLAT,IN,OUT

【78】8086 指令系统中,地址传送指令有( (1) )。

答案:(1)LEA,LDS,LES

【79】8086 指令系统中,算术运算指令有( (2) )。

答案:(1)ADD,ADC,SUB,SBB,MUL,IMUL,DIV,IDIV,INC,DEC

【80】8086 指令系统中,逻辑运算指令有( (1) )。

答案:(1)AND,OR,XOR,NOT,TEST,SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR

【81】8086 指令系统中,符号位运算指令有( (1) )。

答案:(1)CWD,CBW,NEG

Page 14: IBM-PC 汇编语言程序设计试题解

·10· IBM-PC 汇编语言程序设计试题解

【82】8086 指令系统中,字符串指令有( (1) )。

答 案 :( 1 ) MOVS/MOVSB/MOVSW , STOS/STOSB/STOSW , LODS/LODSB/LODSW ,

SCAS/SCASB/SCASW,CMPS/CMPSB/CMPSW,REP,REPE/REPZ,REPNE/REPNZ

【83】8086 指令系统中,标志指令有( (1) )。

答案:(1)LAHF,SAHF,PUSHF,POPF,STC,CLC,CMC,STI,CLI,STD,CLD

【84】8086 指令系统中,程序控制指令有( (1) )。

答案:(1)CALL,RET,INT,RETI,NOP,HLT,...

【85】在 IBM-PC 机的输入/输出指令中,I/O 端口号通常是由 DX 寄存器提供的,但

有时也可以在指令中直接指定 00~FFH 的端口号。可直接由指令指定的 I/O 端口数是

( (1) )个。

答案:(1)256

【86】指出下列指令源操作数的寻址方式:

MOV AX,ARRAY[SI] ;( (1) )

MOV AX,ES:[BX] ;( (2) )

MOV AX,[200H] ;( (3) )

MOV AX,[BX+DI] ;( (4) )

MOV AX,BX ;( (5) )

MOV AX,1200H ;( (6) )

MOV AX,20[BX+SI] ;( (7) )

MOV AX,[DI+20] ;( (8) )

答案:(1)直接变址寻址方式;(2)寄存器间接寻址方式;(3)直接寻址方式;(4)基

址变址寻址方式;(5)寄存器寻址方式;(6)立即寻址方式;(7)相对基址变址寻址方式;

(8)直接变址寻址方式

【87】假设(SP)=0100H,(SS)=2000H,执行 PUSH BP 指令后,栈顶的物理地址是

( (1) )。

答案:(1)200FEH

【88】段地址和偏移地址为 3FFF:1234H,它的物理地址是( (1) ),段地址和偏移地

址为 2000H:000FH,它的物理地址是( (2) )。

答案:(1)41224H;(2)2000FH

【89】若要测试 AL 中操作数的第 0,3,4,7 位是否均为 0,然后根据结果实现条件

转移,可使用( (1) )指令,以产生转移条件。这条指令执行后将影响的标志位是

Page 15: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·11·

( (2) )。

分析:该题主要考查考生对位测试指令的掌握。位测试指令能够完成对字或字节操作数

的指定位进行零与非零的测试。正确使用位测试指令的关键在于正确选择逻辑测试常量,即

对指定测试的位取常数 1,其他位取 0。例如要测试 AL 的最高位时取逻辑测试常量 80H;要

测试 AL 的最低位时,取逻辑测试常量 01H;若要测 AL 是否为零,也就是测试 AL 的每一位是

否为零,则取逻辑测试常量为 0FFH。位测试指令的功能基本同逻辑乘指令,只是结果不回送,

仅影响状态标志位 ZF。

答案:(1)TEST AL,99H;(2)ZF

【90】假设(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H,当执

行指令“LES DI,[BX]”后(DI)=( (1) ),(ES)=( (2) )。

分析:源操作数的物理地址为:16d×(DS)+(BX)=B0000H+080AH=0B080AH,则(DI)

=05AEH,(ES)=4000H。

答案:(1)05AEH;(2)4000H

【91】现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)

=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,下列

指令执行后填入 AX 寄存器的内容:

MOV AX,1200H ;(AX)=( (1) )

MOV AX,BX ;(AX)=( (2) )

MOV AX,[1200H] ;(AX)=( (3) )

MOV AX,[BX] ;(AX)=( (4) )

MOV AX,1100[BX] ;(AX)=( (5) )

MOV AX,[BX][SI] ;(AX)=( (6) )

MOV AX,1100[BX][SI] ;(AX)=( (7) )

分析:(1)寻址方式为立即寻址,故(AX)=1200H;

(2)寻址方式为寄存器寻址,故(AX)=0100H;

(3)源操作数的物理地址为 20000H+1200H=21200H,故(AX)=4C2AH;

(4)源操作数的物理地址为 20000H+0100H=20100H,故(AX)=3412H;

(5)源操作数的物理地址为 20000H+1100H+0100H=21200H,故(AX)=4C2AH;

(6)源操作数的物理地址为 20000H+0100H+0002H=20102H,故(AX)=7856H;

(7)源操作数的物理地址为 20000H+1100H+0100H+0002H=21202H,故(AX)

=65B7H

答案:(1)1200H;(2)0100H;(3)4C2AH;(4)3412H;(5)4C2AH;(6)7856H;(7)

65B7H

【92】设(BX)=101H,(DS)=2100H,(CS)=1900H;内存中(21101H)=0C7H,(21102H)

=0FFH,(21103H)=00H,(21104H)=0F0H。执行如下指令后 CS 和 IP的值是多少?

JMP BX ;(CS)=( (1) ), (IP)=( (2) )

Page 16: IBM-PC 汇编语言程序设计试题解

·12· IBM-PC 汇编语言程序设计试题解

JMP [BX] ;(CS)=( (3) ), (IP)=( (4) )

JMP WORD PTR [BX+1] ;(CS)=( (5) ), (IP)=( (6) )

JMP DWORD PTR [BX] ;(CS)=( (7) ), (IP)=( (8) )

答案:(1)1900H;(2)101H;(3)1900H;(4)0FFC7H;(5)1900H;(6)0FFH;(7)

F000H;(8)0FFC7H

【93】设(SS)=4000H,(SP)=0200H,(AX)=(BX)=1234H。顺序执行 PUSH AX;PUSH BX

后,填入堆栈段数据存放内容。

偏移地址 堆栈内容

( (1) ) ( (2) )

( (3) ) ( (4) )

( (5) ) ( (6) )

( (7) ) ( (8) )

( (9) ) ( (10) )

( (11) ) ( (12) )

( (13) ) ( (14) )

答案:

偏移地址 堆栈内容

401FAH

401FBH

401FCH 34H

401FDH 12H

401FEH 34H

401FFH 12H

40200H

【94】假设(DS)=4000H,(BX)=0512H,(040512H)=17AEH,(040514H)=2000H,当执

行指令 LDS SI,[BX]后,(SI)=( (1) ),(DS)=( (2) )。

分析:源操作数的物理地址为:16d×(DS)+(BX)=40000H+0512H=040512H,则(SI)=

17AEH,(DS)=2000H。

答案:(1)17AEH;(2)2000H

【95】有两个 16 位字 1EE5H 和 2A3CH 分别存放在 IBM PC 机存储器的 000B0H 和 000B3H

单元中,请填写表中它们在存储器里的存放情况。

存储单元地址 000B0H 000B1H 000B2H 000B3H 000B4H

存储单元内容 ( (1) ) ( (2) ) ( (3) ) ( (4) ) ( (5) )

答案:

存储单元地址 存储单元内容(16 进制)

Page 17: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·13·

000B0H E5

000B1H 1E

000B2H ??

000B3H 3C

000B4H 2A

【96】试根据以下要求写出相应的汇编语言指令。

① 把 BX 寄存器和 DX 寄存器的内容相加,结果存入 DX 寄存器中。汇编语言指令:

( (1) );

② 用寄存器 BX和 SI 的基址变址寻址方式把存储器中的一个字节与 AL 寄存器的内容相

加,并把结果送到 AL 寄存器中。汇编语言指令:( (2) );

③ 用寄存器 BX 和位移量 0B2H 的寄存器相对寻址方式把存储器中的一个字和 CX 寄存器

的内容相加,并把结果送回存储器中。汇编语言指令:( (3) );

④ 用位移量为 0524H 的直接寻址方式把存储器中的一个字与数 2A59H 相加,并把结果

送回该存储单元中。汇编语言指令:( (4) );

⑤ 把数 0B5H 与 AL 寄存器的内容相加,并把结果送回 AL 寄存器中。汇编语言指令:

( (5) )。

答案:(1)ADD DX,BX;(2)ADD AL,[BX][SI];(3)ADD 0B2H[BX],CX;

(4)ADD WORD PTR[0524H],2A59H;(5)ADD AL,0B5H

【97】写出把首地址为 BLOCK 的字数组的第 6 个字送到 DX 寄存器的指令。使用:寄存器

间接寻址,指令为( (1) );寄存器相对寻址,指令为( (2) );基址变址寻址,指

令为( (3) )。

答案:

(1) LEA BX,BLOCK

ADD BX,10 ;从 1 开始计数

MOV DX,[BX]

(2) MOV DX,BLOCK[12]

(3) LEA BX,BLOCK

MOV SI,10

MOV DX,[BX][SI]

【98】假设(DS)=2000H,(BX)=1256H,(SI)=528FH,位移量 TABLE=20A1H,

(232F7H)=3280H,(264E5H)=2450H,则

① 执行指令 JMP BX 后,(IP)=( (1) );

② 执行指令 JMP TABLE[BX]后,(IP)=( (2) );

③ 执行指令 JMP [BX][SI]后,(IP)=( (3) )。

分析:(2)(IP)=(16d×(DS)+(BX)+TABLE)=(20000H+1256H+20AIH)=(232F7H)

=3280H

Page 18: IBM-PC 汇编语言程序设计试题解

·14· IBM-PC 汇编语言程序设计试题解

(3)(IP)=(16d×(DS)+(BX)+(SI))=(20000H+1256H+528FH)=(264E5H)=2450H

答案:(1)1256H;(2)3280H;(3)2450H

【99】调用指令 CALL 可分为( (1) )、( (2) )、( (3) )和( (4) )等

4 种调用。

答案:(1)段内直接调用;(2)段内间接调用;(3)段间直接调用;(4)段间间接调用

【100】指令 SAR 可用来( (1) )除 2,而指令 SHR 则可用来( (2) )除 2。

答案:(1)对带符号数;(2)对无符号数

【101】在 1000H 单元中有一条二字节指令 JMP SHORT LAB,如果其中偏移量分别为 30H、

55H、0AAH,则转向地址 LAB 的值分别为( (1) ),( (2) ),( (3) )。

分析:(1)1000H+2H+30H=1032H;(2)1000H+2H+55H=1057H;(3)1000H+2H+

0FFAAH=0FACH

答案:(1)1032H;(2)1057H;(3)0FACH

【102】条件转移指令的目标地址应在本条件转移指令的下一条指令地址的( (1) )

个字节范围内。

分析:条件转移指令是直接短转移,所以其转移的位移量是 8 位。

答案:(1)-128~+127

【103】在 0624H 单元内有一条二字节 JMP SHORT OBJ 指令,如其中位移量分别为 28H,

60H,0CCH,那么转向地址 OBJ 的值分别是( (1) )、( (2) )、( (3) )。

分析:(1)0624H+2H+28H=064EH;(2)0624H+2H+60H=0686H;(3)0624H+2H+

0FFCCH=05F2H

答案:(1)064EH;(2)0686H;(3)05F2H

【104】假设(SP)=0100H,(SS)=2000H,执行 PUSH BP 指令后,栈顶的物理地址是

( (1) )。

答案:(1)200FEH

【105】执行 XLAT 指令时,要将表首地址存放在( (1) )中,将偏移地址存放在

( (2) )中。

答案:(1)BX 寄存器;(2)AL 寄存器

【106】指令 AAA 是对( (1) )的加法修正,指令 DAA 是对( (2) )的加法修

正。

答案:(1)非压缩型 BCD 码;(2)压缩型 BCD 码

Page 19: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·15·

【107】执行指令 XOR AX,AX 的含义是( (1) )和( (2) )。

答案:(1)清 AX 寄存器;(2)同时设置有关标志位,如清 CF、OF 和设置 ZF 等

【108】两个无符号数进行比较时,可使用( (1) )标志位判断大小,在编程中可使

用( (2) )指令来实现。

答案:(1)CF;(2)JAE/JB(JC/JNC)

【109】若被乘数存放在 AX 中,乘数存放在 BX 中,执行指令 IMUL BX 后,其乘积存放在

( (1) ),并对( (2) )条件码产生影响。

答案:(1)DX:AX;(2)CF 和 OF

【110】若被除数存放在 AX 中,除数存放在 BL 中,执行指令 DIV BL 后,其商值存放在

( (1) )中,余数存放在( (2) )中。

答案:(1)AL;(2)AH

【111】串处理指令规定源寄存器使用( (1) ),源串在( (2) )段中;目的寄存

器使用( (3) ),目的串必须在( (4) )段中。

答案:(1)SI;(2)DS;(3)DI;(4)ES

【112】近过程(NEAR)的 RET 指令把当前栈顶的一个字弹出到( (1) );远过程(FAR)

的 RET 指令弹出一个字到( (2) )后又弹出一个字到( (3) );IRET指令是( (4) )

指令,它从堆栈顺序弹出三个字分别送到( (5) )、( (6) )和( (7) )中。

分析:对于近过程的调用,要将返回的 IP 压入堆栈。对于远过程的调用,要将 CS、IP

压入堆栈。对于中断处理程序,要将标志寄存器、返回的 CS 和 IP 压入堆栈保护起来。

答案:(1)IP;(2)IP;(3)CS;(4)中断返回;(5)IP;(6)CS;(7)标志寄存器 PSW

【113】一个有 16 个字的数据区,它的起始地址为 70A0:DDF6,那么该数据区的最后一个

字单元的物理地址为( (1) )H。

答案:(1)7E814

【114】令(AL)=98H,(BL)=12H,则执行指令MUL BL后,(AX)=( (1) ),(OF)=( (2) ),

(CF)=( (3) ); 而执行指令 IMUL BL后,它们的结果是(AX)=( (4) ),(OF)=( (5) ),

(CF)=( (6) )。

答案:(1)0AB0H;(2)1;(3)1;(4)0F8B0H;(5)1;(6)1

【115】已知(SI)=2000H,(BX)=1000H,(DS)=3000H,(33000H)=15981000H,(32000H)=

86050F34H,(DI)=4000H,(35000H)=79008A4CH。求下列指令执行完后 CS 及 IP 寄存器的内

容。

Page 20: IBM-PC 汇编语言程序设计试题解

·16· IBM-PC 汇编语言程序设计试题解

JMP SI ;(IP)=( (1) )

JMP [SI] ;(IP)=( (2) )

JMP [BX+SI] ;(IP)=( (3) )

JMP DWORD PTR [BX+DI] ;(IP)=( (4) );(CS)=( (5) )

答案:(1)2000H;(2)0F34H;(3)1000H;(4)8A4CH;(5)7900H

【116】已知(BX)=1000H,(DS)=2000H,(21000H)=3000H,(23000H)=4000H,则 XCHG

BX,[BX] 执行完后(BX)=( (1) ),((BX))=( (2) )(一个字的内容),(21000H)

=( (3) )(一个字的内容)。

答案:(1)3000H;(2)4000H;(3)1000H

【117】已知 (SP)=1000H,(SS)=3000H,(31000H)=2000H,(DS)=4000H,(BX)=1200H,

则 POP [BX]指令执行完后(SP)=( (1) );(41200H)=( (2) )(一个字的内容)。

答案:(1)1002H;(2)2000H

【118】已知:(AX)=4F08H,(CF)=0,(CL)=4,则 RCR AX,CL 指令执行完后(AX)

=( (1) ),(CF)=( (2) ),(CL)=( (3) )。

答案:(1)04F0H;(2)1;(3)4

【119】 INT中断指令将 CS,IP,PSW压入堆栈的次序依次为( (1) ),( (2) ),

( (3) )。中断向量共有( (4) )个。

答案:(1)PSW;(2)CS;(3)IP;(4)256

【120】执行加法时,如果两个操作数的符号相同,而结果的符号与之相反,则 OF=

( (1) )。

答案:(1)1

【121】PC 机 BIOS 显示中断类型号为( (1) ),它在中断向量表中的物理地址为

( (2) )。

答案:(1)10H;(2)00040H

【122】可用 DOS 功能调用(INT 21H)的功能号 AH=( (1) )来设置中断向量,用

功能号 AH=( (2) )来获取中断向量。

答案:(1)25H;(2)35H

【123】对于指令 CMP AX,BX,当 AX,BX 为带符号数时,若 AX>BX,则执行后标志位 ZF

=( (1) )、OF=( (2) )。

答案:(1)0;(2)SF

Page 21: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·17·

【124】存储器的地址区域( (1) )为中断向量区。

答案:(1)低 1K 字节

【125】 MOV CL,5

SAR WORD PTR [DI],CL

如指令执行前,(DS)=0F800H,(DI)=180AH,(0F980AH)=0064H则指令执行后,(0F980AH)

=( (1) ),CF=( (2) )。

答案:(1)0003H;(2)NC

【126】已知(AX)=8002H,(BX)=0001H,则指令 MUL BX 执行后,AX=( (1) ),DX=

( (2) );指令 IMUL BX 执行后,AX=( (3) ),DX=( (4) )。

答案:(1)8002H;(2)0000H;(3)8002H;(4)0FFFFH

【127】转移指令中,操作数的属性可为( (1) ),( (2) ),( (3) ),( (4) )。

答案:(1)段内直接;(2)段内间接;(3)段间直接;(4)段间间接

【128】循环指令的三种形式为( (1) ),( (2) ),( (3) )。

答案:(1)LOOP;(2)LOOPE/LOOPZ;(3)LOOPNE/LOOPNZ

【129】当发生除法溢出时,OF=( (1) )。

答案:(1)1

【130】一条指令的执行时间是取指令,取操作数,执行指令及传送结果等各阶段时间的

( (1) )。

答案:(1)总和

【131】逻辑运算是按( (1) )操作。

答案:(1)位

【132】访问堆栈的指令(如 PUSH)使用 SP 为偏移地址指针,只能使用( (1) )作为

段寄存器。

答案:(1)SS

【133】子程序的调用用指令( (1) ),返回用指令( (2) )。

答案:(1)CALL;(2)RET

【134】在汇编语言程序中,标号和变量均有三种属性,它们分别是:类型属性、( (1) )

和( (2) )。

答案:(1)段属性;(2)偏移属性

Page 22: IBM-PC 汇编语言程序设计试题解

·18· IBM-PC 汇编语言程序设计试题解

【135】中断处理程序执行处理时一般先保护现场,在中断处理( (1) )时恢复现场。

答案:(1)程序返回

【136】利用堆栈来传递参数,既可以传递参数的值又可以传递参数的( (1) )。

答案:(1)地址

【137】当 DF=0时,执行 LODSB,则寄存器( (1) )的内容可比执行此指令前多 1。

答案:(1)SI

【138】段间转移必须把转移地址存放在( (1) )中。

答案:(1)存储器

【139】假设(SS)=2250H,(SP)=0140H,如果在堆栈中存入 5 个数据,则栈顶的物理地址

为( (1) )H。如果又从堆栈中取出 3个数据,则栈顶的物理地址为( (2) )H。

答案:(1)22636;(2)2263C

【140】根据下面提供的 PC 机内存中的数据,INT 14H 中断服务程序的入口地址是

( (1) )。

0000:0040 B3 18 8A CC 4D F8 00 F0− − 41 F8 00 F0 C5 18 8A CC

0000:0050 39 E7 00 F0 A0 19 8A CC− − 2E E8 00 F0 D2 EF 00 F0

分析:中断程序的入口地址偏移部分存放在 14H×4处,段地址部分存放在 14H×4+2处。

答案:(1)F000:E739

【141】设 AL=20H,SI=0500H,DS=3000H,(30500H)=0C0H,(CF)=1。执行 SBB AL,[SI]

后,(AL)=( (1) ),(CF)=( (2) ),(SF)=( (3) )。

答案:(1)5FH;(2)1;(3)1

【142】设(BX)=1200H,(SI)=0002H,(DS)=3000H,(31200H)=50H,(31201H)=02H,

(31202H)=0F7H,(31203H)=90H,请写出下列各条指令单独执行后,有关寄存器及存储单元

的内容,若该指令影响 CF 标志位,则指出其值。

① DEC BYTE PTR[1200H] ;问:(31200H)=( (1) )H,CF=( (2) );

② SAR BYTE PTR[SI+1200H],1 ;问:(31202H)=( (3) )H,ZF=( (4) );

③ MOV AX,WORD PTR[BX+SI] ;问:AX=( (5) )H,SF=( (6) )。

答案:(1)4FH;(2)不变;(3)FBH;(4)0;(5)90F7H;(6)不变

【143】请用一条指令将寄存器 AL 的低四位取反,指令是( (1) )。

答案:(1)XOR AL,00001111B

【144】三个重复前缀指令为( (1) )、( (2) )、( (3) )。

Page 23: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·19·

答案:(1)REP;(2)REPE/REPZ;(3)REPNE/REPNZ

【145】设(CS)=25FFH,(DS)=2140H,(SS)=2510H,(BP)=02D0H,(SI)=0010H,(DI)

=0206H,

则①指令 MOV AX,[BP+SI+2]的源操作数有效地址为( (1) ),物理地址为( (2) )。

② 指令 MOV AX,[DI+100H]的源操作数有效地址为( (3) ),物理地址为( (4) )。

答案:(1)02D0H+10H+2H=02E2H;(2)25100H+02E2H=253E2H;(3)0206H+100H

=306H;(4)21400H+306H=21706H

【146】设(AX)=2000H,(BX)=2340H,则在执行了指令 CMP AX,BX 后,CF 标志值为

( (1) ),ZF 标志值为( (2) )。

答案:(1)1;(2)0

【147】数据串传送指令执行前应做( (1) )、( (2) )、( (3) )、( (4) )

四项准备工作。

答案:(1)把数据段中的源字符串的地址存入 SI;(2)把附加段中的目的字符串的地址

存入 DI;(3)数据串长度存入 CX;(4)建立方向标志

【148】给定(IP)=2BC0H,(CS)=0200H,位移量 D=5119H,(BX)=1200H,(DS)=212AH,(224A0)

=0600H,(275B9)=098AH,试为以下的转移指令找出转移的偏移地址。

① 段内直接寻址,偏移地址( (1) );

② 使用 BX及寄存器间接寻址方式的段内间接寻址,偏移地址( (2) );

③ 使用 BX及寄存器相对寻址方式的段内间接寻址,偏移地址( (3) )。

答案:(1)7CD9H;(2)600H;(3)1200H

【149】在汇编语言程序中,进行串操作时,常把 MOVS 和 STOS 指令与( (1) )联用,

并在此之前先把数据串的长度送入( (2) )寄存器中。

答案:(1)REP;(2)CX

【150】执行算术运算时,可以使用( (1) )标志位或( (2) )指令来判断两个无

符号数的大小。

答案:(1)CF;(2)JAE/JNB

【151】执行 JMP DWORD PTR OPR 指令后,将会改变( (1) )的内容,还要改变( (2) )

内容后才能转向目标地址处。

答案:(1)IP 寄存器;(2)CS 寄存器

【152】执行 PUSH CX指令后,SP指针内容应( (1) ),堆栈操作指令的执行结果( (2) )

标志位。

Page 24: IBM-PC 汇编语言程序设计试题解

·20· IBM-PC 汇编语言程序设计试题解

答案:(1)减 2;(2)不影响

【153】设(SS)=0FFA0H,(SP)=00B0H,(AX)=8057H,(BX)=0F79H,执行指令“PUSH AX”

后,(SP)=( (1) );再执行指令:PUSH BX;POP AX后,(SP)=( (2) ),(AX)=( (3) ),

(BX)=( (4) )。

分析:堆栈区和 SP 的内容变化过程示意图如下:

SP 57H 0FFAAEH

80H 0FFAAFH

SP 0FFAB0H 0FFAB0H

开始 PUSH AX 后

79H 0FFAACH 79H 0FFAACH

0FH 0FFAADH 0FH 0FFAADH

57H 0FFAAEH 57H 0FFAAEH

80H 0FFAAFH 80H 0FFAAFH

0FFAB0H 0FFAB0H

PUSH BX 后 POP AX 后

答案:(1)00AEH;(2)00AEH;(3)0F79H;(4)0F79H

【154】填写下表

指令 中文意义 发生转移的条件

JA

JAE

JNA

JNAE

JNC

JCXZ

JE

JL

JLE

JNL

JNLE

JNO

JS

JP

JPO

答案:

指令 中文意义 发生转移的条件

JA 无符号数:> CF=0 且 ZF=0

JAE 无符号数:>= CF=0

Page 25: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·21·

JNA 无符号数:<= CF=1 或 ZF=1

JNAE 无符号数:< CF=1

JNC 无进位 CF=0

JCXZ CX=0 CX=0

JE 相等 ZF=1

JL 有符号数:< SF≠OF

JLE 有符号数:<= ZF=1 或 SF≠OF

JNL 有符号数:>= ZF=OF

JNLE 有符号数:> ZF=0 且 SF=OF

JNO 没溢出 OF=0

JS 为负 SF=1

JP 偶数个 1 PF=1

JPO 奇数个 1 PF=0

【155】若(SP)=0FFFFH,则指令 POP AX 执行后,(SP)=( (1) )。

答案:(1)0001H

【156】设(AX)=0304H,(BX)=0FF00H,则执行指令 AND AX,BX 后,(AX)=( (1) )。

答案:(1)0300H

【157】请用一条指令将 AX 中划“X”的位清 0,该指令是( (1) )。

15 8 7 0

X X

答案:(1)AND AX,1111 1110 0111 1111B

【158】下面程序

SUB AL,AH

DAS

若指令执行前,(AL)=86,(AH)=07;则指令执行后,(AL)=( (1) ),CF=( (2) ),

AF=( (3) )。

答案:(1)49H;(2)NC;(3)AC

【159】设(DS)=2000H,(ES)=3000H,(SS)=4000H,(BX)=1000H,(BP)=1000H,(SI)=

0001H,(DI)=0002H,(21000H)=1234H,(21002H)=5678H,(31000H)=9ABCH,(31002H)=0DEF0H,

(41000H)=3456H,(41002H)=789AH,计算下列各指令中源操作数的物理地址,并指出指令执

行后 AX 寄存器的内容。

MOV AX,ES:[1000H] ;物理地址( (1) ),(AX)=( (2) )

MOV AX,[BX] ;物理地址( (3) ),(AX)=( (4) )

MOV AX,[BP+DI] ;物理地址( (5) ),(AX)=( (6) )

MOV AX,[BX][SI] ;物理地址( (7) ),(AX)=( (8) )

Page 26: IBM-PC 汇编语言程序设计试题解

·22· IBM-PC 汇编语言程序设计试题解

答案:

(1)31000H;(2)9ABCH;(3)21000H;(4)1234H;(5)41002H;(6)789AH;(7)21001H;

(8)7812H

1.4 伪 指 令

【160】数据定义与存储器分配的伪操作有( (1) )。

答案:(1)DB,DW,DD,DQ,DT,DUP,STRUC/ENDS,RECORD,?

【161】地址计数器与对准伪操作有( (1) )。

答案:(1)ORG,$,EVEN

【162】有关操作数的伪指令中,算术操作符有( (1) ),逻辑操作符有( (2) ),

关系操作符有( (3) ),数值回送操作符有( (4) ),属性操作符有( (5) ),基

数控制伪操作是( (6) )。

答案:(1)+,-,*,/,MOD;(2)AND,OR,XOR,NOT,SHL,SHR;(3)EQ,NE,LT,

GT,LE,GE;(4)TYPE,SIZE,LENGTH,OFFSET,SEG;(5)PTR,:,SHORT,THIS,HIGH,

LOW;(6).RADIX

【163】下面两个语句的区别在于( (1) )、( (2) )。

X1 EQU 1000H

X2=1000H

答案:(1)X1不能多次赋值;(2)X2 可以多次赋值

【164】设 (DS)=2000H

ORG 2100H

TABLE DB 10,3*5,10H

ADDRESS DD TABLE

ARRAY DW 2 DUP(3827H,?)

写出下列各单元的内容:

(2100H)=( (1) ) (2101H)=( (2) ) (2102H)=( (3) )

(2103H)=( (4) ) (2104H)=( (5) ) (2105H)=( (6) )

(2106H)=( (7) ) (2107H)=( (8) ) (2108H)=( (9) )

(2109H)=( (10) ) (210AH)=( (11) ) (210BH)=( (12) )

(210CH)=( (13) ) (210DH)=( (14) ) (210EH)=( (15) )

答案:

(1) 0AH; (2) 0FH; (3) 10H;

(4) 00H; (5) 21H; (6) 00H;

(7) 20H; (8) 27H; (9) 38H;

(10) ??H; (11) ??H; (12) 27H;

(13) 38H; (14) ??H; (15) ??H

Page 27: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·23·

【165】对于下面的数据定义,各条 MOV 指令单独执行后,请填充有关寄存器的内容:

TABLE1 DB ?

TABLE2 DW 20 DUP(?)

TABLE3 DB 'ABCD'

......

MOV AX,TYPE TABLE1 ;(AX)=( (1) )

MOV BX,TYPE TABLE2 ;(BX)=( (2) )

MOV CX,LENGTH TABLE2 ;(CX)=( (3) )

MOV DX,SIZE TABLE2 ;(DX)=( (4) )

MOV SI,LENGTH TABLE3 ;(SI)=( (5) )

分析:字节变量和字变量的类型值分别为 1 和 2。SIZE 的值是 LENGTH 值和 TYPE 值的乘

积。

答案:(1)1;(2)2;(3)20;(4)40;(5)1

【166】对于下面的数据定义:

A1 DW 20 DUP(?)

A2 DB 20 DUP(?)

A3 DB '987654321'

........

MOV AX,LENGTH A1

MOV BX,LENGTH A2

MOV CX,LENGTH A3

各条指令执行后,相应寄存器的内容为:(AX)=( (1) ),(BX)=( (2) ),

(CX)=( (3) )。

分析:操作符 LENGTH 对于变量中使用 DUP 的情况,汇编程序将回送分配给该变量的单

元数。而对于其他情况则回送 1。

答案:(1)20;(2)20;(3)1

【167】指令“AND AX,STR1 AND STR2”中,STR1和 STR2 是两个已赋值的变量,两个 AND

的区别是( (1) ),( (2) )。

答案:(1)第一个 AND是逻辑“与”指令;(2)第二个 AND 是逻辑“与”操作符

【168】对于指令:

MOV BX,((PORT_VAL LT 5)AND 20)OR((PORT_VAL GE 5)AND 30)

当 PORT_VAL<5 时,汇编结果为

MOV BX,( (1) );

否则,汇编结果为

MOV BX,( (2) )。

Page 28: IBM-PC 汇编语言程序设计试题解

·24· IBM-PC 汇编语言程序设计试题解

答案:(1)20;(2)30

【169】对于下面的数据定义:

A1 DW 20 DUP(?)

A2 DB 20 DUP(?)

A3 DB '987654321'

...

MOV AX,TYPE A1

MOV BX,LENGTH A2

MOV CX,SIZE A3

各条指令执行后,相应寄存器的内容为:(AX)=( (1) ),(BX)=( (2) ),(CX)

=( (3) )。

分析:操作符 TYPE返回变量类型 DB=1,DW=2,DD=4,DQ=8,DT=10,NEAR=-1,FAR

=-2。操作符 LENGTH对于变量中使用 DUP的情况,汇编程序将回送分配给该变量的单元数。而

对于其他情况则回送 1。操作符 SIZE返回变量 BYTE数。

答案:(1)2;(2)20;(3)1

【170】数据定义语句

BUF1 DW ?

BUF2 EQU BYTE PTR BUF1

当汇编后,PTR 类型操作符使 BUF2 具有与 BUF1 相同的( (1) )和( (2) ),但

类型为( (3) )。

分析:本题主要考查对属性操作符 PTR 的掌握。PTR 用来建立一个符号地址,但它本身

并不分配存储器,只是用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型。

答案:(1)段地址;(2)偏移地址;(3)字节

【171】( (1) )是过程定义结束伪指令,与( (2) )配套使用。( (3) )是

段定义结束伪指令,与( (4) )配套使用,或是结构定义结束伪指令,与( (5) )配

套使用。( (6) )是宏定义结束伪指令,与( (7) )配套使用。( (8) )是一个源

模块汇编结束伪指令。

答案:(1)ENDP;(2)PROC;(3)ENDS;(4)SEGMENT;(5)STRUC;(6)ENDM;(7)MACRO;

(8)END

【172】DT 伪指令中定义的每个操作数占有( (1) )个字节。

答案:(1)10

【173】DQ 伪指令中定义的每个操作数占有( (1) )个字节。

答案:(1)8

Page 29: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·25·

【174】循环程序可由( (1) ),( (2) ),( (3) )三部分组成。

答案:(1)设置循环初始状态;(2)循环体;(3)循环控制部分

【175】子程序的变量传送方式有( (1) ),( (2) ),( (3) ),( (4) )等。

答案:(1)通过寄存器传输;(2)同源文件中直接访问模块中的变量;(3)通过地址表;

(4)通过堆栈传送参数或参数地址

【176】宏定义体是一组具有( (1) )功能的程序段,宏指令语句是( (2) )语句

的另一种形式。

答案:(1)独立;(2)指令

【177】良好的程序设计应满足的要求是:程序结构化、执行( (1) )及( (2) )。

答案:(1)速度快;(2)占用存储空间少

【178】已知指令 ARRAY DB 2 DUP(1 DUP(3)),则该指令分配( (1) )字节单元,

指令 MOV AX,LENGTH ARRAY,执行后,AX=( (2) );

指令 MOV AX,SIZE ARRAY,执行后,AX=( (3) )。

答案:(1)2;(2)2;(3)2

【179】指令 MOV BX,((4 LT 5)AND 20)OR((4 GE 5)AND 30)汇编后变为( (1) )。

答案:(1)MOV BX,20

【180】指令 MOV AX,HIGH 1280H 执行后 AX=( (1) )。

答案:(1)0012H

【181】过程调用 CALL SUBST 的属性是由( (1) )决定的。

答案:(1)SUBST 的属性

【182】汇编程序产生二进制的目标文件 OBJ,但 OBJ 还必须使用( (1) )转换成可直

接执行的 EXE 文件。

答案:(1)连接程序

【183】连接程序把若干个模块连接起来成为可( (1) )的系统。

答案:(1)执行

【184】过程的属性有( (1) )和( (2) )。

答案:(1)NEAR;(2)FAR

【185】指令只可存放在( (1) )段中。

Page 30: IBM-PC 汇编语言程序设计试题解

·26· IBM-PC 汇编语言程序设计试题解

答案:(1)代码

【186】在使用伪指令语句进行定义说明时,常用的属性操作符有三种,它们是段操作符、

( (1) )和( (2) )。

答案:(1)PTR;(2)SHORT

【187】在指令和伪指令中可直接使用“$”表示地址计数器的( (1) ),ORG 伪指令

后给定的数值应是一个( (2) )数。

答案:(1)当前值;(2)正整

【188】中断返回时要恢复( (1) )和( (2) )才能返回主程序继续执行。

答案:(1)程序断点地址;(2)被中断前的程序状态字

【189】 在汇编语言中,所使用的三种基本语句分别是( (1) )、( (2) )和( (3) )。

答案:(1)指令语句;(2)伪指令语句;(3)宏指令语句

【190】DB 指令以( (1) )为单位分配存储;DD 指令以( (2) )为单位分配存储。

故如下数据定义:

V1 DB 4 DUP(2),2

COUNT EQU 10

V2 DD COUNT DUP(?)

为变量 V1 分配( (3) )个字节存储;为变量 V2 分配( (4) )个字节存储。

答案:(1)字节;(2)4字节;(3)5;(4)40

【191】PC-DOS系统中设置了两层内部子程序可供用户使用,即( (1) )调用和( (2) )

功能的调用。

答案:(1)BIOS 中断;(2)DOS

【192】进行子程序设计时,应该考虑程序的模块化、结构化和自( (1) )向

( (2) )的程序设计。

答案:(1)顶;(2)下

【193】在子程序结构中,若一个子程序调用该子程序本身,则称为( (1) )调用,

而且这种调用是子程序( (2) )的特例。

答案:(1)递归;(2)嵌套

【194】宏定义体包括实现子功能的指令和伪操作,如果宏定义体中有一个或多个标号,

则必须用( (1) )伪操作列出所有的标号。

答案:(1)LOCAL

Page 31: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·27·

【195】数据段中有以下定义:

ARRAY1 EQU 16H

ARRAY2 DW 16H

请指出下面两条指令的寻址方式:

MOV AX,ARRAY1 ;寻址方式:( (1) )

MOV AX,ARRAY2 ;寻址地址:( (2) )

分析:对于 ARRAY1,它是一个符号常量名,代表 16H 这个数;对于 ARRAY2,它是一个

字变量,它表示 16H 这个数所占存储单元的偏移地址。

答案:(1)立即寻址方式;(2)直接寻址方式

【196】根据下面的指令序列,CX 寄存器中的值应该是( (1) )。

SHR1 DW 'AB'

SHR2 DB 16 DUP(?)

CNT EQU $− SHR1

MOV CX,CNT

答案:(1)12H

【197】 ORG 1000H

X DB 12H

Y DW X

Z DD Y

(DS)=3879H,(BX)=1000H,(SI)=0002H

求下列指令执行完后指定寄存器的内容

MOV AX,[1000H] ;(AX)=( (1) )

MOV AX,[BX] ;(AX)=( (2) )

MOV AX,[BX+SI] ;(AX)=( (3) )

MOV AX,[Y+1] ;(AX)=( (4) )

LEA DX,X ;(DX)=( (5) )

LDS SI,Y ;(SI)=( (6) );(DS)=( (7) )

答案:(1)0012H;(2)0012H;(3)0110H;(4)0110H;(5)1000H;(6)1000H;

(7)1001H

【198】 ORG 100H

X=2

REPT 1

DD X

X=X+1

ENDM

Page 32: IBM-PC 汇编语言程序设计试题解

·28· IBM-PC 汇编语言程序设计试题解

执行前(DS)=02345H,汇编后生成的代码为:

( (1) )

( (2) )

答案:(1)ORG 100H;(2)DD 2

【199】 ORG 1000H

X DB 12H

Y DW X− $+1001H

Z DD Y

设(DS)=1234H,(BX)=1000H,(SI)=0002H,求下列指令执行完后指定寄存器的值。

MOV AX,[Y+1] ;(AX)=( (1) )

LDS SI,Z ;(SI)=( (2) )H,(DS)=( (3) )H。

JMP Z-1 ;(CS)=( (4) )H,(IP)=( (5) )H。

PUSH Y ;栈顶的内容为( (6) )H。

答案:(1)0110H;(2)1001;(3)1234H;(4)3410;(5)0110;(6)1000

【200】在循环体中主要解决两个问题,其一,必须要设置控制计算机( (1) )某公

共程序段的指令;其二,必须要对( (2) )进行修改。

答案:(1)重复执行;(2)循环参数

【201】在汇编语言程序中,多分支结构主要有三种形式:逻辑分解法、( (1) )和

( (2) )。

答案:(1)转移表法;(2)地址表法

【202】在多分支结构程序设计中,转移表的表地址为( (1) ),地址表的表地址为

( (2) )。

答案:(1)模式字低 4位×3+转移表首地址;(2)编号×2+入口地址表首地址

【203】二重循环中的内层循环可以有多个,但它们之间的关系是( (1) ),而不能是

( (2) )。

答案:(1)并列的;(2)嵌套的

Page 33: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·29·

1.5 程 序 分 析

【204】分析下面程序段,回答指定问题:

MOV AX,0123H

MOV BX,0321H

PUSH AX

PUSH BX

POP AX

POP BX

请问:(AX)=( (1) ),(BX)=( (2) )。

分析:本题主要考查考生掌握堆栈的基本概念和压栈、弹栈的操作过程。根据堆栈操作先

进后出的特点,该程序段完成将AX和BX寄存器的内容互换。因此程序段运行结果为AX=0321H,

BX=0123H。

答案:(1)0321H;(2)0123H

【205】分析下面程序段,回答指定问题:

MOV CX,DX

NOT CX

ADD CX,DX

INC CX

请问:(CX)=( (1) ),(ZF)=( (2) )。

分析:寄存器 DX 的初始值不知道,并不影响解答。因为要求回答寄存器 CX 的内容,是

与寄存器 DX的初始值无关的。即不论 DX 原为何值,经过原码加反码运算后,CX 的值一定是

全 1,此时,再对 CX 的内容加 1 运算后,得出结果 CX=0,且 ZF=1。

答案:(1)0;(2)1

【206】分析下面程序段,回答指定问题:

XOR AX,AX

INC AX

NEG AX

MOV BX,3FFFH

ADC AX,BX

请问:(AX)=( (1) ),(BX)=( (2) ),(CF)=( (3) )。

分析:对该程序段分析时,不仅要正确分析每条指令执行后目的操作数的结果,还要特

别注意对标志位的影响,否则涉及到 ADC AX,BX 的分析就会出现错误。下面我们不妨对每条

指令进行分析注解,就可得出正确的答案。

XOR AX,AX ;(AX)=0

INC AX ;(AX)=1

NEG AX ;(AX)=0FFFFH, (CF)=1

Page 34: IBM-PC 汇编语言程序设计试题解

·30· IBM-PC 汇编语言程序设计试题解

MOV BX,3FFFH ;(BX)=3FFFH

ADC AX,BX ;(AX)=0FFFFH+3FFFH+1=3FFFH, (CF)=1

答案:(1)3FFFH;(2)3FFFH;(3)1

【207】现有程序段如下:

MOV AL,32H

ADD AL,2AH

SAL AL,1

HLT

请问:程序执行后(AL)=( (1) )。

答案:(1)0B8H

【208】分析下面程序段,回答指定问题:

MOV AX,0099H

MOV BL,88H

ADD AL,BL

DAA

ADC AH,0

请问:(AX)=( (1) ),(CF)=( (2) )。

分析:该题主要考查对 BCD 码加法运算有关知识的掌握。我们知道采用 BCD 码加法调整

指令 DAA,可完成组合型 BCD 码加法运算。将被加数 99H 和加数 88H 看成是 BCD 码 88和 99,

相加并经调整后应该是十进制数 187。此时 AL 中应存放 87H,百位数 1 应存放在进位位 CF

中,再经过 AH+0+CF=0+0+l→AH,使 AX=0187H,并使 CF=0。

答案:(1)0187;(2)0

【209】执行下列程序后,回答指定问题:

FIND MACRO X,Y,Z

LOCAL @801,@802

MOV AX,X

CMP AX,Y

JBE @801

MOV AX,Y

@801: CMP AX,Z

JBE @802

MOV AX,Z

@802: ENDM

CODE SEGMENT

ASSUME CS:CODE

FIND 21,60,40H

Page 35: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·31·

HLT

CODE ENDS

请问:① 该程序的功能是( (1) )。

② 程序执行后以(AX)=( (2) )。

答案:(1)在 3 个无符号数中找出最小的一个数;(2)15H

【210】试分析下列程序段:

ADD AX,BX

JNO L1

JNC L2

SUB AX,BX

JNC L3

JNO L4

JMP SHORT L5

如果 AX 和 BX 的内容分别给定如下,写出该程序执行完后,程序转向哪里?

AX(16 进制) BX(16 进制)

14C6 80DC 程序转向( (1) )

B568 54B7 程序转向( (2) )

42C8 608D 程序转向( (3) )

DO23 9FD0 程序转向( (4) )

9FD0 D023 程序转向( (5) )

答案:(1)L1;(2)L1;(3)L2;(4)L5;(5)L5

【211】现有程序段如下:

MOV CX,63H

MOV AX,1

MOV BX,2

@100: ADD AX,BX

INC BX

LOOP @100

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(AX)=( (2) )。

答案:(1)实现 1+2+3+……+100 的累加和;(2)13BAH,即:(1+100)×55=5050

【212】下列程序段运行后,A 单元的内容为( (1) )。

DATA SEGMENT

A DW 0

B DW 0

Page 36: IBM-PC 汇编语言程序设计试题解

·32· IBM-PC 汇编语言程序设计试题解

C DW 230,20,54

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START PROC FAR

PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET C

MOV AX,[BX]

MOV B,AX

MOV AX,2[BX]

ADD AX,B

MOV A,AX

RET

START ENDP

CODE ENDS

END START

分析:数据定义如下:

地 址 数 据

A +0 0/250d

+1 0

B +0 0/230d

+1 0

C +0 230d

+1 0

+2 20d

+3 0

+4 54d

+5 0

程序运行的情况如下:

MOV BX,OFFSET C ;(BX)=4

MOV AX,[BX] ;(AX)=230

MOV B,AX ;(B)=230

MOV AX,2[BX] ;(AX)=20

ADD AX,B ;(AX)=230+20=250

MOV A,AX ;(A)=250

答案:(1)250

Page 37: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·33·

【213】执行下列程序后,回答指定问题:

MOV BL,5

MOV BH,9

MOV CX,5

@100: PUSH BX

CALL SUB1

CALL SUB2

POP BX

DEC BL

SUB BH,2

LOOP @100

HLT

SUB1 PROC

@200: MOV DL,20H

MOV AH,2

INT 21H

INC BL

CMP BL,9

JBE @200

RET

SUB1 ENDP

SUB2 PROC

@300: MOV DL,"*"

MOV AH,2

INT 21H

DEC BH

JNZ @300

MOV DL,0DH

MOV AH,2

INT 21H

MOV DL,0AH

MOV AH,2

INT 21H

RET

SUB2 ENDP

请问:① 该程序的功能是( (1) )。

② 程序执行后屏幕显示的内容是( (2) )。

答案:(1)图形显示;(2)第 1 行先显示 5 个空格,然后显示 9 个星号,以后每行多显

示 1 个空格,少显示 2个星号,共显示 5 行

Page 38: IBM-PC 汇编语言程序设计试题解

·34· IBM-PC 汇编语言程序设计试题解

*********

*******

*****

***

*

【214】下列指令执行后,请指出相关标志位的值。

MOV BL,67

ADD BL,0BDH

HLT

(CF)=( (1) ),(SF)=( (2) ),(ZF)=( (3) ),(OF)=( (4) )

答案:(1)1;(2)0;(3)1;(4)0

【215】程序段如下:

DATA SEGMENT

ORG 2000H

TWO=2

NUM DB 3,4

WORDS DW 1011H,2022H

CHAR1 DB '13'

WORK DB 2 DUP(?)

TEN EQU 10

CHAR2 DB '5'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

MAIN PROC FAR

START: PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV AL,TWO

MOV WORK,AL

TWO=TWO− 1

ADD AL,TWO

MOV WORK+1,AL

RET

MAIN ENDP

Page 39: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·35·

CODE ENDS

END START

程序执行后,内存单元 DS:2000H~DS:200AH 的值分别是( (1) )、( (2) )、

( (3) )、( (4) )、( (5) )、( (6) )、( (7) )、( (8) )、( (9) )、

( (10) )、( (11) ),TWO的值为( (12) )。

分析:数据段内存示意图如下:

2000H +0 03H NUM 2000H +6 31H CHAR1

+1 04H +7 33H

+2 11H WORDS +8 02H WORK

+3 10H +9 03H

+4 22H +0A 35H CHAR2

+5 20H

答案:(1)03H;(2)04H;(3)11H;(4)10H;(5)22H;(6)20H;(7)31H;(8)33H;

(9)02H;(10)03H;(11)35H;(12)01H

【216】现有程序段如下:

MOV AL,61H

SUB AL,20H

MOV BYTE PTR X1,AL

MOV BL,41H

ADD BL,20H

MOV BYTE PTR X2,BL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(X1)=( (2) ),(X2)=( (3) )。

答案:(1)将小写字母 a 转换成大写字母 A,大写字母 A 转换成小写字母 a;(2)41H;

(3)61H

【217】现有程序段如下:

CS:0150H AV1: MOV AL,2EH

:0152H AV2: DEC AL

:0154H CMP AL,2BH

:0156H JNB AV2

:0158H JNC AV1

:015AH HLT

请问:①程序执行后(AX)=( (1) )。

② JNC 指令的第二个字节内容是( (2) )。

分析:JNC指令的第二个字节内容是表示跳转的 8bit位移量,即:015AH+位移量=0150H,

位移量=0F6H

Page 40: IBM-PC 汇编语言程序设计试题解

·36· IBM-PC 汇编语言程序设计试题解

答案:(1)2AH;(2)0F6H

【218】现有程序段如下:

X0R AX,AX

MOV AX,6C5AH

MOV CX,0203H

RCL AH,CL

XCHG CH,CL

RCR AL,CL

HLT

请问:程序执行后(AX)=( (1) ),(CF)=( (2) )。

答案:(1)6156H;(2)1

【219】现有程序段如下: 时钟周期数

MOV BL,200 4T

BEGIN: MOV CL,250 4T

DON: LOOP DON 17/5T

DEC BL 3T

JNZ BEGIN 16/4T

HLT 2T

请问:上述程序执行后所需的时间是( (1) )。

答案:(1)(200×((250×17-12)+4+3+16)-12+4+2)T

【220】执行下面的程序段后,(AL)=( (1) )。

BUF DW 2152H,3416H,5731H,4684H

...

MOV BX,OFFSET BUF

MOV AL,3

XLAT

答案:(1)34H

【221】执行下列程序后,回答指定问题:

DATA SEGMENT

STR DB 'ABCDEFGHIJK'

COUNT EQU $− STR

POINT DB 3

DATA ENDS

...

Page 41: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·37·

LEA SI,STR

MOV DI,SI

ADD SI,POINT

ADD DI,COUNT− 1

@100: MOV AH,[SI+1]

MOV [SI],AH

INC SI

CMP SI,DI

JNZ @100

MOV BYTE PTR[SI],0

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后以 STR 开始的单元中存放的内容是( (2) )。

答案:(1)对 STR 中给出的字符串,按 POINT中给出的位置数,删除 STR 中相对应位置

上的字符,并在字符串后面补 0;(2)'ABCEFGHIK',0

【222】已知(DS)=1234H,(SI)=0124H,(12464H)=30ABH,(12484H)=0464H,程序段

如下:

LEA SI,[SI]

MOV AX,[SI]

MOV [SI+22H],1200H

LDS SI,[SI+20H]

ADD AX,[SI]

HLT

请问:上述程序段执行后(DS)=( (1) ),(SI)=( (2) ),(AX)=( (3) )。

答案:(1)1200H;(2)464H;(3)6156H

【223】现有程序段如下:

XOR BX,BX

MOV DX,0

MOV CX,10

@100: INC BX

MOV AX,BX

MUL AL

ADD DX,AX

LOOP @100

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(DX)=( (2) )。

Page 42: IBM-PC 汇编语言程序设计试题解

·38· IBM-PC 汇编语言程序设计试题解

答案:(1)实现 12+2

2+……+10

2的累加和;(2)0181H,即:

61 )( 2 n1 )( nn +×+×

621 11 0) ××

=

【224】阅读下列程序:

DS_SEG SEGMENT

COUNT DB 4

BLK1 DB 96H,74H,32H,16H

BLK2 DB 65H,94H,87H,29H

BLK3 DB 4 DUP(?)

DS_SEG ENDS

CS_SEG SEGMENT

MAIN PROC FAR

ASSUME CS:CS_SEG,DS:DS_SEG

START: PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DS_SEG

MOV DS,AX

MOV SI,OFFSET BLK1

MOV DI,OFFSET BLK2

MOV BX,OFFSET BLK3

MOV CL,[COUNT]

MOV CH,0

CLC

NEXT: MOV AL,[SI]

INC SI

ADC AL,[DI]

INC DI

DAA

MOV [BX],AL

INC BX

LOOP NEXT

RET

MAIN ENDP

CS_SEG ENDS

END START

该程序执行后,请填入 BLK3 的偏移地址和其中各字节单元的内容。

Page 43: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·39·

偏移地址 单元内容

( (1) ) ( (2) ) BLK3

( (3) ) ( (4) )

( (5) ) ( (6) )

( (7) ) ( (8) )

另外,(AL)=( (9) ),(DI)=( (10) )。

分析:DAA 是加法的十进制调整指令,它执行的操作是:(AL)←把 AL 中的和调整到压

缩的 BCD 格式。

这条指令执行之前必须执行 ADD 或 ADC 指令,加法指令必须把两个压缩的 BCD 码相加,

并把结果存放在 AL 寄存器中。本指令调整的方法是:如果 AL 寄存器的低 4 位是十六进制的

A~F,则 AL寄存器内容加 06H,且将 AF 标志置为 1;如果 AL 寄存器的高 4 位是十六进制的

A~F,则 AL 寄存器内容加 60H,且将 CF 标志置为 1。DAA 指令对 OF 标志无定义,但它影响

所有其他条件标志。

答案:(1)0009A;(2)61H;(3)000AH;(4)69H;(5)000BH;(6)20H;(7)00CH;

(8)46H;(9)46H;(10)0009H

【225】现有程序段如下:

MOV AX,0506H

MOV BL,06H

AAD

DIV BL

HLT

请问:① 该程序段的功能是( (1) )。② 程序执行后(AX)=( (2) )。

答案:(1)实现两个未压缩型 BCD码数的除法操作;(2)0209H

【226】执行下列程序后,回答指定问题。

MOV BL,6

MOV SI,30

@100: PUSH SI

CALL SUB1

CALL SUB2

POP SI

DEC SI

DEC BL

JNZ @100

HLT

SUB1 PROC

@200: MOV DL,20H

MOV AH,2

Page 44: IBM-PC 汇编语言程序设计试题解

·40· IBM-PC 汇编语言程序设计试题解

INT 21H

DEC SI

JNZ @200

RET

SUB1 ENDP

SUB2 PROC

MOV CX,8

@300: MOV DL,'*'

MOV AH,2

INT 21H

LOOP @300

MOV DL,0DH

MOV AH,2

INT 21H

MOV DL,0AH

INT 21H

RET

SUB2 ENDP

请问:① 该程序的功能是( (1) )。

② 程序执行后屏幕显示的内容是( (2) )。

答案:(1)图形显示;(2)第 1 行先显示 30 个空格,然后显示 8 个星号,以后每行少

显示 1 个空格,共显示 6 行

********

********

********

********

********

********

【227】(AL)=9AH,(BL)=0BCH,在分别进行下列指令运算后,请写出标志位的内容:

(1)ADD AL,BL :ZF=___,PF=___,CF=___,SF=___,OF=___

(2)SUB AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___

(3)AND AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___

(4)OR AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___

(5)XOR AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___

分析:(1) ADD AL,BL 10011010(9AH)

+ 10111100

101010110

(0BCH)

所以, ZF= 0,PF=1,CF=1,SF=0,OF=1

Page 45: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·41·

(2) SUB AL,BL 10011010(9AH) 10011010

- 10111100(OBCH)

11011110

+01000100

所以,ZF=0,PF=1,CF=1,SF=1,OF=0

(3)对于“与”、“或”和“异或”逻辑运算,将使 CF=OF=0,而 SF,ZF 和 PF 则根据

运算结果设置。

AND AL,BL 10011010(9AH)

(与)10111100

10011000

(0BCH)

所以,ZF=0,PF=0,CF=0,SF=1,OF=0

(4)OR AL,AL 10011010(9AH)

(或)10111100

10111110

(0BCH)

所以,ZF=0,PF=1,CF=0,SF=1,OF=0

(5)XOR AL,BL 10011010(9AH)

XOR 10111100

00100110

(0BCH)

所以,ZF=0,PF=0,CF=0,SF=0,OF=0

答案:(1)0,1,1,0,1

(2)0,1,1,1,0

(3)0,0,0,1,0

(4)0,1,0,1,0

(5)0,0,0,0,0

【228】现有程序段如下:

D_SEG SEGMENT

X DW 5

Y DW 6

Z DW ?

D_SEG ENDS

....

XOR AX,AX

MOV AX,X

ADD AX,Y

MOV CL,3

SAL AX,CL

SUB AX,32H

SAR AX,1

MOV Z,AX

Page 46: IBM-PC 汇编语言程序设计试题解

·42· IBM-PC 汇编语言程序设计试题解

HLT

请问:① 该程序段的功能是( (1) )。

② 程序执行后(Z)=( (2) )。

答案:(1)计算(Z)=((X+Y)*8-50)/2;(2)0013H

【229】现有程序段如下:

MOV AX,01H

MOV BX,02H

MOV CX,03H

DON: INC AX

ADD BX,AX

SHR AX,1

LOOP DON

HLT

请问:① 该程序段的功能是( (1) ),② 程序执行后(AX)=( (2) ),(BX)=( (3) )。

答案:(1)实现 2+2+2+2;(2)1;(3)8

【230】现有程序段如下:

MOV AX,01H

MOV BX,02H

MOV CX,04H

MOV DX,03H

DON: INC AX

ADD BX,AX

SHR DX,1

LOOPNE DON

HLT

请问:① 上述程序段执行的循环次数是( (1) )。

② 程序执行后(AX)=( (2) ),(BX)=( (3) ),(CX)=( (4) ),

(DX)=( (5) )。

答案:(1)2次;(2)03H;(3)07H;(4)02H;(5)0

【231】执行下列程序后,回答指定问题:

DATA SEGMENT

ORG $+20H

STR1 DB 5 DUP('ABCDEFGHIJKLMNOPQRS')

ORG $+10H

DA1 DW STR1+10

DA2 DW STR1+5

Page 47: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·43·

NUM EQU 05H

DATA ENDS

MOV SI,DA1

MOV DI,DA2

MOV CX,NUM

CMP SI,DI

JA @200

ADD SI,CX

ADD DI,CX

@100: MOV AL,[SI− 1]

MOV [DI− 1],AL

DEC SI

DEC DI

DEC CX

JNZ @100

JMP @300

@200: MOV AL,[SI]

MOV [DI],AL

INC SI

INC DI

DEC CX

JNZ @200

@300: HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后共传输了( (2) )个数据,存放的单元地址是( (3) ),

数据内容是( (4) )。

答案:(1)字符串的传递;(2)5;(3)0025H;(4)'K','L','M','N','O'。

【232】现有程序段如下:

MOV CX,16

MOV BX,0

MOV DX,1

DON: MOV AX,2AB0H

AND AX,DX

JZ NEXT

INC BX

NEXT: SHL DX,1

LOOP DON

MOV MEM,BX

Page 48: IBM-PC 汇编语言程序设计试题解

·44· IBM-PC 汇编语言程序设计试题解

HLT

请问:① 该程序段的功能是( (1) )。

② 程序执行后存储单元 MEM 中的内容是( (2) )。

答案:(1)统计 AX 中含有“1”的个数;(2)6

【233】以下程序段的作用是( (1) )。

STR1 DB 300 DUP(?)

STR2 DB 100 DUP(?)

...

MOV CX,100

MOV BX,200

MOV SI,0

MOV DI,0

NEXT: MOV AL,STR1[BX][SI]

MOV STR2[DI],AL

INC SI

1NC DI

LOOP NEXT

答案:(1)将 STR1 的后 100 个数据传送到 STR2 中

【234】现有程序段如下:

MOV CX,31H

MOV AX,1

MOV BX,3

@100: ADD AX,BX

ADD BX,2

LOOP @100

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(AX)=( (2) )。

答案:(1)实现 1+3+5+……+99奇数的累加和;(2)09C4H,即:(1+99)×25=2500

【235】已知下列程序段:

DATA SEGMENT

DB1 DB 12H,34H,0,56H

DW1 DW 78H,90H,0AB46H,1234H

ADR1 DW DB1

ADR2 DW DW1

BUF DB 5 DUP(0)

Page 49: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·45·

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

MAIN PROC FAR

START: PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

XOR CX,CX

MOV CL,3

ADD ADR1,CX

SUB ADR2,CX

MOV BX,ADR1

MOV DI,BX

MOV SI,ADR2

MOV AL,DB1[BX]

MOV BUF[DI],AL

MOV AX,DW1[BX][SI]

MOV WORD PTR BUF,AX

RET

MAIN ENDP

CODE ENDS

END START

程序执行后,填入 BUF的偏移地址和其中各字节单元的内容:

偏移地址 内容

( (1) ) ( (2) ) BUF

( (3) ) ( (4) )

( (5) ) ( (6) )

( (7) ) ( (8) )

( (9) ) ( (10) )

分析:下面从部分程序的执行过程来分析数据段内字节单元的存储情况。

XOR CX,CX

MOV CL,3

ADD ADR1,CX ;ADR1 以前的值为 0000H(DB1 的偏移地址)。

;指令执行后,为 0003H。

SUB ADR2,CX ;ADR2 以前的值为 0004H(DW1 的偏移地址)。

;指令执行后,为 0001H。

MOV BX,ADR1 ;(BX)=0003H。

Page 50: IBM-PC 汇编语言程序设计试题解

·46· IBM-PC 汇编语言程序设计试题解

MOV DI,BX ;(DI)=0003H。

MOV SI,ADR2 ;(SI)=0001H。

MOV AL,DB1[BX] ;源操作数的偏移地址为 DB1+(BX)= DB1+0003H,

;所以(A1)=56H。

MOV BUF[DI],AL ;目的操作数的偏移地址为 BUF+(DI)=BUF+0003H,

;其对应的单元存入 56H。

MOV AX,DW1[BX][SI] ;源操作数的偏移地址为

;DWl+(BX)+(SI)=DW1+0003H+0001H=DW1+

0004H,

;其对应单元的内容为 0AB46H。所以(AX)=0AB46H。

MOV WORD PTR BUF,AX ;将(AX)=0AB46H存入 BUF对应的字单元中。

;这里用 WORD PTR将 BUF的字节属性改为字属性。

内容 地址 内容 地址

DB1 +0 12H 0000H ADDR1 +0 00H/03H 000CH

+1 34H 0001H +1 00H/00H 000DH

+2 00H 0002H ADDR2 +0 04H/01H 000EH

+3 56H 0003H +1 00H/00H 000FH

DW1 +0 78H 0004H BUF +0 00H/46H 0010H

+1 00H 0005H +1 00H/ABH 0011H

+2 90H 0006H +2 00H 0012H

+3 00H 0007H +3 00H/56H 0013H

+4 56H 0008H +4 00H 0014H

+5 ABH 0009H

+6 34H 000AH

+7 12H 000BH

答案: (1)0010H; (2) 46H;

(2)0011H: (4) ABH;

(3)0012H; (6) 00H;

(7)0013H; (8) 56H;

(9)0014H; (10)00H

【236】执行下列程序后,回答指定问题:

DATA SEGMENT

STR1 DB 'WORD'

N1 EQU $− STR1

STR2 DB 'OK'

STR3 DB 'ERROR$'

STR4 DB 5 DUP(?)

N2 EQU $− STR4

DATA ENDS

Page 51: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·47·

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

LEA DI,STR4

MOV CX,N2

@101: MOV AH,07H

INT 21H

CMP AL,0DH

JZ @102

STOSB

LOOP @101

@102: LEA SI,STR1

LEA DI,STR4

MOV CX,N1

REPZ CMPSB

JNZ @103

LEA DX,STR2

MOV AH,09H

INT 21H

JMP @104

@103: LEA DX,STR3

MOV AH,09H

INT 21H

@104: MOV AH,4CH

INT 21H

CODE ENDS

END START

请问:① 该程序的功能是( (1) )。

② 程序执行后屏幕显示的内容是( (2) )。

答案:(1)从键盘输入一字符串,保存在 STR4中,并从显示器输出相应的字符串;

(2)将键盘输入的字符串与(STR1)中的内容对比,若相同,则显示(STR2)中的内容;

否则,显示(STR3)中的内容

【237】现有程序段如下:

MOV AX,3200H

MOV BH,AH

MOV CL,04H

Page 52: IBM-PC 汇编语言程序设计试题解

·48· IBM-PC 汇编语言程序设计试题解

SHL AH,CL

SHR BL,CL

OR AH,BH

HLT

请问:① 该程序段的功能是( (1) )。

② 程序执行后(AH)=( (2) )。

答案:(1)将 AH 中的高低 4 位进行互换;(2)32H

【238】执行下列指令后,寄存器(AX)=( (1) )。

TABLE DW 10,20,30,40,50

ENTRY DW 3

....

MOV BX,OFFSET TABLE

ADD BX,ENTRY

MOV AX,[BX]

分析:数据段内存分配示意图如下:

TABLE +0 0AH +5 00H

+1 00H +6 28H

+2 14H +7 00H

+3 00H +8 32H

+4 1EH +9 00H

答案:(1)1E00H

【239】阅读下面的程序。在( (1) )的情况下,本段程序的执行结果是(AH)=0;在

( (2) )的情况下,其结果为(AH)=0FFH。

IN AL,20H

TEST AL,80H

JZ A

MOV AH,0

JMP B

A: MOV AH,0FFH

B: HLT

答案:(1)AL 中的最高位为 1;(2)AL 中的最高位为 0

【240】现有程序段如下:

D_SEG SEGMENT

TABLE DB 01H,02H,04H,08H,10H,20H,40H,80H

N DB 3

RESULT DB ?

Page 53: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·49·

D_SEG ENDS

...

LEA BX,TABLE

MOV AL,N

XLAT TABLE

MOV RESULT,AL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后 RESULT 字节单元中的内容是( (2) )。

答案:(1)以 N 单元中给定的数据,使用查表方法,找出 TABLE 表中对应的数值;

(2)08H

【241】执行下面的程序段后,(AX)=( (1) )。

BUF DW 2152H,3416H,5731H,4684H

...

MOV BX,OFFSET BUF

MOV AX,3[BX]

HLT

答案:(1)3134H

【242】执行下列指令序列后,会将(DX,AX)的值( (1) )。

MOV CL,04

SHL DX,CL

MOV BL,AH

SHL AX,CL

SHR BL,CL

OR DL,BL

分析:这是一种常用的将多位数移位的方法。设(DX,AX)=12345678H,则

MOV CL,04 ;(CL)=04H

SHL DX,CL ;(DX)=2340H

MOV BL,AH ;(BL)=56H

SHL AX,CL ;(AX)=6780H

SHR BL,CL ;(BL)=05H

OR DL,BL ;(DL)=45H,即(DX,AX)=23456780H

即上述程序将(DX,AX)左移 4 位。或者采用下面的方法,将(DX,AX)向左移 4 位:

MOV CX,04

NEXT: SHL AX,1

RCL DX,1

LOOP NEXT

Page 54: IBM-PC 汇编语言程序设计试题解

·50· IBM-PC 汇编语言程序设计试题解

答案:(1)左移 4 位

【243】执行下列程序后,回答指定问题:

DATA SEGMENT

X DW 0121H

Y DB ?

DATA ENDS

...

MOV AX,X

MOV CX,0

MOV BX,1

@201: SUB AX,BX

JB @202

INC CL

ADD BX,2

JMP @201

@202: MOV Y,CL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(Y)=( (2) )。

答案:(1)实现开平方运算,程序做 X− 1− 3− 5...的运算,而 ( )∑=

=−K

n

Kn1

212 ,所以

当减法运算执行到≤0 时便可以得到 X 的平方根;(2)11H

【244】在数据段定义有一字变量如下:

DATA SEGMENT

ARRAY DW 2,$+2,5,7,$+6,ODH

DATA ENDS

填入数据段 ARRAY 区存储单元的内容。

偏移地址 内容 偏移地址 内容

(1)_______ _______ (7)_______ _________

(2)_______ _______ (8)_______ _________

(3)_______ _______ (9)_______ _________

(4)_______ _______ (10)_______ _________

(5)_______ _______ (11)_______ _________

(6)_______ _______ (12)_______ _________

分析:当$用在伪操作的参数字段时,它表示的是地址计数器的当前值。

偏移地址 内容

Page 55: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·51·

0000H 02H

0001H 00H

0002H 04H $+2=0002H+2=0004H

0003H 00H

0004H 05H

0005H 00H

0006H 07H

0007H 00H

0008H 0EH $+6=0008H+6=0008H+0006H=000EH

0009H 00H

000AH 0DH

000BH 00H

答案:(1)0000H,02H; (2)0001H,00H; (3)0002H,04H

(4)0003H,00H; (5)0004H,05H; (6)0005H,00H

(7)0006H,07H; (8)0007H,00H: (9)0008H,0EH

(10)0009H,00H; (11)000AH,0DH; (12)000BH,00H

【245】执行下面的程序段后,(AX)=( (1) )。

ARRAY DW 10 DUP(2)

...

XOR AX,AX

MOV CX,LENGTH ARRAY

MOV SI,SIZE ARRAY− TYPE ARRAY

NEXT: ADD AX,ARRAY[SI]

SUB SI,TYPE ARRAY

LOOP NEXT

答案:(1)20

【246】现有程序段如下:

DATA SEGMENT

SUM DW ?

DATA ENDS

...

XOR AX,AX

MOV CX,10

MOV BX,2

@101: ADD AX,BX

INC BX

INC BX

DEC CX

Page 56: IBM-PC 汇编语言程序设计试题解

·52· IBM-PC 汇编语言程序设计试题解

JNZ @101

MOV SUM,AX

HLT

CODE ENDS

请问:① 该程序的功能是( (1) )。

② 程序执行后,SUM 单元的内容是( (2) )。

答案:(1)2+4+…+20共 10 个偶数的累加和;(2)6EH,即:(2+20)×5=110

【247】当执行下列指令后,(AL)=( (1) ),(DX)=( (2) )。

STR1 LABEL WORD

STR2 DB 12H

DB 34H

...

MOV AL,STR2

MOV DX,STR1

分析:STR1 是字变量,STR2 是字节变量,它们在数据段中都有相同的起始地址,其示

意图如下。

STR2(字节) 12H STR1(字)

34H

如果将指令改为:MOV AL,STR1

MOV DX,STR2

则出现错误,因为 AL(8 位)和 STR1(16 位)、DX(16 位)和 STR2(8位)类型不匹配。采

用 PTR 属性操作符可以临时改变变量的类型。下列指令就是正确的:

MOV AL,STR2

MOV DX,WORD PTR STR2

执行后,(AL)=12H,(DX)=3412H。

答案:(1)12H;(2)3412H

【248】分析以下程序段:

ADD AX,BX

JNO L1

JNC L2

SUB AX,BX

JNC L3

JNO L4

JMP SHORT L5

如果 AX 和 BX 的内容给定如下:

AX BX

Page 57: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·53·

① 147B 80DC

② B568 54B7

③ 42C8 608D

④ D023 9FD0

⑤ 94B7 B568

该程序执行后,程序转向( (1) );( (2) );( (3) );( (4) );( (5) )。

分析:JNO 的测试条件是:OF=0,即不溢出则转移。JNC 的测试条件是:CF=0,即进

位为零则转移。本题根据两个算术运算指令 ADD AX,BX 和 SUB AX,BX 进行运算,其结果影响

标志位的情况,并决定程序的走向。

答案:(1)Ll;(2)L1;(3)L2;(4)L5;(5)L4

【249】执行下列程序后,回答指定问题:

DATA SEGMENT

MSG DB 'Hello',"$"

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DX,OFFSET MSG

MOV AH,09H

INT 21H

CODE ENDS

END START

请问:程序执行后屏幕显示的内容是( (1) )。

答案:(1)Hello

【250】已知程序如下:

DATA SEGMENT (假定 DS=00BFH)

ORG 1000H

BLOCK DB 48H,8DH

RESUL DB ?

DATA ENDS

STACK SEGMENT PARA STACK 'STACK'

DB 64 DUP(?)

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA

START PROC

Page 58: IBM-PC 汇编语言程序设计试题解

·54· IBM-PC 汇编语言程序设计试题解

0000H BEGIN: MOV AX,DATA

0003H MOV DS,AX

0005H MOV SP,4000H

0008H LEA BX,BLOCK

000CH MOV AL,[BX]

000EH SUB AL,[BX+1]

0011H PUSH AX

0012H PUSHF

0013H CALL SUB1

0016H POPF

0017H POP AX

0018H MOV [BX+2],AL

001BH HLT

START ENDP

001CH SUB1 PROC

001CH ADD AL,AL

001EH RET

SUB1 ENDP

CODE ENDS

END BEGIN

程序运行后,请填入数据段、堆栈段的数据存放情况:

(1)数据段数据存放情况: (2)堆栈段数据存放情况:

偏移地址 内容 偏移地址 内容

①_______ ________ ①_______ ________

②_______ ________ ②_______ ________

③_______ ________ ③_______ ________

④_______ ________

⑤_______ ________

⑥_______ ________

⑦_______ ________

(3)最后标志位为______。

分析:数据段存放的情况:

BLOCK+0 48H

+1 8DH

RESULT BBH

START PROC

0000H BEGIN: MOV AX,DATA

0003H MOV DS,AX

0005H MOV SP,4000H ;(SP)=4000H。

Page 59: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·55·

0008H LEA BX,BLOCK

000CH MOV AL,[BX] ;(AL)=48H。

000EH SUB AL,[BX+1] ;(AL)=48H-8DH=BBH。

01001000(48H) 01001000

− )10001101(8DH)

10111011(BBH)

+)01110011

运算后,条件码为:SF=1,ZF=0,PF=1,OF=1,CF=1,AF=1。注意,执行减法时,应

将减数求补,然后变为加法运算。如果这时没有进位,就有借位。因此这里 CF=1,AF=1。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1

OF DF IF TF SF ZF AF PF CF

即标志位为 0895H(这里设控制码为 0)。

0011H PUSH AX ;将(AX)=00BBH 压入堆栈

0012H PUSHF ;将标志位 0895H 压入堆栈

0013H CALL SUB1 ;通用子程序 SUB1

0016H POPF ;恢复标志位

0017H POP AX ;恢复 AX

0018H MOV [BX+2],AL ;将 BBH 存入 RESULT 中

001BH HLT

START ENDP

001CH SUB1 PROC

001CH ADD AL AL

OOIEH RET

SUB1 ENDP

CODE ENDS

END BEGIN

堆栈段存放情况:

3FFAH 16H 返回地址

3FFBH 00H

3FFCH 95H 标志位

3FFDH 08H

3FFEH BBH AX 的内容

3FFFH 00H

4000H

答案: (1)①1000H 48H; ②1001H 8DH; ③1002H BBH;

(2)①3FFAH 16H; ②3FFBH 00H; ③3FFCH 95H;

④3FFDH 08H; ⑤3FFEH BBH; ⑥3FFFH 00H;

⑦4000H;

(3)0000100010010101(0895H)

Page 60: IBM-PC 汇编语言程序设计试题解

·56· IBM-PC 汇编语言程序设计试题解

【251】现有程序段如下:

D_SEG SEGMENT

D1 DB 12H,34H

D2 DB 35H,57H

D3 DB 0,0

D_SEG ENDS

...

MOV AL,D1

ADD AL,D2

DAA

MOV D3,AL

MOV AL,D1+1

ADC AL,D2+1

DAA

MOV D3+1,AL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(D3)=( (2) ),(D3+1)=( (3) )。

答案:(1)实现两个 4位 BCD 码数的相加;(2)47H;(3)91H

【252】 阅读下面的程序段。堆栈段分配了( (1) )个ABCD结构的空间,堆栈长度为( (2) )

个字。如果程序中没有再设置SS、SP,那么经过汇编、连接后,(SP)=( (3) )。

ABCD STRUC

OLD_BP DW ?

RET_IP DW ?

RET_CS DW ?

PAR_2 DW ?

PAR_1 DW ?

ABCD ENDS

S_SEG SEGMENT STACK

ABCD 10 DUP(< >)

S_SEG ENDS

答案:(1)10;(2)50;(3)0064H

【253】对于下面的数据定义,各条 MOV 指令单独执行后,请填充有关寄存器的内容:

TABLE1 DB ?

TABLE2 DW 20 DUP(?)

TABLE3 DB 'ABCD'

......

Page 61: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·57·

MOV AX,TYPE TABLE1 ;(AX)=( (1) )

MOV BX,TYPE TABLE2 ;(BX)=( (2) )

MOV CX,LENGTH TABLE2 ;(CX)=( (3) )

MOV DX,SIZE TABLE2 ;(DX)=( (4) )

MOV SI,LENGTH TABLE3 ;(SI)=( (5) )

分析:字节变量和字变量的类型值分别为 1 和 2。SIZE 的值是 LENGTH 值和 TYPE 值的乘

积。

答案:(1)1;(2)2;(3)20;(4)40;(5)1

【254】执行下列程序后,回答指定问题:

DATA SEGMENT

ARRAY DW 0A000H,3000H,9000H

N EQU ($− ARRAY)/2

DATA ENDS

...

MOV SI,0

MOV BL,0FFH

@101: CMP BL,0

JZ @104

XOR BL,BL

MOV CX,N

DEC CX

MOV SI,0

@102: MOV AX,ARRAY[SI]

CMP AX,ARRAY[SI+2]

JGE @103

XCHG ARRAY[SI+2],AX

MOV ARRAY[SI],AX

MOV BL,0FFH

@103: ADD SI,2

DEC CX

JNZ @102

JMP @101

@104: HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后以 ARRAY 开始的各存储字单元的内容是( (2) )。

答案:(1)对 3 个有符号数据从大到小进行排序;(2)3000H,0A000H,9000H

【255】在下列程序的括号中分别填入如下指令:

Page 62: IBM-PC 汇编语言程序设计试题解

·58· IBM-PC 汇编语言程序设计试题解

① LOOP L20

② LOOPE L20

③ LOOPNE L20

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,SS:CODE

ORG 100H

BEGIN: MOV AX,01

MOV BX,02

MOV DX,03

MOV CX,04

L20: INC AX

ADD BX,AX

SHR DX,1

( )

RET

CODE ENDS

END BEGIN

在上述 3 种情况下,当程序执行完后,(AX)=( (1) )、(BX)=( (2) )、(CX)

=( (3) )、(DX)=( (4) )。

答案:① LOOP L20,(1)05H;(2)10H;(3)00H;(4)00H

② LOOPE L20,(1)02H;(2)04H;(3)03H;(4)01H

③ LOOPNE L20,(1)03H;(2)07H;(3)02H;(4)00H

【256】已知程序如下,假设本程序的(CS)=10C9H

DATA SEGMENT

ORG 0008H

BLOCK DB 54H,9CH

CHA DB ?

DATA ENDS

STACK SEGMENT PARA STACK 'STACK'

DB 100 DUP(?)

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA

START PROC FAR

0000H BEGIN: MOV AX,DATA

0003H MOV DS,AX

0005H MOV ES,AX

0007H MOV SP,2000H

Page 63: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·59·

000AH XOR AX,AX

000CH LEA BX,BLOCK

0010H MOV AL,[BX] ;有中断发生

0012H SUB AL,[BX+1]

0015H PUSH AX

0016H PUSHF

0017H CALL SUB1

001AH POPF

001BH POP AX

001CH MOV [BX+2],AL

001FH MOV AH,4CH

0021H INT 21H

START ENDP

SUB1 PROC

0023H ADD AL,AL

0025H RET

SUB1 ENDP

CODE ENDS

END BEGIN

中断处理程序:

INTR: PUSH AX

PUSH BX

MOV AL,10H

OUT 20H,AL

POP BX

POP AX

RETI

程序执行后,请填入正确内容:

① 数据段数据存放的情况, ② 堆栈段操作的情况。

偏移地址 内容 偏移地址 内容

(1)________ ________ (4)_______ ________

(2)________ ________ (5)_______ ________

(3)________ ________ (6)_______ ________

(7)_______ ________

(8)_______ ________

(9)_______ ________

(10)_______ ________

(11)_______ ________

(12)_______ ________

(13)_______ ________

Page 64: IBM-PC 汇编语言程序设计试题解

·60· IBM-PC 汇编语言程序设计试题解

(14)_______ ________

③ 最后标志位的状态( (15) )。

分析:

假设本程序的(CS)=10C9H

DATA SEGMENT

ORG 0008H

BLOCK DB 54H,9CH

CHA DB ?

DATA ENDS

STACK SEGMENT PARA STACK 'STACK'

DB 100 DUP(?)

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA

START PROC FAR

0000H BEGIN: MOV AX,DATA

0003H MOV DS,AX

0005H MOV ES,AX

0007H MOV SP,2000H

000AH XOR AX,AX

执行该指令后,SF=0,PF=1,ZF=1,AF=0,OF=0,CF=0。这时标志位为

0000000001000100,即 0044H(设控制码为 0)。

000CH LEA BX,BLOCK ;(BX)=0008H

0010H MOV AL,[ BX] ;有中断发生

这时(AL)=54H。执行该指令后产生中断,将标志位(0044H)、断点地址((CS)= 10C9H,

(IP)=0012H)压入堆栈。执行中断处理程序,将 AX(0054H)、BX(0008H)压入堆栈,最后

又将其弹出堆栈。中断返回时,恢复标志位和断点地址。

0012H SUB AL,[BX+1] ;(AL)=B8H

01010100(54H) 01010100

− ) 10011100(9CH)

10111000

+) 01100100

所以(AL)=B8H,即(AX)=00B8H。这时条件码为:SF=1,PF=1,ZF=0,CF=1,AF=1,

OF=1。标志位为

0000100010010101,即 0895H(设控制码为 0)。

0015H PUSH AX ;将 00B8H 压入堆栈

0016H PUSHF ;将 0895H 压入堆栈

0017H CALL SUB1 ;调用子程序 SUB1,将断点地址(001AH)压入堆栈

001AH POPF ;将 0895H 弹出堆栈

001BH POP AX ;将 00B8H 弹出到 AX

Page 65: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·61·

001CH MOV [BX+2],AL ;将 B8H 存入内存中

001FH MOV AH,4CH

0021H INT 21H

START ENDP

答案:

(1)0008H 54H;(2)0009H 9CH;(3)000AH B8H; (4)1FF6H 08H;(5)1FF7H 00H;

(6)1FF8H 54H;(7)1FF9H 00H;(8)1FFAH 12H 1AH;(9)1FFBH 00H 00H;(10)1FFCH

C9H 95H;(11)1FFDH 10H 08H;(12)1FFEH 44H B8H;(13)1FFFH 00H 00H;(14)

2000H;(15)0000100010010101

【257】现有数据段如下:

DATA SEGMENT

ORG 0020H

DA1 DW 12H,23H

DA2 DB 11H,21H

DA3 EQU 1234H

DA4 EQU $− DA2

DA5 DB 31H,32H

DATA ENDS

请问:① 该数据段已占有的存储字节数是( (1) )。

② 符号名 DA4 的值是( (2) ),符号名 DA5 的值是( (3) )。

答案:(1)8;(2)02H;(3)0026H

【258】执行下列程序后,寄存器 AX、BX和 CX 的值分别是多少?

ORG 122lH

NUM DW 12H

...

MOV AX,NUM

MOV BX,OFFSET NUM

MOV CL,BYTE PTR NUM+1

MOV CH,TYPE NUM

HLT

请问:(AX)=( (1) ),(BX)=( (2) ),(CX)=( (3) )。

答案:(1)0012H;(2)1221H;(3)0200H

【259】现有数据段如下:

DATA SEGMENT

DA1 EQU 16*16

DA2=100H

Page 66: IBM-PC 汇编语言程序设计试题解

·62· IBM-PC 汇编语言程序设计试题解

AR1 DB DA1 EQ DA2,DA1 NE DA2

AR2 DW DA1 LE DA2

DATA ENDS

...

MOV AX,WORD PTR AR1

MOV BX,AR2

MOV CX,AR2-AR1

HLT

请问:程序执行后(AX)=( (1) ),(BX)=( (2) ),(CX)=( (3) )。

答案:(1)00FFH;(2)0FFFFH;(3)0002H

【260】现有数据段如下:

D_SEG SEGMENT

ORG 0020H

NUM1=6

NUM2=NUM1+10H

DA1 DB 'JSJ ASM'

DB 0AH,0DH

CUNT EQU $− DA1

DA2 DW 'JS','JP','AS','M'

D_SEG ENDS

...

LEA BX,DA1

MOV AX,[BX]

MOV CX,CUNT

MOV DX,DA2+2

HLT

请问:程序执行后,(AX)=( (1) ),(BX)=( (2) ),(CX)=( (3) ),(DX)

=( (4) )。

答案:(1)534AH 或'SJ';(2)0020H;(3)0009H;(4)4A50H或'JP'

【261】现有程序段如下:

D_SEG SEGMENT

DA1 DB 10H DUP(1)

DA2 DW 10H DUP(0203H)

D_SEG ENDS

...

MOV AX,0

MOV BX,AX

Page 67: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·63·

MOV CX,BX

DON: ADD AL,DA1[BX]

ADD AL,BYTE PTR DA2[BX]

INC BX

LOOP DON

HLT

请问:程序执行过程中,当(BX)=08H 时,(AL)=( (1) ),(CX)=( (2) )。

答案:(1)1CH;(2)0FFF9H

【262】现有程序段如下,并设段基址为 0230H。

D_SEG SEGMENT

ORG 0005H

ORG 0005H

AV1 DW1 12H,21H

AV2 EQU 1221H

AV3 DB 13H,31H

AV4 DW AV3

AV5=2113H

AV6 DD AV5

AV7 DD AV2[AV5]

D_SEG ENDS

...

MOV AX,AV2

MOV BX,AV4

MOV CX,AV6+2

MOV DX,AV7

HLT

请问:程序执行后,

① (AX)=( (1) ),(BX)=( (2) ),(CX)=( (3) ),(DX)=( (4) )。

② 若将数据段中的 AV6 DD AV5 改为 AV6 DD AV4 后

(AX)=( (5) ),(BX)=( (6) ),(CX)=( (7) ),(DX)=( (8) )。

③ 若将数据段中的 AV5=21l3H 改为 AV5=AV4 后,

(AX)=( (9) ),(BX)=( (10) ),(CX)=( (11) ),(DX)=( (12) )。

答案:(1)1221H;(2)0009H;(3)00H;(4)3334H;

(5)1221H;(6)0009H;(7)0230H;(8)3334H;

(9)1221H;(10)0009H;(11)0230H;(12)122CH

【263】现有程序段如下:

MOV AL,65

Page 68: IBM-PC 汇编语言程序设计试题解

·64· IBM-PC 汇编语言程序设计试题解

MOV AL,65

ADD AL,32

MOV BYTE PTR ADR1,AL

MOV BL,97

SUB BL,32

MOV BYTE PTR ADR2,BL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(ADR1)=( (2) ),(ADR2)=( (3) )。

答案:(1)将大写字母 A 转换成小写字母 a,小写字母 a 转换成大写字母 A;(2)61H;

(3)41H

【264】现有程序段如下:

D_SEG SEGMENT

NA1 DB 80H

NA2 DB 14H

MA1 DW 2000H

MA2 DW 1000H

RT1 DW 0

RT2 DW 0

D_SEG ENDS

...

MOV AX,MA1

IDIV NA1

MOV RT1,AX

MOV AL,NA1

CBW

IDIV NA2

MOV RT2,AX

MOV AX,MA1

CWD

IDIV MA2

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后,(AX)=( (2) ),(DX)=( (3) ),(RT1)=( (4) ),

(RT2)=( (5) )。

答案:(1)有符号数的除法;(2)0002H;(3)0;(4)00C0H;(5)0F8FAH

【265】现有程序段如下:

Page 69: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·65·

MOV AX,0003H

MOV BX,0180H

MOV CL,03H

SHL AX,1

SHR BX,1

ROL AX,CL

ROR BX,CL

X0R AX,BX

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(AX)=( (2) )。

答案:(1)将 AX 中的内容左移 4 次,BX 中的内容右移 4 次,然后二者相异或;(2)

0028H

【266】现有程序段如下:

D_SEG SEGMENT

ADR1 DB 09H,08H

ADR2 DB 2 DUP(3)

ADR3 DB 02H,06H

...

MOV AL,ADR1

ADD AL,ADR2

AAA

MOV DL,AL

MOV AL,ADRl+1

ADC AL,ADR2+1

AAA

XCHG AL,DL

SUB AL,ADR3

AAS

XCHG AL,DL

SBB AL,ADR3+1

AAS

MOV DH,AL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(DX)=( (2) )。

答案:(1)非压缩型 BCD 码数的加减运算;(2)0600H

Page 70: IBM-PC 汇编语言程序设计试题解

·66· IBM-PC 汇编语言程序设计试题解

【267】对于以下宏定义:

BRANCH MACRO X

IF ($− X) GE 128

JMP NEAR PTR X

EL SE

JMP SHORT X

ENDIF

ENDM

现有以下代码

LOOP0:

MOV AX,BX

BRANCH LOOP0

其中的宏调用展开为:( (1) )

答案:(1)JMP SHORT LOOP0

【268】现有程序段如下:

ARRAY DB 0,1,2,3,4,5,6,7,8,9

D2 DB 5 DUP(?)

...

MOV CX,5

MOV BX,5

MOV SI,0

MOV DI,0

@100: MOV AL,ARRAY[BX+SI]

MOV D2[DI],AL

INC SI

INC DI

LOOP @100

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后写出 D2 数据区的内容是( (2) )。

答案:(1)将 ARRAY 数据区中第 5 至 9 号(从 0 开始计数)单元中的数据传送到 D2 数

据区中;

(2)05H,06H,07H,08H,09H

【269】某程序的数据段定义如下:

DATASG SEGMENT

Page 71: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·67·

PARTLIST DB 'PART#'

DB 60

DB 'PRICE'

DW 0125

DB 'DESCRIPTION'

DB 'RADIO'

LISTING EQU ( (1) ) ;数组长度,用表达式表示。

DATASG ENDS

答案:(1)$-PARTLIST

【270】有如下定义:

MSG DB 'ABCDEFG'

则下面指令执行后,AL的内容是( (1) )。

MOV BX,OFFSET MSG

MOV AL,5

XLAT MSG

答案:(1)46H 或'F'

【271】执行下列指令序列后,完成的功能是将(DX,AX)的值( (1) )。

MOV CL,04

SHR AX,CL

MOV BL,DL

SHR DX,CL

SHL BL,CL

OR AH,BL

分析:这是一种常用的将多位数移位的方法。设(DX,AX)=12345678H,则

MOV CL,04 ;(CL)=04H

SHR AX,CL ;(AX)=0567H

MOV BL,DL ;(BL)=34H

SHR DX,CL ;(DX)=0123H

SHL BL,CL ;(BL)=40H

OR AH,BL ;(AH)=45H,即(DX,AX)=01234567H

或者采用下面的方法,将(DX,AX)向右移 4 位:

MOV CX,04

NEXT: SHR DX,1

RCR AX,1

LOOP NEXT

答案:(1)右移 4 位

Page 72: IBM-PC 汇编语言程序设计试题解

·68· IBM-PC 汇编语言程序设计试题解

【272】执行下列程序后,回答指定问题:

MOV AX,6B2CH

MOV CX,03

AND AX,AX

JP @86

CALL SUB1

JMP @94

@86: CALL SUB2

@94: HLT

SUB1 PROC

@101: SHL AL,1

RCL AH,1

LOOP @101

RET

SUB1 ENDP

SUB2 PROC

@102: SHR AL,1

RCR AH,1

LOOP @102

RET

SUB2 ENDP

请问:① 该程序的功能是( (1) )。

② 程序执行后(AX)=( (2) )。

答案:(1)测试 AL 寄存器中"1"的个数,如为奇数,则执行子程序 SUB1(AX 左移);如

为偶数,则执行子程序 SUB2(AX 右移);(2)5960H

【273】内存中的数据如下图所示,(SI)=2100H,(DI)=3100H,当(CX)=10D 时,

ES DS

'A' <-DI '1' <-SI

'B' '2'

'C' '3'

'D' 'R'

'S' 'S'

'R' 'A'

'Q' 'Q'

CLD

REPNE CMPSB

执行完上述指令后,

Page 73: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·69·

(SI)=( (1) ),(DI)=( (2) ),(CX)=( (3) )。

答案:(1)2105H;(2)3105H;(3)5

【274】

A DW 1234H

B DW 5678H

PUSH A

PUSH B

POP A

POP B

请问:① 上述程序段执行后(A)=( (1) ),(B)=( (2) )。

② 设执行前 SP=200H,执行后 SP=( (3) )。

答案:(1)5678H;(2)1234H;(3)2000H

【275】现有程序段如下:

D_SEG SEGMENT

BIN1 DB 64H

BIN2 DB 32H

WIN1 DW 03E8H

WIN2 DW 01F4H

RESULT DW 0,0,0

D_SEG ENDS

...

MOV AL,BIN1

MUL BIN2

MOV RESULT,AX

MOV AX,WIN1

MUL WIN2

MOV RESULT+2,AX

MOV RESULT+4,DX

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后 RESULT 开始的 6个字节单元中的内容依次是( (2) )。

答案:(1)无符号数的乘法;(2)88H,13H,20H,A1H,07H,00H

【276】现有下列程序段:

MOV AX,6540H

MOV DX,3210H

Page 74: IBM-PC 汇编语言程序设计试题解

·70· IBM-PC 汇编语言程序设计试题解

MOV CL,04

SHL DX,CL

MOV BL,AH

SHL AX,CL

SHR BL,CL

OR DL,BL

试问上述程序段运行后,(AX)=( (1) ),(BL)=( (2) ),(DX)=( (3) )。

答案:(1)5400H;(2)06H;(3)2106H

【277】分析下面程序段:

MOV AL,200

SAR AL,1

MOV BL,AL

MOV CL,2

SAR AL,CL

ADD AL,BL

试问程序段执行后(BL)=( (1) ),(AL)=( (2) )。

答案:(1)0E4H;(2)0DDH

【278】执行下列程序后,回答指定问题:

DATA SEGMENT

ARRAY DW 5 DUP(1,2,3,4,5)

RESULT DW ?

DATA ENDS

...

LEA SI,ARRAY

MOV CX,10

XOR AX,AX

@801: ADD AL,[SI]

AND AL,0FH

CMP AL,9

JBE @802

INC AH

SUB AL,9

@802: DEC CX

JNZ @801

MOV RESULT,AX

HLT

请问:① 该程序的功能是( (1) )。

Page 75: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·71·

② 程序执行后(RESULT)=( (2) )。

答案:(1)在一组数据中求 10 次循环后的计算结果;(2)0101H

【279】程序段如下:

BLK1 DB 46,84,34, − 5,20,122,73

MOV CX,7

LEA S1,BLK1

NEXT: MOV AL,[SI]

INC SI

TEST AL,81H

LOOPZ NEXT

MOV BL,[SI]

请回答程序段运行后:(AL)=( (1) ),(BL)=( (2) )。

答案:(1)-5;(2)14H

【280】

STRING DB 'ABCDEFGHIJ'

MOV AH,01 ;从键盘输入字符 1~9

INT 21H

AND AL,0FH

DEC AL

XOR AH,AH

MOV BX,OFFSET STRING

ADD BX,AX

MOV BL,[BX]

MOV AH,02H ;显示输出

INT 21H

请问:① 上述程序段的功能是( (1) )。

② 如从键盘输入字符“4”,程序段的结果是( (2) )。

答案:(1)根据从键盘输入的字符“1”~“9”,确定在显示器上显示 STRING 中第几个

字符;(2)显示器显示字符“D”

【281】现有程序段如下:

MOV AX,1234H

@100: CMP AX,0

JZ @200

Page 76: IBM-PC 汇编语言程序设计试题解

·72· IBM-PC 汇编语言程序设计试题解

SHL AX,1

JNC @100

INC BL

JMP @100

@200: HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(BL)=( (2) )。

答案:(1)统计 AX 寄存器中二进制位为“1”的个数;(2)05H

【282】执行下列程序后,回答指定问题:

MOV AX,1234H

MOV BX,5678H

MOV CX,04H

CALL SUB1

HLT

SUB1 PROC

@100: SHL AL,1

RCL AH,1

SHR BH,1

RCR BL,1

LOOP @100

RET

SUB1 ENDP

请问:① 该程序的功能是( (1) )。

② 程序执行后(AX)=( (2) ),(BX)=( (3) )。

答案:(1)利用子程序实现 AX 寄存器内容左移 4次,BX 寄存器内容右移 4次;(2)2340H;

(3)0567H

【283】 AND AL,AL

JZ BRCH1

RCR AL,1

JZ BRCH2

RCL AL,1

INC AL

JZ BRCH3

上述程序运行后,试回答:

① 当(AL)=( (1) )时,程序转向 BRCH1

② 当(AL)=( (2) )时,程序转向 BRCH2

Page 77: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·73·

③ 当(AL)=( (3) )时,程序转向 BRCH3

答案:(1)0;(2)1;(3)-1

【284】 MOV AX,0BC5FH

MOV BX,0C0FBH

XOR AX,BX

XOR AX,BX

上述程序段运行后,AX=( (1) ),CF=( (2) )

答案:(1)0BC5FH;(2)NC

【285】HEX DB '0123456789ABCDEF'

HCOD DB ?,?

; ...

MOV BX,OFFSET HEX

MOV AL,1AH

MOV AH,AL

AND AL,0FH

XLAT HEX

MOV HCOD[1],AL

MOV CL,12

SHR AX,CL

XLAT HEX

MOV HCOD,AL

上述程序段运行后,HCOD 和 HCOD+1两字节单元内容是( (1) ),( (2) )。

答案:(1)31H;(2)41H

【286】现有程序段如下:

D_SEG SEGMENT

VAL1 DB 64H

VAL2 DB 14H

N1 DW 2000

N2 DW 1000

RESULT1 DW 0

RESULT2 DW 0

D_SEG ENDS

...

MOV AX,N1

IDIV VAL1

MOV RESULT1,AX

Page 78: IBM-PC 汇编语言程序设计试题解

·74· IBM-PC 汇编语言程序设计试题解

MOV AL,VAL1

CBW

IDIV VAL2

MOV RESULT2,AX

MOV AX,N1

CWD

IDIV N2

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后,(AX)=( (2) ),(DX)=( (3) ),(RESULT1)=( (4) ),

(RESULT2)=( (5) )。

答案:(1)有符号数的除法;(2)0002H;(3)0;(4)0014H;(5)0005H

【287】执行下列程序后,回答指定问题:

DATA SEGMENT

D1 DB 5FH

D2 DB ?

DATA ENDS

...

MOV AL,D1

TEST AL,20H

JNZ @80

NEG AL

@80: MOV D2,AL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(DA2)=( (2) )。

答案:(1)判断 DA1 数组中的第 5位(从 0 开始计数),如为 0,则求补后再送入 D2中;

如为 1,则直接送回 D2 中;(2)0A1H

【288】DATA SEGMENT

ORG 3040H

YY1 DB 30H,40H

YY2 DW 3040H

DATA ENDS

; ...

MOV BX,OFFSET YY1

MOV AX,[BX]

MOV CL,BYTE PTR YY2+1

Page 79: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·75·

MOV CH,TYPE YY2

上述程序段运行后,AX=( (1) ),BX=( (2) ),CX=( (3) )

答案:(1)4030H;(2)3040H;(3)0230H

【289】现有程序段如下:

STR1 DB 'A12BCDEFGFH34I5JKL67SQP8'

D2 DB ?

;...

XOR DX,DX

MOV CX,D2-STR1

LEA BX,ADR1

@100: MOV AL,[BX]

CMP AL,30H

JB @200

CMP AL,39H

JA @200

INC DX

@200: INC BX

LOOP @100

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后 DX寄存器中存放的内容是( (2) )。

答案:(1)统计数字字符的个数;(2)0008H

【290】A DB 0F8H

B DB 3 DUP(?)

; ...

LEA DI,B

MOV CX,3

MOV AL,A

LOP: SAR AL,1

MOV [DI],AL

INC DI

LOOP LOP

上述程序段运行后,从 B单元开始依次存放的数据是( (1) ),( (2) ),( (3) )

答案:(1)0FCH;(2)0FEH;(3)0FFH

【291】已知 BUF 开始的数据区中存放有 10 个大、小写字母,下面程序段完成的功能是

( (1) )。

MOV CX,10

Page 80: IBM-PC 汇编语言程序设计试题解

·76· IBM-PC 汇编语言程序设计试题解

LEA BX,BUF

K2: MOV AL,[BX]

CMP AL,'Z'

JBE K1

SUB AL,20H

MOV [BX],AL

K1: INC BX

LOOP K2

答案:(1)小写转大写

【292】 MOV CL,8

MOV AL,0

NOT AL

ROL AL,CL

CMP AL,0FFH

JZ NEXT

MOV AL,0

NEXT: ;...

上述程序段运行后,(AL)=( (1) ),CF=( (2) )

答案:(1)0FFH;(2)NC

【293】执行下列指令后 AX 寄存的内容是( (1) )。

MOV AX,3088H

CBW

答案:(1)0FF88H

【294】现有程序段如下:

MOV AL,71H

OR AL,0

JNS @86

CALL SUB1

JMP @94

@86: CALL SUB2

@94: HLT

SUB1 PROC

MOV DL,'− '

MOV AH,2

INT 21H

RET

Page 81: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·77·

SUB1 ENDP

SUB2 PROC

MOV DL,'+'

MOV AH,2

INT 21H

RET

SUB2 ENDP

请问:① 该程序的功能是( (1) )。

② 程序执行后屏幕显示的内容是( (2) )。

答案:(1)如果(AL)>0,则执行子程序 SUB2显示“+”,如果(AL)<0,则执行子

程序 SUB1 显示“-”;(2)“+”

【295】执行下列指令后,ES,BX 寄存的内容分别是( (1) )、( (2) )。

MOV SI,10H

MOV AX,1234H

MOV [SI+12H],AX

LEA BX,[SI+12H]

MOV [SI+14H],BX

LES BX,DWORD PTR[SI+12H]

答案:(1)0022H;(2)1234H

【296】下列程序的功能是( (1) )。

MOV AX,SEG A

MOV DS,AX

MOV AX,SEG B

MOV ES,AX

MOV CX,10

LEA SI,A

LEA DI,B

CLD

LAB1: MOV AL,[DI]

XCHG AL,[SI]

STOSB

INC SI

LOOP LAB1

答案:(1)将存储单元 A 的开始的 10 个单元的内容和存储单元 B 的开始的 10 个单元的

内容依次互相交换

【297】现有程序段如下:

Page 82: IBM-PC 汇编语言程序设计试题解

·78· IBM-PC 汇编语言程序设计试题解

MOV AX,1234H

MOV BX,5678H

MOV CL,03H

SHL AX,1

SHR BX,1

ROL AX,CL

ROR BX,CL

XOR AX,BX

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(AX)=( (2) )。

答案:(1)将 AX 中的内容左移 4 次,BX 中的内容右移 4 次,然后二者相异或;(2)

0A626H

【298】执行下列程序后,回答指定问题:

DATA SEGMENT

D1 DB 33H

D2 DB 77H

D3 DB 99H

RESULT DB ?

DATA ENDS

...

MOV AL,D1

MOV BL,D2

MOV CL,D3

CMP AL,BL

JGE NEXT

XCHG AL,BL

NEXT: CMP AL,CL

JGE @80

XCHG AL,CL

@80: MOV RESULT,AL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(RESULT)=( (2) )。

答案:(1)在 3 个有符号数中找出最大的一个数;(2)77H

【299】下列程序的功能是( (1) )。

MOV AX,SEG STRING

Page 83: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·79·

MOV DS,AX

LEA DX,STRING

MOV AH,0AH

INT 21H

MOV CL,STRING[1]

LEA SI,STRING[2]

XOR CH,CH

LAB: MOV AL,[SI]

CMP AL,'a'

JB LAB1

CMP AL,'z'

JA LAB1

SUB AL,32

MOV [SI],AL

LAB1: INC SI

LOOP LAB

答案:(1)从键盘输入字符串存储到 STRING 指定的地址,然后将其中的小写字母转换

成大写字母

【300】现有程序段如下:

F DW 20H DUP(?)

...

MOV SI,0

MOV AX,0

MOV BX,1

MOV CX,20H

@100: MOV F[SI],AX

MOV DX,AX

ADD AX,BX

MOV BX,DX

ADD SI,2

LOOP @100

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后,F为起始地址的前 10 个字单元中存放的内容是( (2) )。

答案:(1)程序执行后,在 F 为起始地址的存储单元中按下面的公式填写数据:

F[0]=0,F[1]=1,递推 F[n]=F[n-1]+F[n-2]

即斐波纳契数列;

(2)0,1,1,2,3,5,8,13,21,34

Page 84: IBM-PC 汇编语言程序设计试题解

·80· IBM-PC 汇编语言程序设计试题解

【301】设 N1,N2 都为字变量,各存储一个有符号数,请指出下面语句序列的功能

MOV AX,N1

XOR DX,DX

OR AX,AX

JNS @100

MOV DX,0FFFFH

@100: IDIV N2

答案:N1 符号扩展,除以 N2,商→AX,余→DX

【302】阅读下面程序,填写运行结果。

DATA SEGMENT

MSG1 DB 'ABCDEFGH'

MSG2 DB 'OPQRS'

MSG3 DW '12','34','56',3738H ;MSG3=( (1) )

DATA ENDS

ESEG SEGMENT

MSG4 DB '1B2D3F4H'

MSG5 DB 'ASDFGH'

MSG6 DW 'AB','CD','EF' ;MSG6=( (2) )

ESEG ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:ESEG

MOV AX,DATA

MOV DS,AX

MOV AX,ESEG

MOV ES,AX

CLD

MOV SI,OFFSET MSG1

LEA DI,MSG4

MOVS MSG4,MSG1 ;MSG4=( (3) )

LEA SI,MSG1

LEA DI,MSG5

MOV CX,3

REP MOVS MSG5,MSG1 ;MSG5=( (4) )

MOV AX,DATA

MOV DS,AX

MOV ES,AX

LEA SI,MSG1

Page 85: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·81·

LEA DI,MSG3

MOV CX,3

REP MOVSB ;MSG3=( (5) )

LEA SI,MSG3

LEA DI,MSG2

MOV CX,3

REP MOVSW ;MSG2=( (6) ),MSG3=( (7) )

HLT

CODE ENDS

答案:(1)"21436587";(2)"BADCFE";(3)"AB2D3F4H";(4)"ABCFGH";(5)"ABC36587";

(6)"ABC36";(7)"5BC36587"

【303】现有程序段如下:

@100: MOV AH,1

INT 21H

CALL SUB1

JC @100

ADD AL,'a'− 'A'

MOV DL,AL

MOV AH,2

INT 21H

SUB1 PROC

CMP AL,'A'

JB @200

CMP AL,'Z'

JA @200

CLC

RET

@200: STC

RET

SUB1 ENDP

请问:① 该程序的功能是( (1) )。

② 由 DL 寄存器输出显示的内容是( (2) )。

答案:(1)把从键盘输入的大写字母转换为小写字母,并显示输出,其他字符全部舍弃;

(2)转换成小写字母的 ASCII 值

【304】阅读下面程序,填写运行结果。

DATA SEGMENT

MSG1 DB 'ABCDEFGH'

Page 86: IBM-PC 汇编语言程序设计试题解

·82· IBM-PC 汇编语言程序设计试题解

MSG2 DB 'OPQRS'

MSG3 DW '12','34','56',3738H ;MSG3=( (1) )

DATA ENDS

ESEG SEGMENT

MSG4 DB '1B2D3F4H'

MSG5 DB 'ASDFGH'

MSG6 DW 'AB','CD','EF' ;MSG6=( (2) )

ESEG ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:ESEG

MOV AX,DATA

MOV DS,AX

MOV AX,ESEG

MOV ES,AX

CLD

MOV SI,OFFSET MSG1

LODS ;AL=( (3) )

LEA DI,MSG4

STOS MSG4 ;MSG4=( (4) )

LEA SI,MSG3

LODS MSG3 ;(AX)=( (5) )

LEA DI,MSG5

STOS MSG5 ;MSG5=( (6) )

LEA SI,MSG3[1]

MOV CX,3

REP LODSB ;(AL)=( (7) )

LEA DI,MSG6[2]

MOV CX,3

REP STOSB ;MSG6=( (8) )

LEA SI,MSG3[2]

MOV CX,2

REP LODSW ;(AX)=( (9) )

LEA DI,MSG4

MOV CX,2

REP STOSW ;MSG4=( (10) )

HLT

CODE ENDS

答案:(1)'21436587';(2)'BADCFE';(3)41H 或'A';(4)'AB2D3F4H';(5)

3132H 或'21';(6)'2SDFGH';(7)33H 或'3';(8)'BA333E';(9)3536H 或'65';(10)

Page 87: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·83·

'65653F4H'

【305】现有程序段如下:

D_SEG SEGMENT

BCD1 DB 11H,22H

BCD2 DB 33H,44H

BCD3 DB 0,0

D_SEG ENDS

...

MOV AL,BCD1

SUB AL,BCD2

DAS

MOV BCD3,AL

MOV AL,BCD1+1

SBB AL,BCD2+1

DAS

MOV BCD3+1,AL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(BCD3)=( (2) ),(BCD3+1)=( (3) )。

答案:(1)实现两个 4位 BCD 码的相减;(2)78H;(3)77H

【306】阅读下面程序,填写运行结果。

DATA SEGMENT

MSG1 DB 'ABCDEFGH'

MSG2 DW '12','12','12',3738H ;MSG2=( (1) )

DATA ENDS

ESEG SEGMENT

MSG3 DB 'AbCAbAbQWE'

MSG4 DW '21','34','78','65','10' ;MSG4=( (2) )

ESEG ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:ESEG

MOV AX,DATA

MOV DS,AX

MOV AX,ESEG

MOV ES,AX

CLD

MOV SI,OFFSET MSG1

Page 88: IBM-PC 汇编语言程序设计试题解

·84· IBM-PC 汇编语言程序设计试题解

LEA DI,MSG3

CMPS MSG1,MSG3

CMPS MSG1,MSG3

MOV CX,5

REPE CMPSB ;(CX) = ( (3) )

LEA SI,MSG2

LEA DI,MSG4

MOV CX,5

REPNE CMPSW ;(CX) = ( (4) )

MOV AL,'C'

LEA DI,MSG3

MOV CX,5

REPNE SCASB

JNE LAB1

DEC DI

LAB1: ;(DI) = ( (5) )

MOV AX,'34'

LEA DI,MSG4[2]

MOV CX,5

REPE SCASW

JE LAB2

SUB DI,2

LAB2: ;(DI) = ( (6) )

HLT

CODE ENDS

答案:(1)'21212187';(2)'1234875601';(3)3;(4)0;(5)2;(6)0EH

【307】执行下列程序后,回答指定问题:

DATA SEGMENT

D1 DW 6542H

D2 DW 7A5BH

D3 DW ?

DATA ENDS

...

MOV AX,D1

MOV BX,D2

CMP AX,BX

JC @802

@801: SUB AX,BX

Page 89: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·85·

MOV D3,AX

JMP @803

@802: XCHG AX,BX

JMP @801

@803: HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后 (D3)=( (2) )。

答案:(1)两个无符号数的大小比较,如 (D1)>(D2),则执行 (AX)-(BX);如 (D1)

<(D2),则执行(BX)-(AX);(2)1519H

【308】阅读下面程序,AH 的运行结果是( (1) )。

MOV AH,0

MOV CX,5

LAB1: ADD AH,CL

LOOP LAB1

答案:(1)0FH

【309】现有程序段如下:

ARRAY DB 100 DUP (?)

N EQU $− ARRAY

RESULT DB ?

...

MOV CX,N

MOV BX, − 1

@100: INC BX

CMP ARRAY[BX],0

LOOPZ @100

JNZ @200

MOV BL,0FFH

@200: MOV RESULT,BL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后指出 RESULT 字节单元中的内容和含义是( (2) )。

答案:(1)在 ARRAY 为起始地址的数组中,查找第一个非零数据;(2)如果找到,则将

第一个非零数据在数组中的偏移量送入 RESULT单元中;如果无非零数,则将 0FFH送入 RESULT

单元中

【310】阅读下面程序,AH 的运行结果是( (1) )。

MOV AH,0

Page 90: IBM-PC 汇编语言程序设计试题解

·86· IBM-PC 汇编语言程序设计试题解

MOV DH,0

MOV BH,0

MOV CX,5

LAB2: ADD AH,BH

INC BH

CMP BH,4

JBE CC1

MOV DH,1

CC1: CMP DH,0

LOOPE LAB2

答案:(1)AH=0AH

【311】阅读下面程序,AH 的运行结果是( (1) )。

MOV AH,0

MOV BH,0

MOV CX,5

LAB3: ADD AH,BH

INC BH

CMP BH,4

LOOPNZ LAB3

答案:(1)(AH)=0+1+2+3=6

【312】设 X、Y、Z、V均为有符号 16BIT数,阅读下面程序,程序的计算功能是( (1) )。

MOV AX,X

IMUL Y

MOV CX,AX

MOV BX,DX

MOV AX,Z

CWD

ADD CX,AX

ADC BX,DX

SUB CX,800

SBB BX,0

MOV AX,V

CWD

SUB AX,CX

SBB DX,BX

IDIV X

分析: MOV AX,X ;(AX)=X

Page 91: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·87·

IMUL Y ;(DX,AX)=X×Y

MOV CX,AX ;

MOV BX,DX ;(BX,CX)=X×Y

MOV AX,Z ;(AX)=Z

CWD ;(DX,AX)=Z,将 AX 扩展为 32BIT

ADD CX,AX

ADDC BX,DX ;(BX,CX)=X×Y+Z

SUB CX,800

SBB BX,0 ;(BX,CX)=X×Y+Z− 800

MOV AX,V

CWD ;(DX,AX)=V,将 AX 扩展为 32BIT

SUB AX,CX

SBB DX,BX ;(DX,AX)=V− (X×Y+Z− 800)

IDIV X ;(AX)=(V− (X×Y+Z− 800))/X,(DX)=(V− (X×Y+Z− 800))%X

答案:(1)X

)800ZYX(V −+×−,结果的商存入 AX,余存入 DX

【313】分析下列程序,指出程序的功能,并画出主程序调用子程序时堆栈变化的示意图。

MAIN PROC FAR

LEA SI,S_STR

PUSH SI

LEA DI,D_STR

PUSH DI

MOV CX,100

PUSH CX

CALL FAR PTR STRCPY

;(段点:CS:IP)...

RET

MAIN ENDP

STRCPY PROC FAR

PUSH BP

MOV BP,SP

MOV CX,[BP+6]

MOW DI,[BP+8]

MOV SI,[BP+10]

CLD

REP MOVSB

RET 6

STRCPY ENDP

Page 92: IBM-PC 汇编语言程序设计试题解

·88· IBM-PC 汇编语言程序设计试题解

答案:(1)主程序调用段间子程序,并利用堆栈实现参数的传递,子程序做字符串拷贝

工作

BP

IP

CS

CX

DI

SI

【314】现有程序段如下:

D_SEG SEGMENT

ADR1 DB 09H,08H

ADR2 DB 2 DUP(3)

ADR3 DB 0,0

D_SEG ENDS

...

MOV AL,ADR1

ADD AL,ADR2

AAA

MOV DL,AL

MOV AL,ADR1+1

ADC AL,ADR2+1

AAA

XCHG AL,DL

SUB AL,ADR3

AAS

XCHG AL,DL

SBB AL,ADR3+1

AAS

MOV DH,AL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(DX)=( (2) )。

答案:(1)非压缩型 BCD 码数的加减运算;(2)0202H

【315】下面程序所完成的运算是( (1) )。

Page 93: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·89·

.RADIX 16

MOV AX,CX

IMUL CX

PUSH AX

MOV AX,CX

MOV DX,123

IMUL DX

MOV DX,AX

POP AX

ADD AX,DX

ADD AX,456

PUSH AX

MOV AX,SI

IMUL SI

PUSH AX

MOV AX,SI

MOV DX,789

IMUL DX

POP BX

ADD BX,AX

ADD BX,DI

POP AX

CWD

IDIV BX

MOV DI,AX

答案:(1)DISI789HSI456HCX123HCXDI 2

2

+×++×+

=

【316】阅读下列程序,并将该程序执行后的结果填入空格中。

FOO RECORD F:3,G:6,H:7

EXMP STRUC

F1 DB 11

F2 DB 22

F3 DB 33

F4 DB "AB"

EXMP ENDS

DATA SEGMENT

BAZ FOO <1,7>

A3 EXMP 2 DUP(<99,,,"XY">)

Page 94: IBM-PC 汇编语言程序设计试题解

·90· IBM-PC 汇编语言程序设计试题解

ARRY DW 1,2,3,4,5,6,7

END1 DW ?

BLOCK DW 1,2,3,4,5,6,7,8

FEES DW 100 DUP(0)

TABLE DB 'ABCDEFG'

DATA ENDS

_CODE SEGMENT PARA PUBLIC 'CODE'

ASSUME CS:_CODE,DS:DATA

_MAIN PROC FAR

PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV AX,(END1− ARRY)/2 ;(AX)=( (1) )

MOV CH,A3,F1[5] ;(CH)=( (2) )

MOV DX,BAZ ;(DX)=( (3) )

MOV CL,G ;(CL)=( (4) )

AND DX,MASK G ;等同于:AND DX,( (5) )

MOV CL,WIDTH G ;(CL)=( (6) )

MOV DX,BLOCK+(6− 1)*2 ;(DX)=( (7) )

MOV AX,4C00H

INT 21H

_MAIN ENDP

_CODE ENDS

END _MAIN

答案:(1)7;(2)63H;(3)2380H;(4)7;(5)1F80H;(6)7;(7)6

【317】执行下列程序后,回答指定问题:

DATA SEGMENT

D1 DB 90H

D2 DB 100

D3 DB ?

D4 DB ?

DATA ENDS

...

MOV AL,D1

ADD AL,D2

Page 95: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·91·

JO NEXT

MOV D3,AL

MOV D4,0

JMP @80

NEXT: MOV D4,1

@80: HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(D3)=( (2) ),(D4)=( (3) )。

答案:(1)两个数相加,判断是否有溢出;(2)0F4H;(3)0

【318】下面是一个简化的程序清单,请填入此程序在执行过程中堆栈的变化。

0000 STACKSG SEGMENT PARA STACK 'STACK'

0000 20[????] DW 32 DUP(?)

0040 STACKSG ENDS

0000 CODESG SEGMENT PARA 'CODE'

0000 BEGIN PROC FAR

ASSUME CS:CODESG,SS:STACKSG

NOP ;(SP)=( (1) )

0000 1E PUSH DS

0001 2B C0 SUB AX,AX

0003 50 PUSH AX

0004 E8 0008 R CALL B10 ;(SP)=( (2) ),(SS:SP)

=( (3) )

0007 CB RET ;(SP)=( (4) ),(SS:SP-

8)

=( (5) )

0008 BEGIN ENDP

0008 B10 PROC

0008 E8 000C R CALL C10

000B C3 RET

000C B10 ENDP

000C C10 PROC

000C C3 RET

000D C10 ENDP

000D CODESG ENDS

END BEGIN

答案:(1)40H;(2)3AH;(3)0007;(4)40H;(5)000BH

【319】现有程序段如下:

Page 96: IBM-PC 汇编语言程序设计试题解

·92· IBM-PC 汇编语言程序设计试题解

LEA BX,ARRAY

MOV CX,99

MOV AX,[BX]

@100: ADD BX,2

ADD AX,BX

LOOP @100

JNO @200

MOV AX,0

JMP @300

@200: MOV CL,100

DIV CL

@300: MOV RESULT,AX

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后指出 RESULT 字单元中的内容是( (2) )。

答案:(1)求 100 个数据之和,并判断结果是否有溢出;(2)如无溢出,则将计算的结

果送入 RESULT 单元;如有溢出,则将溢出标志送入 RESULT 单元

【320】若有如下数据段:

DATA SEGMENT PARA 'DATA'

BLOCK DB "12","34","56","11","78","98","76","88","53"

COUNT EQU $− OFFSET BLOCK

MAX DB 2 DUP(0)

DATA ENDS

下列程序执行后 MAX,MAX+1 单元的内容是( (1) )、( (2) )。

MOV SI,OFFSET BLOCK

LEA BX,MAX

MOV CX,COUNT

LODSB

SAR CX,1

MOV AH,AL

LODSB

DEC CX

COMP: MOV DH,[SI]

MOV DL,[SI+1]

CMP AX,DX

JGE NEXT

MOV AX,DX

NEXT: INC SI

Page 97: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·93·

INC SI

LOOP COMP

MOV [BX],AH

MOV [BX+1],AL

答案:(1)'9';(2)'8'

【321】分析下列程序,当程序执行到 MOV AH,4CH 时,请回答:

① (AX)=( (1) );

② (DX)=( (2) );

③ (SP)=( (3) );

④ 该程序的功能是( (4) )。

STACK SEGMENT PARA STACK 'STACK'

STAPN DW 100 DUP(?)

STACK ENDS

DATA SEGMENT

NUM DB 06H

SUM DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START: MOV AX,DATA

MOV DS,AX

PUSH AX

PUSH DX

CALL KKK

MOV AH,4CH

INT 21H

KKK PROC

XOR AX,AX ;AX 清零

MOV DX,AX ;DX 清零

INC DL ;DL 初值为 1

MOV CL,NUM ;循环计数器(CX)=(NUM)=6

MOV CH,0

BBB: ADD AL,DL ;DL 中 BCD 数相加,存入 AL

DAA

INC DL ;DL 加 1

LOOP BBB

MOV SUM,AL ;AL 中的结果存于 SUM 单元

RET

Page 98: IBM-PC 汇编语言程序设计试题解

·94· IBM-PC 汇编语言程序设计试题解

KKK ENDP

CODE ENDS

END START

答案:

(1)(AH)=0,(AL)=l+2+3+4+5+6=21,所以,(AX)=21H;

(2)(DH)=0,(DL)=7,所以,(DX)=07H;

(3)堆栈区定义为 100 个字,即 200 个字节,所以 SP 初值为堆栈区长度,即:(SP)=

200=C8H;当执行到 MOV AH,4CH 时,堆栈仍压入了 AX、DX,于是,(SP)=C4H;

(4)对 1~6的自然数进行 BCD 数求和,结果为 BCD 数,存于 NUM;

【322】执行下列程序后,回答指定问题:

DATA SEGMENT

ARRAY DB 12H,94H,86H,78H,90H,54H,0ABH,81H,34H,61H

N EQU $− ARRAY

NP DB ?

NN DB ?

DATA ENDS

...

MOV BX,OFFSET ARRAY

MOV CX,N

@801: MOV AL,[BX]

CMP AL,0

JGE @802

INC DL

JMP @803

@802: INC DH

@803: INC BX

DEC CX

JNZ @801

MOV NP,DL

MOV NN,DH

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(NP)=( (2) ),(NN)=( (3) )。

答案:(1)分别统计正数和负数的个数;(2)5;(3)5

【323】阅读程序:

ORG 100H

MOV CX,5

Page 99: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·95·

MOV DI,150H

BBB: MOV BL,0FFH

MOV AL,[DI]

CMP AL,3AH

JNB DONE

SUB AL,30H

JB DONE

MOV BL,AL

DONE: MOV AL,BL

MOV [DI+0AH],AL

INC DI

LOOP BBB

HLT

请回答如下问题:

① 该程序的功能是( (1) )。

② 若程序执行前的内存状态如下列左表,对应右侧单元程序执行完的状态是什么?

DS:150H 36H DS:15AH ( (2) )

37H ( (3) )

42H ( (4) )

48H ( (5) )

30H ( (6) )

答案:(1)将从数据段偏移量 150H 开始的连续 5 个数,求出用 ASCII 码表示的十进制

数的值。不在十进制数范围的码用 FF 表示;

(2)~(6)

DS:150H 36H DS:15AH 06H

37H 07H

42H FFH

48H FFH

30H 00H

【324】执行下列程序后,回答指定问题:

DATA SEGMENT

D1 DB 100,− 30,64

N EQU $− D1

D2 DB ?

D3 DB ?

DATA ENDS

...

MOV SI,OFFSET D1

Page 100: IBM-PC 汇编语言程序设计试题解

·96· IBM-PC 汇编语言程序设计试题解

MOV CX,N

DEC CX

MOV AL,[SI]

MOV BL,AL

@801: INC SI

CMP AL,[SI]

JGE @802

MOV AL,[SI]

JMP @803

@802: CMP BL,[SI]

JLE @803

MOV BL,[SI]

@803: DEC CX

JNZ @801

MOV D2,AL

MOV D3,BL

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(D1)=( (2) ),(D2)=( (3) )

答案:(1)在 D1 数据区中分别找出最大数和最小数;(2)64H;(3)0E2H

【325】执行下列程序后,回答指定问题:

DATA SEGMENT

ARRAY DW 23ABH,1570H,576,175AH,436,5210H

COUNT EQU ($− ARRAY)/2

DO DB ?

DE DB ?

DATA ENDS

...

LEA SI,ARRAY

MOV CX,COUNT

SUB BX,BX

@801: MOV AX,[SI]

TEST AX,0001H

JZ @802

INC BL

JMP @803

@802: INC BH

@803: ADD SI,2

Page 101: IBM-PC 汇编语言程序设计试题解

第 1 章 填 空 题 ·97·

DEC CX

JNZ @801

MOV DO,BL

MOV DE,BH

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(DO)=( (2) ),(DE)=( (3) )。

答案:(1)分别统计奇、偶的个数;(2)1,(3)5

【326】执行下列程序后,回答指定问题:

DATA SEGMENT

X DW 9

N DW 5

RESULT DW ?

DATA ENDS

...

MOV AX,X

MOV CX,N

DEC CX

JZ @1002

MOV DX,0

@1001: MUL X

LOOP @1001

@1002: MOV RESULT,AX

HLT

请问:① 该程序的功能是( (1) )。

② 程序执行后(RESULT)=( (2) )。

答案:(1)实现 XN的运算;(2)0E6A9H 或 9

5或 59049D

Page 102: IBM-PC 汇编语言程序设计试题解

第 2章 选 择 题

2.1 基 础 知 识

【327】计算机存储数据的最小单位是二进制的( )。

A.位(比特) B.字节 C.字长 D.千字节

答案:A

【328】一个字节包含( )个二进制位。

A.8 B.16 C.32 D.64

答案:A

【329】通常以 KB、MB 或 GB 为单位来反映存储器的容量。所谓容量指的是存储器中所包

含的字节数。1KB 等于( )字节。

A.1000 B.1048 C.1024 D.1056

答案:C

【330】1MB 等于( )字节。

A.100000 B.1024000 C.1000000 D.1048576

答案:D

【331】640KB等于( )字节。

A.655360 B.640000 C.600000 D.64000

答案:A

【332】64 位机的字长为( )个二进制位。

A.32 B.16 C.8 D.64

答案:D

【333】在计算机内部,一切信息的存取、处理和传送都是以( )形式进行的。

A.EBCDIC B.ASCII C.十六进制编码 D.二进制编码

答案:D

【334】下列数据中,有可能是八进制数的是( )。

A.488 B.317 C.597 D.189

答案:B

Page 103: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·99·

【335】与十进制数 56 等值的二进制数是( )。

A.111000 B.111001 C.101111 D.110110

答案:A

【336】十进制数 153 转换成二进制数是( )。

A.10110110 B.10100001 C.10000110 D.10011001

答案:D

【337】十进制数 59 转换成八进制数是( )。

A.(73)8 B.(37)8 C.(59)8 D.(112)8

答案:A

【338】十进制数 89 转换成十六进制数是( )。

A.(95)16 B.(59)16 C.(950)16 D.(89)16

答案:B

【339】二进制数 10101转换成十进制数是( )。

A.(25)10 B.(23)10 C.(21)10 D.(22)10

答案:C

【340】二进制数 1111100 转换成十进制数是( )。

A.(124)10 B.(152)10 C.(89)10 D.(213)10

答案:A

【341】二进制数 110100转换成八进制数是( )。

A.(21)8 B.(64)8 C.(54)8 D.(46)8

答案:B

【342】二进制数 111010011 转换成十六进制数是( )。

A.(323)16 B.(1D3)16 C.(133)16 D.(3D1)16

答案:B

【343】十六进制数 10AC转换成二进制数是( )。

A.1101110101110 B.1010010101001

C.1000010101100 D.1011010101100

答案:C

【344】八进制数 413 转换成十进制数是( )。

A.(324)10 B.(267)10 C.(299)10 D.(265)10

Page 104: IBM-PC 汇编语言程序设计试题解

·100· IBM-PC 汇编语言程序设计试题解

答案:B

【345】十六进制数 2A3C转换成十进制数是( )。

A.(11802)10 B. (16132)10 C.(10812)10 D.(11802)10

答案:C

【346】十六进制数 1A8F转换成十进制数是( )。

A.(7652)10 B.(6787)10 C.(7672)10 D.(6799)10

答案:D

【347】下面几个不同进制的数中,最大的数是( )。

A.(1100010)2 B.(225)8 C.(500)10 D.(1FE)16

答案:D

【348】下面几个不同进制的数中,最大的数是( )。

A.(1011)16 B.(1011)10 C.(1011)8 D.(1011)2

答案:A

【349】下面几个不同进制的数中,最小的数是( )。

A.(1001001)2 B.(75)10 C.(37)8 D.(A7)16

答案:C

【350】下面几个不同进制的数中,最小的数是( )。

A.(1011100)2 B.(35)10 C.(47)8 D.(2E)16

答案:B

【351】在下列无符号十进制整数中,能用 8 位二进制数表示的是( )。

A.255 B.256 C.317 D.289

答案:A

【352】十进制正数 43 的八位二进制原码是( )。

A.00110101 B.00101011 C.10110101 D.10101011

答案:B

【353】十进制负数-61的八位二进制原码是( )。

A.00101111 B.00111101 C.10101111 D.10111101

答案:D

【354】十进制正数 43 的八位二进制反码是( )。

Page 105: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·101·

A.00101011 B.10101011 C.00110101 D.10110101

答案:A

【355】十进制负数-61的八位二进制反码是( )。

A.01000010 B.01010000 C.11000010 D.11010000

答案:C

【356】十进制正数 38 的八位二进制补码是( )。

A.00011001 B.10100110 C.10011001 D.00100110

答案:D

【357】十进制负数-38的八位二进制补码是( )。

A.01011011 B.11011010 C.11011011 D.01011010

答案:B

【358】有一个八位二进制数的补码是 11111101,其相应的十进制数是( )。

A.-3 B.-2 C.509 D.253

答案:A

【359】补码 10110110 代表的十进制负数是( )。

A.-54 B.-68 C.-74 D.-48

答案:C

【360】十进制数-75 用二进制数 10110101 表示,其表示方式是( )。

A.原码 B.补码 C.反码 D.ASCII 码

答案:B

【361】“美国信息交换标准代码”的简称是( )。

A.EBCDIC B.ASCII C.GB2312-80 D.BCD

答案:B

【362】数字字符 2 的 ASCII 为十进制数 50,数字字符 5 的 ASCII 为十进制数( )。

A.52 B.53 C.54 D.55

答案:B

【363】数字字符 4 的 ASCII 为十进制数 52,数字字符 9 的 ASCII 为十进制数( )。

A.57 B.58 C.59 D.60

答案:A

Page 106: IBM-PC 汇编语言程序设计试题解

·102· IBM-PC 汇编语言程序设计试题解

【364】已知英文大写字母 A 的 ASCII 为十进制数 65,则英文大写字母 E 的 ASCII 为十进

制数( )。

A.67 B.68 C.69 D.70

答案:C

【365】已知英文大写字母 G 的 ASCII 为十进制数 71,则英文大写字母 W 的 ASCII 为十进

制数( )。

A.84 B.85 C.86 D.87

答案:D

【366】已知英文小写字母 d 的 ASCII 为十进制数 100,则英文小写字母 h 的 ASCII 为十

进制数( )。

A.103 B.104 C.105 D.106

答案:B

【367】已知英文小写字母 m 的 ASCII 为十进制数 109,则英文小写字母 y 的 ASCII 为十

进制数( )。

A.119 B.120 C.121 D.122

答案:C

【368】在计算机领域中,不常用到的进制是( )。

A.二进制 B.四进制 C.八进制 D.十六进制

答案:B

【369】下列逻辑代数运算,哪个是正确的?( )。

A.1+l=1 B.0+0=1 C.1+1=2 D.1+l=10

答案:A

【370】逻辑代数中,A+ BA ∗ =( )。

A. BA ∗ B.A +B C.A + B D.A+B

答案:D

【371】逻辑式 A+AB 的最简式为( )。

A.A B.AB C.A+B D.以上都不对

答案:A

【372】逻辑式 CBACBAY +++= 的最简式是( )。

A.A +B B.0 C.B+ C D.1

Page 107: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·103·

答案:D

【373】下面叙述关系正确的是( )。

A.1⊕A=1 B.1⊕A=0 C.1⊕A=A D.1⊕A=A

答案:D

【374】 )BA( + 和( )相等。

A.A+B B.AB C. B*A D.以上都不对

答案:C

【375】若“与非”门输入为 A 和 B,只有当 A、B分别为( )时,输出 Y=0。

A.0,0 B.0,1 C.1,0 D.1,1

答案:D

【376】逻辑代数中,下列哪个不正确?( )。

A.A+A=A B.A*A =1 C.A+0=A D.A*1=A

答案:B

【377】在微机汉字系统中,一个汉字的机内码占的字节数是( )。

A.1 B.2 C.4 D.8

答案:B

【378】十六进制数 88H,可表示成下面几种形式,请找出错误的表示( )。

A.无符号十进制数 136 B.带符号十进制数-120

C.压缩型 BCD 码十进制数 88 D.8 位二进制数-8 的补码表示

答案:D

【379】设 X 补=11010101B,则[X 补]求补=( )。

A.10101011B B.00101010B C.00101011B D.11010100B

答案:C

【380】一个负数 X 的补码表示为 11XXXXXXB,对其进行一位算术左移后所得到的 8 位二

进制数是( )。

A.2X 的补码 B.X/2 的补码

C.(256-X)的补码 D.(128-X)的补码

Page 108: IBM-PC 汇编语言程序设计试题解

·104· IBM-PC 汇编语言程序设计试题解

答案:A

【381】设计算机中参与运算的两数 X 和 Y 均为补码形式,其中 X=87H,Y=B4H,当计算

机执行 X-Y指令时,最终在硬件加法器中进行的操作为( )。

A.F9H+B4H B.79H+B4H C.87H+CCH D.87H+4CH

答案:D

【382】所谓“变号操作”是指将一个整数变成绝对值相同但符号相反的另一个整数。假

设使用补码表示的 8 位整数 X=10010101,则经过变号操作后结果为( )。

A.01101010 B.00010101 C.11101010 D.01101011

答案:D

【383】一个字符的 ASCII 值占用( )位(二进制)。

A.6 B.7 C.8 D.9

答案:B

【384】ASCII码 32H 表示的字符是( )。

A.“3” B.“2” C.“b” D.“B”

答案:B

【385】8 位二进制补码整数的最小值是( )。

A.-126D B.-127D C.-128D D.-129D

答案:C

【386】16 位二进制补码表示为十进制数的范围是( )。

A.-32768D~32768D B.-32768D~32767D

C.-32767D~32768 D.-32767D~32767D

答案:B

【387】若计算机字长 16位,则无符号整数表示为十六进制数的范围是( )。

A.8000H~FFFFH B.0000H~8000H

C.0000H~FFFFH D.0001H~FFFFH

答案:C

【388】在计算机中一个字节由( )位二进制组成。

A.2 B.4 C.8 D.16

答案:C

【389】计算机存储信息的基本单位是一个( )位。

Page 109: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·105·

A.二进制 B.八进制 C.十进制 D.十六进制

答案:A

【390】16 位二进制补码表示为十六进制数的范围是( )。

A.8000H~FFFFH B.0000H~8000H

C.7FFFH~FFFFH D.8000H~7FFFH

答案:D

【391】将十进制负数 115 的补码扩展到 32 位数,则结果为( )。

A.FFFF FF73H B.8000 0073H

C.FFFF FF8DH D.8000 008DH

答案:C

【392】对数值 7DA3H 做“非”运算的结果是( )。

A.824CH B.825BH C.825DH D.825CH

答案:D

【393】一个字符的 ASCII 的最高位一般用作( )。

A.符号位 B.数值最高位 C.校验位 D.冗余校验位

答案:C

【394】ASCII常用( )位二进制码来表示一个字符。

A.6 B.7 C.8 D.16

答案:B

【395】字符“e”的 ASCII 是( )。

A.62H B.63H C.64H D.65H

答案:D

【396】下列数码中设有奇偶校验位,检测数据是否有错误,试问采用偶校验时,哪个数

据出错( )。

A.11011010 B.1010110 C.01100110 D.10010101

答案:A

【397】一个 8 位的二进制整数,若采用补码表示,且由 3 个“1”和 5 个“0”组成,则最

小值为( )。

A.-127 B.-32 C.-125 D.-3

答案:C

Page 110: IBM-PC 汇编语言程序设计试题解

·106· IBM-PC 汇编语言程序设计试题解

【398】十进制数-80用 16 位补码表示是( )。

A.FFB0H B.8080H C.FF80H D.FO80H

答案:A

【399】一位十进制的非压缩 BCD 码用( )位二进制数表示。

A.2 B.4 C.8 D.16

答案:C

2.2 硬 件 知 识

【400】在汇编语言程序设计中,一般使用( )。

A.逻辑地址 B.物理地址 C.偏移地址 D.段地址

答案:A

【401】设段地址和偏移地址是 1A4BH:0B56H,那么它所对应存储单元中的物理地址

是( )。

A.1AF06H B.1B006H C.1AFF6H D.1B106H

答案:B

【402】在 CPU 中跟踪下一条指令地址的寄存器是( )。

A.主存地址寄存器 B.指令寄存器

C.指令计数器 D.状态条件寄存器

答案:C

【403】某机器字长 16 位,它的存储容量是 64KB 位,若按字编址,则它的寻址范围

是( )。

A.64KB B.32KB C.64K D.32K

答案:D

【404】冯·诺依曼机的基本特征是( )。

A.微程序控制 B.存储程序控制

C.组合逻辑控制 D.同步控制

答案:B

【405】指令指针寄存器是( )。

A.IP B.SP C.BP D.PSW

答案:A

【406】“溢出”一般是指计算机在运算过程中产生的( )。

A.数据量超过了内存容量

Page 111: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·107·

B.文件个数超过了磁盘目录区规定的范围

C.数超过了机器所能表示的范围

D.数超过了变量的表示范围

答案:C

【407】8086CPU 状态标志寄存器共有( )个可使用标志位。

A.8 B.16 C.9 D.12

答案:C

【408】8086中可作基址寻址的寄存器是( )。

A.CX、DX B.BX、BP C.AX、BX D.CX、BP

答案:B

【409】若 8086 执行一运算指令后 ZF=1 表明( )。

A.结果为正 B.结果为负 C.结果不为 0 D.结果为 0

答案:D

【410】若进栈序列为 1,2,3,4,进栈过程中可以出栈,则( )不可能是一个出

栈序列。

A.1,4,3,2 B.2,3,4,1 C.3,1,4,2 D.3,4,2,1

答案:C

【411】在堆栈段中,存放栈顶地址的寄存器是( )。

A.IP B.SP C.BX D.BP

答案:B

【412】汇编语言程序中,反映指令操作结果的标志是( )。

A.状态标志 B.控制标志 C.ZF D.DF

答案:A

【413】PSW 寄存器中共有( )位条件状态位,有( )位控制状态位。

A.6、3 B.3、6 C.8、4 D.4、8

答案:A

【414】下列叙述正确的是( )。

A.不同类型的机器指令系统不相同 B.机器指令都是 8 位

C.16 位机的指令系统完全相同 D.机器指令都是 16 位

答案:A

Page 112: IBM-PC 汇编语言程序设计试题解

·108· IBM-PC 汇编语言程序设计试题解

【415】下列叙述正确的是( )。

A.8088 内部数据总线是 8 位,外部数据总线是 8位

B.8086 内部数据总线是 16 位,外部数据总线是 16位

C.8086 内部数据总线是 8 位,外部数据总线是 16位

D.8088 内部数据总线是 16 位,外部数据总线是 16位

答案:B

【416】在程序运行过程中,确定下一条指令的物理地址的计算表达式是( )。

A.CS×16+IP B.DS×16+DI C.SS×16+SP D.ES×16+SI

分析:我们知道 IBM-PC机采用了存储器地址分段的方法,即将存储器分为 4 个逻辑段:

代码段、数据段、附加数据段和堆栈段,并分别由段寄存器 CS,DS,ES 和 SS 来存放各逻辑

段的段地址。而作为构成程序的指令是安排在代码段中,其段地址应在代码段寄存器 CS 中,

其偏移地址应保存在指令指针寄存器 IP 中。因此,根据物理地址的形成原则,下一条指令的

物理地址应为 CS×16+IP。

答案:A

【417】8086/8088 微处理器有( )地址线,直接寻址内存空间的范围是( )。

A.10 条,64KB B.20 条,64KB C.16 条,1MB D.20 条,1MB

答案:D

【418】如果内存中某一单元的物理地址是 20B4CH,那么它的逻辑地址是 ( ):212CH。

A.1EA2H B.lEB2H C.1FA2H D.1FB2H

答案:A

【419】一个有 16 个字的数据区,它的起始地址是 1000H:117AH,请指出这个数据区最末

一个字单元的物理地址是( )。

A.111ACH B.11190H C.11198H D.1119AH

答案:C

【420】存储器按段划分,每个段的大小是( )。

A.1MB B.216B C.2

16KB D.2

16MB

答案:B

【421】一个 16 位相对偏移量的范围是( )。

A.0~65535 B.0000H~FFFFH

C.8000H~7FFFH D.8000H~FFFFH

答案:C

【422】某系列微机对存储器的分段,如果每一个段最多的字存储单元(16 位二进制)是

Page 113: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·109·

32K,那么表示段内字节单元偏移地址的二进制位数应是( )。

A.20 位 B.16 位 C.15 位 D.12 位

答案:B

【423】在段地址的操作中可使用的寄存器可以是( )。

A.CX B.SP C.BP D.SS

答案:D

【424】如果内存中某一单元的物理地址是 1CA36H,那么它的逻辑地址是( ):3056H。

A.1998H B.1999H C.1990H D.199EH

答案:D

【425】存储器地址是用二进制数来表示的,但它的书写格式为( )数。

A.二进制 B.八进制 C.十进制 D.十六进制

答案:D

【426】在 IBM-PC计算机中为了正确存放或取得信息,每一个字节单元给以一个( )。

A.寄存器地址 B.存储器地址 C.程序地址 D.指令地址

答案:B

【427】当标志位 TF 置为 1 时,每条指令执行后,CPU 自动产生的中断称为( )。

A.可屏蔽中断 B.非可屏蔽中断 C.单步中断 D.断点中断

答案:C

【428】能保存各逻辑段的起始地址的寄存器称为( )。

A.段寄存器 B.地址寄存器 C.数据寄存器 D.计数寄存器

答案:A

【429】在计算机的操作中由外设控制器或协处理器引起的中断一般称为( )。

A.非屏蔽中断 B.内中断 C.外中断 D.软中断

答案:C

【430】一个有 128 个字的数据区,它的起始地址为 12ABH:00ABH,请给出这个数据区最

末一个字单元的物理地址是( )。

A.12C5BH B.12B6BH C.12C59H D.12BFEH

答案:C

2.3 寻址及指令

【431】操作数在寄存器中,则它的寻址方式是( )。

Page 114: IBM-PC 汇编语言程序设计试题解

·110· IBM-PC 汇编语言程序设计试题解

A.直接寻址 B.寄存器相对寻址 C.寄存器寻址 D.寄存器间接寻址

答案:C

【432】基址寄存器的内容、变址寄存器的内容以及指令中指定的位移量三者之和作为操

作数的有效地址,它的寻址方式是( )。

A.直接寻址方式 B.寄存器相对寻址

C.基址变址寻址 D.相对基址变址寻址

答案:D

【433】下列 4 个寄存器中,可作为 16位寄存器的是( )。

A.DL B.CL C.BP D.BH

分析:在汇编语言程序中,加工处理的主要对象就是 CPU寄存器和存储单元。因此掌握

好各寄存器的分类、特点和作用是非常重要的。在 CPU 的通用寄存器中,据寄存器 AX,BX,

CX,DX 既可作为 16 位寄存器,又可作为两个 8 位寄存器,分别记为 AH、AL、BH、BL、CH、

CL 和 DH、DL。而基址寄存器 BP 一般用作寄存器间接寻址或在基址变址寻址时用作有效操作

数的基地址。它是一个整体,不可分开用。因此在上述题目给定的 4 个寄存器中,只有 BP

是一个 16 位寄存器。

答案:C

【434】当执行指令 ADD AX,BX后,若 AX的内容为 2BA0H,设置的奇偶标志位 PF=1,下面

的叙述正确的是( )。

A.表示结果中含 1 的个数为偶数 B.表示结果中含 1 的个数为奇数

C.表示该数为偶数 D.表示结果中低八位含 1 的个数为偶数

答案:D

【435】完成将累加器 AL清零,并使进位标志 CF清零,下面错误的指令是( )。

A.MOV AL,00H B.AND AL,00H C.XOR AL,AL D.SUB AL,AL

答案:A

【436】在下列指令的表示中,不正确的是( )。

A.MOV AL,[BX+SI] B.JMP SHORT DON1

C.DEC [BX] D.MUL CL

答案:C

【437】下列指令执行后总是使 CF=0,OF=0 的是( )。

A.AND B.NEG C.NOT D.INC

答案:A

【438】完成同指令 XCHG AX,BX 相同功能的指令或指令序列是( )。

Page 115: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·111·

A.MOV AX,BX B.MOV BX,AX C.PUSH AX D.MOV CX,AX

POP BX MOV AX,BX

MOV BX,CX

答案:D

【439】在存储器中留 60个字的空单元的伪指令是( )。

A.ARRAY EQU 60 B.ARRAY DW 60

C.ARRAY DB 60 DUP(?) D.ARRAY DW 60 DUP(?)

答案:D

【440】使一个二进制位(BIT)置“1”的正确可靠的方法是( )。

A.该位“加”上“1” B.该位“与”上“1”

C.该位“或”上“1” D.该位“异或”上“1”

答案:C

【441】指令 TEST AL,02H的含义是( )。

A.测试 AL是否等于 02H B.测试 AL第 2 位状态

C.测试 AL第 1 位状态 D.将 AL 与 02 单元的各位进行测试

答案:C

【442】指令 MOV [BX][DI],DX 的段内地址为( )。

A.BX 值加 DI 值 B.BX 值减 DI 值

C.BX 值左移 4 位加 DI值 D.BX 值加 DI 值左移 4 位

答案:A

【443】指令 MUL CX 是将( )。

A.(CX:AX)←(AX)×(CX) B.(AX:CX)←(AX)×(CX)

C.(DX:AX)←(AX)×(CX) D.(AX:BX)←(AX)×(CX)

答案:C

【444】指令 SAL AL,CL 是( )。

A.AL 内容左移到 CL 寄存器中,低位补 0

B.AL 内容左移 CL 指出的位数,低位补 0

C.AL 内容左移到 CL 寄存器中,低位补 CL 高位

D.AL 内容左移 CL 指出的位数,低位补 AL 高位

答案:B

【445】8086CPU 不能用指令直接访问的寄存器是( )。

A.SS B.BP C.ES D.IP

Page 116: IBM-PC 汇编语言程序设计试题解

·112· IBM-PC 汇编语言程序设计试题解

答案:D

【446】8086CPU 在执行 8位有符号数运算后,产生溢出是结果超过了( )范围。

A.0~255 B.+128~-128 C.+255~-256 D.+127~-128

答案:D

【447】指令 MOV AX,DAT[SI],其中源操作数的寻址方式是( )。

A.直接寻址 B.基址加变址寻址

C.寄存器间接寻址 D.寄存器相对寻址

答案:D

【448】下列对 PSW 寄存器中标志位产生影响的指令是( )。

A.JMP DON B.LOOPNE DON C.CALL DON D.AAA

答案:D

【449】8086I/O 间接寻址时可用于间址寄存器的为( )。

A.CX B.DX C.SI D.BP

答案:B

【450】下列指令中不会改变 PC 寄存器内容的是( )。

A.MOV B.JMP C.CALL D.RET

答案:A

【451】8086通用寄存器各有不同的特殊功能,其中 DX 寄存器的特定用法是( )。

A.在间接寻址中作变址寄存器

B.在循环指令中作循环计数寄存器

C.在 I/O 指令间接寻址中作地址寄存器

D.在间接寻址中作基址寄存器

答案:C

【452】当 8086 访问存储器 0010:4000 单元时,其物理地址为( )。

A.04100H B.40010H C.10400H D.01040H

答案:A

【453】8086中 JE LABEL1 在状态标志( )后转移到 LABEL1。

A.ZF=1 B.ZF=0 C.SF=1 D.PF=0

答案:A

【454】8086指令助记符书写中,[BP]表示( )。

Page 117: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·113·

A.BP 寄存器内容 B.数据段中 BP 内容作编移量的单元

C.堆栈段中 BP 内容作偏移量的单元 D.基址段中 BP 内容作偏移量的单元

答案:C

【455】下列 8086 指令中不影响堆栈变化的指令是( )。

A.PUSH B.JMP LABEL1 C.CALL PROC1 D.RETI

答案:B

【456】8086间接转移指令( )转移。

A.可用于段内也可用于段间 B.仅用于段内

C.仅用于段间 D.仅用于+127~-128的范围

答案:A

【457】8086中执行指令 RET 04H 表示( )。

A.返回到 04H 单元 B.作段间返回

C.返回到当前地址后第 4 个单元 D.完成 RET指令后 SP 加 04H

答案:D

【458】不能改变 8086 程序计数指针 IP 的指令是( )。

A.RET B.PUSH AX C.CALL D.JBE

答案:B

【459】不影响 8086 堆栈指针 SP 值的指令是( )。

A.JMP B.PUSH AX C.POP CX D.INT 21H

答案:A

【460】执行相对寻址的跳转分支指令时,如果操作码放在地址 1100H 处,转移后在 10FCH

处开始执行下一条指令,那么相对偏移量为( )。

A.06H B.0FAH C.0FEH D.0EH

答案:B

【461】( )指令影响 8086 状态标志寄存器的状态位。

A.MOV AX,BX B.NOT C.XCHG D.TEST

答案:D

【462】下列不正确的一条命令是(设 DATA 已定义) ( )。

A.MOV 4[DI],02H B.MOV BYTE PTR 4[DI],02H

C.MOV 4[DI],AL D.MOV DATA[DI],02H

答案:A

Page 118: IBM-PC 汇编语言程序设计试题解

·114· IBM-PC 汇编语言程序设计试题解

【463】下列 4 条指令中,有( )条指令需要使用 DX 寄存器?

MUL BX;DIV BL;IN AX,20H;OUT 20H,AL

A.1 条 B.2 条 C.3 条 D.4 条

答案:A

【464】下列指令中,不影响标志位的指令是( )。

A.SUB AX ,BX B.ROR AL,1 C.JNC Label D.INT n

答案:C

【465】假设 V1 和 V2 是用 DW 定义的变量,下列指令中正确的是( )。

A.MOV V1,20H B.MOV V1,V2

C.MOV AL,V1 D.MOV 2000H,V2

答案:A

【466】下列哪条指令不合法?( )

A.IN AX,0278H B.RCR DX,CL C.CMPSB D.RET 4

答案:A

【467】假设 AX 和 BX 寄存器中存放的是有符号整数,为了判断 AX 寄存器中的数据是否

大于 BX 寄存器中的数据,应采用下面哪一种指令序列?( )

A.SUB AX,BX B.SUB AX,BX

JC label0 JNC label0

C.CMP AX,BX D.CMP AX,BX

JA label0 JG 1abel0

注:label0表示条件转移指令的目标地址。

答案:D

【468】在下列指令中,隐含使用 AL寄存器的指令有( )条

SCASB;XLAT;MOVSB;DAA;NOP;MUL BH;

A.1 条 B.2 条 C.4 条 D.5 条

答案:C

【469】根据下面提供的 PC机内存中的数据,INT 11H中断服务程序的入口地址是( )。

0000:0040 B3 18 8A CC 4D F8 00 F0--41 F8 00 F0 C5 18 8A CC

0000:0050 39 E7 00 F0 A0 19 8A CC--2E E8 00 F0 D2 EF 00 F0

A.4DF8:00F0 B.F000:F84D C.A019:8ACC D.CC8A:19A0

答案:B

【470】若(AX)=0122H,4个标志位 CF、SF、ZF、OF 的初始状态为 0,执行指令

Page 119: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·115·

SUB AX,0FFFH 后,这 4 个标志位的状态是( )。

A.(CF)=0, (SF)=0, (ZF)=0, (OF)=0

B.(CF)=1, (SF)=1, (ZF)=0, (OF)=0

C.(CF)=0, (SF)=0, (ZF)=1, (OF)=1

D.(CF)=1, (SF)=1, (ZF)=1, (OF)=1

答案:B

【471】下列指令中,有语法错误的是( )。

A.MOV [SI],[DI] B.IN AL,DX

C.JMP WORD PTR[BX] D.PUSH WORD PTR 20[BX+SI-2]

答案:A

【472】假定(SS)=2000H, (SP)=0100H, (AX)=2107H,执行指令 PUSH AX后,存放数据

21H 的物理地址是( )。

A.20102H B.20101H C.200FEH D.200FFH

答案:D

【473】下列 4 条指令语句中,( )是错误的。

A.MOV DS,2000H B.ADD DX,[BP]

C.MOV AX,200 D.MOV AX,ARRAY[SI+2]

答案:A

【474】寄存器间接寻址方式中,操作数在( )中。

A.通用寄存器 B.堆栈 C.主存单元 D.段寄存器

分析:在寄存器间接寻址方式中,作为间接用的寄存器,其内容为操作数在内存中的偏

移地址。

答案:C

【475】设(DS)=27FCH,某一数据存储单元的偏移地址为 8640H,则数据存储单元的物理

地址是( )。

A.27FCH B.27FC0H C.30600H D.8640H

分析:该题要求掌握存储器地址的分段以及存储单元物理地址形成的基本知识,同时也

要求能正确完成 16 进制数的加法运算。

答案:C

【476】与 BP寄存器组合才能形成堆栈中物理地址的寄存器是( )。

A.CS 寄存器 B.IP 寄存器 C.DS 寄存器 D.SS 寄存器

答案:D

Page 120: IBM-PC 汇编语言程序设计试题解

·116· IBM-PC 汇编语言程序设计试题解

【477】运算型指令的寻址和转移型指令的寻址,其不同点在于( )。

A.前者取操作数,后者决定程序的转移地址

B.后者取操作数,前者决定程序的转移地址

C.两者都是取操作数

D.两者都是决定程序的转移地址

答案:A

【478】汇编指令中操作数可分为三种类型,下面正确的是( )。

A.二进制操作数 B.立即数操作数 C.ASCII操作数 D.常数操作数

十进制操作数 寄存器操作数 非压缩 BCD码操作数 字符操作数

十六进制操作数 存储器操作数 压缩 BCD 码操作数 字符串操作数

分析:汇编语言指令中的操作数,根据其存储位置的不同分为立即数操作数、寄存器操

作数和存储器操作数。立即数操作数和指令操作码一起存放在代码段区域中;寄存器操作数

表示要加工处理的数据存放在规定的寄存器中;存储操作数表示操作对象存放在指定的数据

段存储单元中。因此选项 B 是正确的。

答案:B

【479】下列指令中操作数在代码段中的是( )。

A.MOV AL,25H B.ADD AH,BL C.INC DS:[25H] D.CMP AL,BL

分析:在 8086/8088 指令系统中,操作数可分为三种类型:存储器操作数、寄存器操作

数和立即操作数。顾名思义,存储器操作数就是操作数存放在存储单元中,通常存放在数据

段或附加数据段区域中;寄存器操作数就是操作数存放在 CPU 的寄存器中,而只有立即操作

数是作为指令的一部分,和指令一起存放在代码段区域中。

答案:A

【480】下面数据传送指令中,正确的指令是( )。

A.MOV BUF1,BUF2 B.MOV CS,AX

C.MOV CL,1000H D.MOV DX,WORD PTR[BP+DI]

分析:数据传送指令是一条双操作数指令,其源操作数和目的操作数都应符合语法规定,因

此前三条指令的错误原因是:A.不允许存储器之间的数据传送;B.代码段寄存器 CS不允许作操

作数;C.CL为 8位寄存器,而 1000H为 16位立即数,因此错误原因是操作数类型不匹配。

答案:D

【481】设(BL)=05H,要使结果(BL)=0AH,应执行的指令是( )。

A.NOT BL B.AND BL,0FH C.XOR BL,0FH D.OR BL,OFH

分析:该题要掌握与、或、非、异或这 4 种逻辑运算指令具体完成的操作功能。实际上

这 4 种逻辑运算均为位运算。选择时应仔细,特别要注意异或运算的操作是相同位为 0,相

异位为 1,该题的正确答案应为 C。

答案:C

Page 121: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·117·

【482】MOV AX,ES:[BX][SI]的源操作数的物理地址是( )。

A.16d×(DS)+(BX)+(SI) B.16d×(ES)+(BX)+(SI)

C.16d×(SS)+(BX)+(SI)) D.16d×(CS)+(BX)+(SI)

分析:这里 ES 表示段超越,源操作数在附加段内。

答案:B

【483】用 MOV 指令将十进制数 89 以组合型 BCD 码格式送入 AX,正确使用的指令是

( )。

A.MOV AX,0089 B.MOV AX,0809H C.MOV AX,0089H D.MOV AX,0809

分析:解答该题时。首先应掌握组合型 BCD 码和非组合型 BCD 码不同的存储格式。所谓

BCD 码又称 8421 码,即用 4 位二进制数来表示一位十进制数。非组合型 BCD 码的存储格式是

用一个字节来存放一位 BCD 码,也就是高 4 位为 0,低 4 位为 0000--1001。组合型 BCD码的

存储格式是用一个字节来存放两位 BCD 码,即低 4 位和高 4 位都可以是 0000--1001。为了书

写简便,通常将二进制数写成十六进制形式。因此解答该题时,首先就排除了 A 和 D。十进

制数 89 的组合型 BCD 码的二进制形式应为 10001001B,表示成十六进制形式为 89H,当 AX

的高字节为 0 时,显然正确答案应为 C。

答案:C

【484】JMP FAR PTR ABCD (ABCD 是符号地址)是( )。

A.段内间接转移 B.段间间接转移 C.段内直接转移 D.段间直接转移

分析:FAR PTR 是表示段间转移的操作符。

答案:D

【485】完成(BX)-(CX)→(AX)的错误操作是( )。

A.SUB BX,CX B.SUB AX,BX C.XCHG AX,BX D.MOV AX,BX

MOV AX,BX SUB AX,CX SUB AX,CX SUB AX,CX

分析:对于任何指定的操作,都可以用不同的指令组合完成。这不仅要求对指令的正确

选择,而且与指令执行的顺序也有关。经分析,上述 4 种选择中,选择 B 显然是错误的,原

因是第一条减法运算指令中被减数 AX 的初始值不定,而只有当 AX 的内容是 BX 的 2 倍时,才

能完成题目的要求。

答案:B

【486】条件转移指令 JNE 的测试条件是( )。

A.ZF=1 B.CF=0 C.ZF=0 D.CF=1

分析:JNZ 指令和 JNE 指令的测试条件都是 ZF=0,即上一次的运算结果不为零/不相等,

则转移。

答案:C

【487】若(AL)=96H,(BL)=12H,分别执行 MUL BL 和 IMUL BL 指令后,正确的结果是

Page 122: IBM-PC 汇编语言程序设计试题解

·118· IBM-PC 汇编语言程序设计试题解

( )。

A.(AX)=0A8CH B.(AX)=1152 C.(AX)=0A8CH D.(AX)=0F88CH

(AX)=0F88CH (AX)=− 1152 (AX)=0A8CH (AX)=0A8CH

分析:我们在学习乘法运算指令时知道,8086/8088 指令系统设置的乘法运算指令分

为无符号乘法运算和有符号乘法运算。当采用无符号乘法指令 MUL BL 运算时,被乘数(AL)

=96H 表示无符号数,完成 96H×12H=0A8CH,结果也为无符号数;当采用有符号乘法指令

IMUL BL 运算时,被乘数(AL)=96H 就表示为有符号数,完成 96H×l2H=0F88CH。结果也为

有符号数。

答案:A

【488】逻辑移位指令 SHL 用于( (1) );而算术移位指令 SAL 用于( (2) )。

(1)A.带符号数乘 2 B.带符号数除以 2 C.无符号数乘 2 D.无符号数除以 2

(2)A.带符号数乘 2 B.带符号数除以 2 C.无符号数乘 2 D.无符号数除以 2

分析:逻辑移位指令用于无符号数的乘 2、除以 2;算术移位指令用于有符号数的乘 2、

除以 2。

答案:(1)C;(2)A

【489】执行相对寻址的跳转分支指令时,如果操作码放在地址 0047H处,相对偏移地址

是 0CFH,那么转移后在( )处取下一条指令的操作码。

A.0017H B.0018H C.0019H D.001AH

答案:B

【490】指令 JMP DWORD PTR[SI][BX]属于( )寻址。

A.寄存器间接寻址 B.相对基址变址寻址

C.段内转移直接寻址 D.段间转移间接寻址

答案:D

【491】假定(SS)=2000H,(SP)=0100H,(AX)=2107H,执行指令 PUSH AX 后,存放数

据 21H 的物理地址是( )。

A.20102H B.20101H C.200FEH D.200FFH

分析:将累加器 AX 的内容压入堆栈前后的示意图如下所示。8086/8088 堆栈操作只能对

字进行操作。压入时,高 8 位先进,低 8 位后进。所以存放数据 21H 的物理地址为:20000H+

00FFH=200FFH。

压入堆栈前堆栈段 压入堆栈后堆栈段

低地址 低地址

2000:00FEH 07H

2000:00FFH 21H

2000:0100H 2000:0100H 栈顶

答案:D

Page 123: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·119·

【492】执行 2 个有符号整数 8AH 加 9BH 运算后,会产生( )。

A.无溢出且无进位 B.无溢出但有进位

C.有溢出但无进位 D.有溢出且有进位

答案:D

【493】在汇编语言程序设计中,执行 STOS DST指令时,它与( )寄存器有关。

A.BX B.SI C.DI D.BP

答案:C

【494】进行两个补码整数 0C2H 减去 0A5H 运算后,会产生( )。

A.无溢出且无借位 B.无溢出但有借位

C.有溢出但无借位 D.有溢出且有借位

答案:A

【495】直接、间接、立即三种寻址方式指令的执行速度,由快至慢的排序为( )。

A.直接、立即、间接 B.直接、间接、立即

C.立即、直接、间接 D.不一定

答案:C

【496】若(DS)=2000H,(BX)=0050H,(20050H)=12H,(20051H)=34H,执行 MOV AX,[BX]

指令后,AX寄存器中的内容是( )。

A.(AX)=0050H B.(AX)=0012H

C.(AX)=1234H D.(AX)=3412H

答案:D

【497】通常情况下,一个外中断服务程序的第一条指令是 STI,其目的是( )。

A.开放所有屏蔽中断 B.允许低一级中断产生

C.允许高一级中断产生 D.允许同一级中断产生

分析:当 CPU 响应中断时,自动将 IF置为 0,屏蔽所有的可屏敝中断,即不允许中断嵌

套。如果允许中断嵌套,则在中断服务程序中通过指令 STI 将 IF 设置为 1。此时,允许高级

中断打断低级中断,不允许低级中断打断高级中断,也不允许同级中断相互打断。

答案:C

【498】下列描述不正确的是( )。

A.执行指令 XOR AX,AX 后不会改变累加器原有的内容

B.执行指令 TEXT AX,8000H 后,不会改变累加器原有的内容

C.执行指令 AND AX,0FFFFH 后,不会改变累加原有的内容

D.执行指令 OR AX,0000H后,不会改变累加器原有的内容

答案:A

Page 124: IBM-PC 汇编语言程序设计试题解

·120· IBM-PC 汇编语言程序设计试题解

【499】执行返回指令,退出中断服务程序,这时返回地址来自( )。

A.ROM 区 B.程序计数器 C.堆栈区 D.CPU 的暂存寄存器

分析:执行中断处理程序时,要保护和恢复现场,这些操作都是对堆栈操作,所以返回

地址来自堆栈区。

答案:C

【500】下列叙述不正确的是( )。

A.执行 CMP AX,BX 后,既改变了 AX 原有的内容,又对条件码产生了影响

B.执行 SUB AX,BX 后,既改变了 AX 原有的内容,又对条件码产生了影响

C.执行 NEG AX 后,既改变了 AX 原有的内容,又对条件码产生了影响

D.执行 AND AX,BX 后,既改变了 AX 原有的内容,又对条件码产生了影响

答案:A

【501】若(DS)=1500H,(AX)=0C56DH,(CX)=0003H,(PSW)=0001H,执行 RCL AX,CL

指令后,AX寄存器中的内容是( )。

A.(AX)=2B68H B.(AX)=2B6BH

C.(AX)=2B6FH D.(AX)=2B6EH

答案:C

【502】执行循环指令 LOOPNZ DON1时,若要使其重复执行,应满足的条件是( )。

A.CX≠0,ZF=0 B.CX≠0,ZF=1

C.CX=0,ZF=0 D.CX=0,ZF=1

答案:A

【503】PC 机采用向量中断方式处理 8 级外中断,中断号依次为 08H~0FH,在内存

0000:002CH单元开始依次存放 23H、FFH、00H 和 F0H 四个字节,该向量对应的中断号和中断

程序入口是( )。

A.OCH,23FF:00F0H B.0BH,F000:FF23H

C.0BH,00F0:23FFH D.0CH,F000:FF23H

分析:中断向量的地址=中断类型号×4,每个中断向量在中断向量表中占 4 个字节,

低 16 位存放的是中断程序的偏移地址,高 16 位存放的是中断程序的段地址。其示意图如下:

0002CH 23H 中断程序的 IP 的低 8 位

0002DH FFH 中断程序的 IP 的高 8 位

0002EH 00H 中断程序的 CS 的低 8 位

0002FH F0H 中断程序的 CS 的高 8 位

答案:B

【504】设(AL)=0A8H,(CL)=3,CF=1,执行 RCL AL,CL指令后,(AL)=( )。

A.45H B.46H C.47H D.OC5H

Page 125: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·121·

答案:B

【505】下列叙述正确的是( )。

A.在运算过程中,只有补码数相加才会影响 OF标志位

B.在运算过程中,无符号数的运算不会产生溢出

C.在程序执行过程中,条件转移指令的执行一定会影响到标志位

D.在程序执行过程中,执行 DAA、DAS 指令会影响到标志位

答案:D

【506】8086 CPU 在基址加变址的寻址方式中,基址寄存器可以为( (1) ),变址寄

存器可以为( (2) )。如已知 BX=2000H,SI=1234H,则指令 MOV AX,[BX+SI+2]的源

操作数在( (3) )中。

(1) A.AX 或 CX B.BX 或 BP C.SI 或 BX D.DX 或 DI

(2) A.BC 或 CX B.CX 或 SI C.DX 或 SI D.SI 或 DI

(3) A.数据段中偏移量为 3236H 的字 B.数据段中偏移量为 3234H 的字

C.附加段中偏移量为 3236H 的字 D.附加段中偏移量为 3234H 的字

答案:(1)B;(2)D;(3)A

【507】在下列指令中,( )指令的执行会影响条件码中的 CF 位。

A.JMP NEXT B.JC NEXT C.INC BX D.SHL AX,1

答案:D

【508】堆栈的工作方式是( )。

A.先进后出 B.后进后出 C.先进先出 D.后进先出

答案:A、 D

【509】程序设计中最简单的结构形式是( )程序。

A.顺序 B.分支 C.循环 D.子程序

答案:A

【510】在多分支程序设计中,转移表一般放在( )中。

A.数据段 B.代码段 C.附加段 D.堆栈段

答案:B

【511】在编写程序时,转移指令的操作数均使用( )偏移量,它可以转向段内任

何偏移位置。

A.逻辑 B.相对 C.绝对 D.真值数

答案:B

Page 126: IBM-PC 汇编语言程序设计试题解

·122· IBM-PC 汇编语言程序设计试题解

【512】对两个无符号数 A、B 进行比较时,采用 JBE/JNA 指令是当( )时则转移。

A.CF=0或 ZF=1 B.CF=0或 SF=1

C.CF=1或 ZF=1 D.ZF=0或 SF=0

答案:C

【513】下列叙述正确的是( )。

A.对两个无符号数进行比较时采用 CMP指令,对两个有符号数进行比较时采用 CMPS

指令

B.对两个无符号数进行比较时采用 CMPS 指令,对两个有符号数进行比较时采用

CMP 指令

C.对无符号数条件转移时采用 JGE/JNL 指令,对有符号数条件转移时采用 JAE/JNB

指令

D.对无符号数条件转移时采用 JAE/JNB 指令,对有符号数条件转移时采用 JGE/JNL

指令

答案:D

【514】交换寄存器 SI、DI 的内容,正确的程序段是( )。

A.PUSH SI B.PUSH SI C.MOV AX,SI D.MOV AX,SI

PUSH DI PUSH DI MOV SI,DI MOV BX,DI

POP SI POP DI MOV DI,AX XCHG BX,AX

POP DI POP SI

答案: A、C

【515】在下列指令的表示中,正确的是( )。

A.SUB [BX],[DI] B.MOV AX,NUM[BX+BP]

C.INC [BX+SI] D.JMP DWORD PTR OK[SI]

答案:D

【516】执行相对寻址的跳转分支指令时,如果操作码放在地址 0135H处,相对偏移量是

9CH,那么转移后在( )处取下一条指令的操作码。

A.0099H B.01D1H C.0003H D.00D1H

答案:C

【517】在 ADD 指令中,两个操作数的物理位置可以安排在( )中。

A.两个主存储单元 B.一个主存储单元和一个数据寄存器

C.两个数据寄存器 D.一个堆栈单元和一个数据寄存器

答案:B、C、D

【518】将寄存器 AX 的内容求反的正确操作是( )。

Page 127: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·123·

A.NEG AX B.XOR AX,0FFFFH C.NOT AX D.CMP AX,AX

答案:B、C

【519】将累加器 AX 的内容清零的正确指令是( )。

A.AND AX,0 B.XOR AX,AX C.SUB AX,AX D.CMP AX,AX

分析:SUB 与 CMP 相比,都进行减法操作,其结果影响标志位;但 SUB 的结果要影响目

的操作数,而 CMP 的结果不传送给任何一个操作数。

答案:A、B、C

【520】设 AL=0B4H,BL=11H,指令“MUL BL”和指令“IMUL BL”分别执行后 OF,CF

的值为( )。

A.OF=1,CF=0 B.OF=1,CF=1

C.OF=0,CF=0 D.OF=0,CF=1

答案:B

【521】在串操作指令前使用重复前缀指令 REPE,终止串的重复操作条件是( )。

A.CX=0且 ZF=0 B.CX=0且 ZF=1

C.CX=0或 ZF=0 D.CX=0或 ZF=1

答案:C

【522】下面指令中,合理而有意义的指令是( )。

A.REP LODSB B.REP SCASB C.REP CMPSB D.REP MOVSB

答案:D

【523】当一个带符号数大于 0FBH 时程序转移,需选用的条件转移指令是( )。

A.JLE B.JNL C.JNLE D.JL

答案:C

【524】在程序状态字寄存器中,当方向标志 DF 位为 0 时,每次串操作后使变址寄存器

SI和 DI( )。

A.减量 B.增量 C.保持不变 D.地址减 1

答案:B

【525】在循环右移指令操作中,操作数的最高位是( )。

A.随机 B.0 C.1 D.最低位数

答案:D

【526】操作数直接存放在指令中,则它的寻址方式是( )。

A.直接寻址 B.寄存器寻址 C.寄存器间接寻址 D.立即寻址

Page 128: IBM-PC 汇编语言程序设计试题解

·124· IBM-PC 汇编语言程序设计试题解

答案:D

【527】在下列指令中,属于减法指令的是( )。

A.移位指令 B.求补指令 C.换码指令 D.测试指令

答案:B

【528】在程序状态字寄存器中,当方向标志 DF 位为 1 时,MOVS 每次操作后使变址寄存

器 SI 和 DI( )。

A.不变 B.减量 C.增量 D.地址加 1

答案:B

【529】在带进位循环右移指令的操作中,它的最高位是( )。

A.0 B.1 C.最低位数 D.进位数

答案:D

【530】寄存器间接寻址中,操作数放在( )。

A.通用寄存器 B.主存单元 C.堆栈 D.程序计数器

答案:B

【531】下述对 PSW 寄存器中标志位产生影响的指令是( )。

A.LOOP DON B.NOT AX C.NEG AX D.XLAT BUF

答案:C

【532】累加器 AL 中的内容为 74H,执行 CMP AL,47H 指令后,累加器 AL 中的内容为

( )。

A.2DH B.0D3H C.74H D.00H

答案:C

【533】可用作寄存器间接寻址或基址、变址寻址的地址寄存器,正确的是( )。

A.AX,BX,CX,DX B.DS,ES,CS,SS

C.SP,BP,IP,BX D.SI,DI,BP,BX

答案:D

【534】用一条指令仅实现将 BX+SI=>AX 的方法是( )。

A.XCHG AX,[BX][SI] B.MOV AX,[BX+SI]

C.LEA AX,BX[SI] D.LEA AX,[BX][SI]

答案:D

【535】设 SP初值为 2000H,执行指令“PUSH AX”后,SP 的值是( )。

Page 129: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·125·

A.1FFFH B.1998H C.2002H D.1FFEH

答案:D

【536】条件转移指令 JB产生程序转移的条件是( )。

A.CF=1 B.CF=0 C.CF=1和 ZF=1 D.CF=1和 ZF=0

答案:D

【537】选用串操作指令时,错误的操作是( )。

A.置方向标志位

B.根据串操作指令设置重复次数并送入 CX

C.设置源操作数及目的操作数指针

D.源操作数和目的操作数都可以加段超越

答案:D

【538】设 AL=20H,SI=0500H,DS=3000H,(30500H)=0C0H,CF=1。执行 SBB AL,[SI]

后,正确的结果是( )。

A.AL=5FH,SF=1,CF=1 B.AL=60H,SF=1,CF=0

C.AL=5FH,SF=0,CF=1 D.AL=60H,SF=0,CF=0

答案:A

【539】CBW 指令的功能是( )。

A.把源操作数的符号位扩展到目的操作数中

B.把 AL 中的符号位扩展到 AH 中

C.把 AH 中的符号位扩展到 AL 中

D.把 AX 中的符号位扩展到 DX 中

答案:B

2.4 伪 指 令

【540】表示源程序结束的伪操作的格式为( )。

A.ENDS [Label] B.END [Label] C.ENDS D.END

答案:B

【541】下面表示段定义结束的命令是( )。

A.ENDP B.ENDS C.ENDM D.END

分析:根据结束伪指令的定义,我们知道 A 是过程定义结束伪指令,C 是宏定义结束伪

指令,D 是程序结束伪指令。

答案:B

【542】下面表示结构定义结束的命令是( )。

Page 130: IBM-PC 汇编语言程序设计试题解

·126· IBM-PC 汇编语言程序设计试题解

A.ENDP B.ENDS C.ENDM D.END

分析:根据结束伪指令的定义,我们知道 A 是过程定义结束伪指令,C 是宏定义结束伪

指令,D 是程序结束伪指令。

答案:B

【543】简单的汇编语言程序可以通过( )来建立、修改和执行。

A.连接程序 B.调试程序 C.汇编程序 D.编辑程序

答案:B

【544】一般地,我们将计算机指令的集合称为( )。

A.机器语言 B.汇编语言 C.模拟语言 D.仿真语言

答案:A

【545】( )是 MASM规定的汇编说明符,它在源程序汇编时进行说明。

A.机器指令 B.伪指令 C.宏指令 D.语句

答案:B

【546】在汇编语言程序设计中,伪指令 OFFSET表达的含义是回送变量或标号的( )。

A.段地址值 B.偏移地址值 C.物理地址值 D.操作数

答案:B

【547】汇编程序中语句 DAT1 DB 02H的含义是( )。

A.用 DAT1表示 02H

B.定义 DAT1 为变量,其初值为 02H

C.从标号 DAT1 对应的地址起 02H 个单元被分配

D.定义 DAT1 为变量,其地址为 0002H

答案:B

【548】若定义 DAT DW 'AB',则 DAT 和 DAT+1 两个相邻的内存单元中存放的数据是

( )。

A.42H 41H B.41H 42H C.62H 61H D.61H 62H

答案:A

【549】若定义 DAT DW 'A',则(DAT)和(DAT+1)两个相邻的内存中存放的数据

是( )。

A.00H 41H B.41H 00H C.XXH 41H D.41H XXH

分析:选项 C、D,中的 XX 表示任意数据

答案:B

【550】连接 2 个汇编语言目标程序时,若其数据段的段名相同,组合类型为 PUBlIC,定

Page 131: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·127·

位类型为 PAPA,连接后第一个目标程序数据段的起始物理地址是 00000H,长度为 1376H,试

问第二个目标程序数据段的起始物理地址是( )。

A.01377H B.01378H C.01380H D.01400H

答案:C

【551】表示一条指令的存储单元的符号地址称( )。

A.标号 B.变量 C.偏移量 D.类型

分析:构成指令语句和指示性语句的第一部分分别是标号和变量。也就是说表示一条指

令的存储单元的符号地址是标号,后面还规定用冒号间隔;而表示定义数据的存储单元地址

则称变量,后面用空格间隔。

答案:A

【552】变量的类型属性如下,下面错误的类型是( )。

A.字节型 B.字型 C.字符型 D.双字型

分析:我们知道,变量的类型属性有字节型(BYTE)、字型(WORD)、双字型(DD)、四

字型(DQ)和五字型(DT),而标号的类型属性则分为 NEAR 型和 FAR 型。因此该题正确的答

案为 C。

答案:C

【553】在汇编语言程序设计中,若调用不在本模块中的过程,则对该过程必须用伪操作

命令( )说明。

A.PUBLIC B.COMMON C.EXTERN D.ASSUME

分析:伪操作命令 PUBLIC 指明本模块定义的可被其他模块引用的名字,而伪操作命令

EXTERN 指明本模块引用的其他模块定义的名字。伪操作命令 ASSUME 指明汇编时段寄存器的

指派。COMMON 是伪操作命令 SEGMENT中用来指明组合类型的。

答案:C

【554】装入程序的作用是将程序( )。

A.从内存传送到外存 B.从外存传送到处理器

C.从外存传送到内存 D.从内存传送到处理器

答案:C

【555】一个汇编语言程序要经过建立、汇编、连接和调试过程之后才能直接执行,那么

经过( )程序后可以形成可执行文件(.EXE 文件)。

A.编辑 B.汇编 C.连接 D.调试

答案:C

【556】现用数据定义伪指令定义数据:BUF DB 4 DUP(0,2 DUP(1,0)),

问定义后,存储单元中有数据 0100H 的字单元个数是( )。

Page 132: IBM-PC 汇编语言程序设计试题解

·128· IBM-PC 汇编语言程序设计试题解

A.4 B.3 C.8 D.12

分析:首先应掌握如何将数据定义伪指令定义的数据画成存储单元的存储示意图,然后

再根据存储单元中的数据进一步分析。现画出存储示意图如下:

BUF ① 00 ⑤ 00

01 01

BUF ② 00 ⑥ 00

01 01

00 00

BUF ③ 00 ⑦ 00

01 01

BUF ④ 00 00

01 ⑧ 00

00 01

0

根据存储示意图分析,可见变量 BUF开始的存储单元中有数据 0100H 的字单元个数是 8。

答案:C

【557】设有数据定义如下:WORD_VAR DW 1,2,3,4

请问指令:ADD AL,TYPE WORD_VAR 相当于完成下面等同功能的指令是( )。

A.ADD AL,1 B.ADD AL,2 C.ADD AL,3 D.ADD AL,4

答案:B

【558】设有数据定义如下:DATABUF DW 100 DUP(?)

请问指令:MOV CX,LENGTH DATABUF 相当于完成下面等同功能的指令是( )。

A.MOV CX,00C8H B.MOV CX,200H

C.MOV CX,0064H D.MOV CX,100H

分析:数值回送操作符 LENGTH,对于变量中使用 DUP 的情况,将回送分配给所定义变量

DATABUF 的单元数。DATABUF 变量定义了 100 个字数据的存储空间,即单元数为 100,相当于

十六进制数 0064H,所以正确答案选 C。

答案:C

【559】在用汇编语言开发软件过程中,首先用编辑程序建立扩展名为( (1) )的源

文件,经汇编生成扩展名为( (2) )的目标程序文件,最后用连接程序连接生成扩展名为

( (3) )的可执行文件。

A.TXT B.DOS C.ASM D.EXE

E.COM F.OBJ G.PRG H.BAK

答案:(1)C;(2)F;(3)D

【560】伪指令是( )规定的汇编说明符,它在源程序汇编时进行说明。

A.DEBUG B.LINK C.MASM D.EDIT

Page 133: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·129·

答案:C

【561】在数据定义语句中,下列描述不正确的是( )。

A.存放存储单元的地址可以用字节表示

B.存放存储单元的地址可以用字表示

C.存放存储单元的地址可以用双字表示

D.存放存储单元的地址可以用 4 个字表示

答案:A

【562】进行分支跳转时应考虑的第一个要素是( )。

A.测试 B.定向 C.标号 D.产生条件

答案:D

【563】下列描述中正确的是( )。

A.在汇编语言编程中,必须有数据段和代码段

B.在汇编语言编程中,数据可以安排在代码段中

C.在汇编语言编程中,必须分别完整地定义数据段、堆栈段、附加段和代码段

D.在汇编语言编程中,必须采用过程的形式编写

答案:B

【564】在一段汇编程序中多次调用另一段程序,用宏指令比用子程序实现( )。

A.占内存空间小,但速度慢 B.占内存空间大,但速度快

C.占内存空间相同,速度快 D.占内存空间相同,速度慢

答案:B

【565】在汇编语言程序中,对 END语句的叙述正确的是( )。

A.END 语句是一可执行语句 B.END 语句表示程序执行到此结束

C.END 语句表示源程序到此结束 D.END 语句在汇编后要产生机器码

答案:C

【566】下面的数据传送指令中,错误的操作是( )。

A.MOV SS:[BX+DI],1000H B.MOV DX,1000H

C.MOV WORD PTR[BX],1000H D.MOV DS,2000H

答案:D

【567】把若干个模块连接起来成为可执行文件的系统程序称为( )。

A.连接程序 B.汇编程序 C.编译程序 D.目标程序

答案:A

【568】用户为了解决自己的问题,用汇编语言所编写的程序,称为( )。

Page 134: IBM-PC 汇编语言程序设计试题解

·130· IBM-PC 汇编语言程序设计试题解

A.目标程序 B.源程序 C.可执行程序 D.汇编程序

答案:B

【569】汇编语言源程序中,每个语句可由 4 项组成,其中名字项是一个符号,下面列出

的有效名字是( )。

A.Variable B.First & ld C.0FFFFH

D.'Memphis'

答案:A

【570】在汇编语言程序设计中,子程序是以( )形式表示的。

A.循环 B.分支 C.顺序 D.过程

答案:D

【571】在进行二重循环程序设计时,下列描述正确的是( )。

A.外循环初值应置外循环之外;内循环初值应置内循环之外,外循环之内

B.外循环初值应置外循环之户;内循环初值应置内循环之内

C.内、外循环初值都应置外循环之外

D.内、外循环初值都应置外循环之内,内循环之外

答案:A

【572】 ORG 0030H

DA1 DB 0,'0',30H

DW DA1

数据为 3000H 字存储单元的偏移地址是( )。

A.0030H B.0031H C.0032H D.0033H

答案:A

【573】 NUM1 DB (12 OR 6 AND 2) GE 0EH

NUM2 DB (12 XOR 6 AND 2) LE 0EH

上述数据定义语句中,NUM1 和 NUM2字节单元的内容分别是( )。

A.NUM1=0,NUM2=0 B.NUM1=0,NUM2=0FFH

C.NUM1=0FFH,NUM2=0 D.NUM1=0FFH,NUM2=0FFH

答案:B

【574】要求将 A,B两个字符的 ASCII码 41H,42H顺序存放在连续两个字存储单元中,可

选用的语句是( )。

A.DA1 DB 'AB' B.DA1 DW 'AB'

C.DA1 DB 0ABH D.DA1 DW 0ABH

答案:A

Page 135: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·131·

【575】下面语句中有语法错误的语句是( )。

A.DB 45H B.DW 0ABCDH C.DW 'ABCD' D.DD 'AB'

答案:C

【576】以 BUF 为起始地址的字节单元中建立一个输入缓冲区,在 DOS 功能子程序的调用

中,执行 0AH 号功能后,用户从键盘输入的字符是从( )个字节开始存放(注:从 1

开始计数)。

A.第一 B.第二 C.第三 D.第四

答案:C

【577】在汇编语言程序中,如果不采用调用 DOS 中断的方式结束用户程序,而是采用 RET

指令返回操作系统,那么在代码段中初始时的指令语句应该描述为( )。

A.PUSH DS B.MOV AX,CODE

XOR AX,AX MOV DS,AX

PUSH AX

C.MOV AX,DATA D.MOV AX,CODE

MOV DS,AX

答案:A

2.5 程 序 分 析

【578】8086 CPU 在执行指令:

MOV AL,0E3H

ADD AL,0AAH

后,状态标志 CF、OF、SF 为( )。

A.1、0、1 B.0、1、1 C.1、1、1 D.0、0、1

答案:A

【579】假设 ES 段中有一个字符串'12FG3LM5C',其名为 ARRAY,下面的程序段

CLD

LEA DI,ES:ARRAY

MOV AL,'G'

MOV CX,9

REPNE SCASB

执行后 CX 的值是( )。

A.9 B.5 C.4 D.0

答案:B

【580】执行下列三条指令后、AX 寄存器中的内容是( )。

MOV AX,'8'

Page 136: IBM-PC 汇编语言程序设计试题解

·132· IBM-PC 汇编语言程序设计试题解

ADD AL,'9'

AAA

A.0017H B.0077H C.0107H D.0071H

答案:C

【581】执行下列指令后,(AX)=( )。

STR1 DW 'AB'

MOV AX,STR1

A.00ABH B.00BAH C.4142H D.4241H

答案:C

【582】执行下面的程序段后,AX 寄存器中的内容是( )。

ARRAY DW 10 DUP(2)

XOR AX,AX

MOV CX,0AH

MOV SI,12H

NEXT: ADD AX,ARRAY[SI]

SUB SI,2H

LOOP NEXT

A.20 B.30 C.32 D.40

答案:A

【583】执行下面的程序段后,(AX)=( )。

TAB DW 1,2,3,4,5,6

ENTRY EQU 3

MOV BX,OFFSET TAB

ADD BX,ENTRY

MOV AX,[BX]

A.0003H B.0300H C.0400H D.0004H

答案:B

【584】执行下列指令后,SP 寄存器的值是( )。

MOV SP,1000H

PUSH AX

A.0FFEH B.0FFFH C.1001H D.1002H

分析:要正确解答该题,应首先掌握堆栈操作的步骤,这里压栈操作的步骤是:

① SS:((SP))←(AH) ② (SP)←(SP)-2

即每次操作完成对 1 个字(2 个字节)的压栈,并保持堆栈指针指向栈顶数据。因此

(SP)=1000H-2=0FFEH。

Page 137: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·133·

答案:A

【585】下面是一个单字节元符号二进制整数转换为 BCD 码的子程序。子程序入口条件是:

SI 指向二进制数所在单元,转换结果以压缩 BCD 码形式存放在 SI+l 和 SI+2 两个单元中。请

选择正确答案。

XOR AL,AL

MOV [SI+1],AL

MOV [SI+2],AL

MOV CX,( (1) )

L2: MOV BL,[SI]

( (2) ) BL,1

MOV [SI],BL

MOV DL,2

L1: INC SI

MOV AL,[SI]

( (3) ) AL,AL

DAA

MOV [SI],AL

DEC DL

( (4) ) L1

SUB SI,2

LOOP L2

HLT

(1)A.2 B.4 C.8 D.16

(2)A.SHR B.SHL C.SAR D.ROL

(3)A.ADD B.ADC C.SUB D.SBB

(4)A.JZ B.JNZ C.JC D.JNC

分析:程序的算法是:将[SI]左移 1 位,最高位存入 CF 标记,然后做[SI+1]=[SI]*2+CF

的运算,并做十进制调整。上述过程做 8次后,[SI+1][SI+2]中的内容即为[SI]中内容的十进制

形式。

答案:(1)C;(2)B;(3)B;(4)B

【586】在寄存器相对寻址方式 MOV AX,[SI+DAT]中,偏移量 DAT 应是一个( )。

A.原码 B.补码 C.反码 D.移码

答案:B

【587】执行下列程序(AL)=( )H。

DATA SEGMENT

TAB_DA DB '0123456789'

Page 138: IBM-PC 汇编语言程序设计试题解

·134· IBM-PC 汇编语言程序设计试题解

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET TAB_DA

MOV AL,04

XLAT TAB_DA

A.04 B.0400 C.33 D.34

分析:本题是要求了解 XLAT指令的使用。我们知道本指令是把 BX所指的内存单元 TAB_DA

的地址值加上 AL 的内容作为存储单元的地址,从中取数到 AL 中。程序中原 AL 置为 4,就是

从 TAB_DA+4 的内存单元取数,此单元内容是数字 4 的 ASCII 码。

答案:D

【588】“先判断后工作”的循环程序结构中,循环体执行的次数最少是( )次。

A.1 B.0 C.2 D.不定

分析:在“先判断后工作”的循环程序结构中,如果不满足循环的条件,则不执行循环

体程序。所以,有可能循环体执行的次数为 0。

答案:B

【589】“先工作后判断”的循环程序结构中,循环体执行的次数最少是( )次。

A.1 B.0 C.2 D.不定

分析:在“先工作后判断”的循环程序结构中,首先执行循环体程序一次。如果满足循

环的条件则继续执行循环体;如果不满足循环条件,则退出循环体。因此,循环体执行的次

数最少是 1次。

答案:A

【590】设有一程序段定义如下:

ORG 0024H

AR1 DW 4,5,$+4

M0V AX,AR1+4

执行后 AX 中的正确内容是( )。

A.0028H B.0032H C.002AH D.002CH

分析:解答该题时,首先要了解“$”表示当前地址偏移量。在定义变量 AR1 后,即表

示在存储单元从 0024H 偏移地址开始存放了 3 个字数据,分别为 0004H,0005H 和 002CH,

(0028H+4),为了清楚起见,我们用下图表示: 0024H 04

0025H 00

0026H 05

0027H 00

Page 139: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·135·

0028H 2C

00

经过分析,可以正确地得出 AR1+4单元(即 0028H 单元)的内容 002CH传送到累加器 AX

中。

答案:D

【591】下列子程序统计以“$”为结束符的字符串的长度,请将程序填写完整。

STR_LEN PROC

PUSH AX

PUSH DI

MOV CX,0

REPEAT: MOV AL,[DI]

( (1) )

JE EXIT

( (2) )

INC DI

( (3) )

EXIT: POP DI

POP AX

RET

STR_LEN ENDP

(1)A.SUB CX,'$' B.CMP AL,'$' C.CMP CX,'$' D.SUB AX,'$'

(2)A.ADD AL,1 B.INC AX C.ADD CL,1 D.INC CX

(3)A.JNE REPEAT B.JE REPEAT C.JMP REPEAT D.JS REPEAT

答案:(1)B;(2)D;(3)C

【592】执行下列指令后:

MOV AX,1234H

MOV CL,4

ROL AX,CL

DEC AX

MOV CX,4

MUL CX

HLT

寄存器 AH 的值是( (1) ),寄存器 AL 的值是( (2) )。

(1)A.92H B.8CH C.8DH D.00H

(2)A.60H B.00H C.04H D.A0F

分析:指令执行的情况如下:

MOV AX,1234H ;(AX) =1234H

Page 140: IBM-PC 汇编语言程序设计试题解

·136· IBM-PC 汇编语言程序设计试题解

MOV CL,4 ;(CL) =4

ROL AX,CL ;(AX) =2341H

DEC AX ;(AX) =2340H

MOV CX,4 ;(CX) =4

MUL CX ;(DX) =0000H,(AX) =8D00H

HLT

所以,程序执行完后,(AX)=8D00H,(DX)=0000H。

答案:(1)C;(2)B

【593】执行下列指令后:

STR1 DW 'AB'

STR2 DB 16 DUP(?)

CNT EQU $− STR1

MOV CX,CNT

MOV AX,STR1

HLT

寄存器 CL 的值是( (1) ),寄存器 AX 的值是( (2) )。

(1)A.10H B.12H C.0EH D.0FH

(2)A.00ABH B.00BAH C.4142H D.4241H

分析:CNT 为定义的数据变量总的长度(字节),共 18 个单元,故选 B。STR1 的示意图

如下:

42H 'B'

41H 'A'

所以,程序执行后,(AX)=4142H。

答案:(1)B;(2)C

【594】分析下面指令序列执行后的正确结果是( )。

MOV BX,0FFFCH

MOV CL,2

SAR BX,CL

A.3FFFH B.0FFFFH C.0FFFCH D.0FFF5H

分析:利用逻辑右移指令 SHR 和算术右移指令 SAR 均能完成除以 2 的运算。而算术右移

指令 SAR 经一次右移后最高位保持不变,其余各位依次向低位移动一位。因此常用 SAR 指令

完成除以 2n的运算。该题 BX 寄存器的初始值为 0FFFCH,相当于有符号数-4,经两次算术右

移后,即完成(-4)/22=-1(0FFFFH)运算。因此正确结果应选择 B。

答案:B

【595】设有一程序定义如下:

0RG 0040H

Page 141: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·137·

DATA1 DB 4,5,6,7

DW $+4

...

MOV AX,WORD PTR DATA1+3

执行以上指令后,AX 中的内容正确的是( )。

A.0507H B.0007H C.0043H D.4807H

分析:解答该题时,首先要了解 '$' 表示当前地址偏移量。在定义变量 DATA1后,即

表示在存储单元从 0040H 偏移地址开始存放了 4个字节数据,分别为 04H、05H、06H、07H,

然后存放字数据 0048H(0044H+4),为了清楚起见,我们用图示如下:

0040H 04

0041H 05

0042H 06

0043H 07

0044H 48

00

经过分析,可以得知,DATA1+3单元(即 0043H单元)的内容 4807H传送到累加器 AX中。

答案:D

【596】下面指令序列执行后完成的运算,正确的算术表达式应是( )。

MOV AL,BYTE PTR X

SHL AL,1

DEC AL

MOV BYTE PTR Y,AL

A.y=2x+1 B.x=2y+1 C.y=2x-1 D.x=2y-1

分析:程序设计中常用 SHL(SAL)指令完成乘以 2 的运算。需注意在 8086/8088 汇编语

言中,逻辑左移指令 SHL 和算术左移指令 SAL 在形式和功能上完全相同,故可任意选用。显

然在上面的指令序列中,变量 x 为源操作数,而变量 y 是目的操作数,因此正确的选择应是

C。

答案:C

【597】TESTVAR,55H

JZ ZERO

...

ZERO: ...

上述程序段中,当变量 VAR 的内容为何值时,执行 JZ ZERO条件转移指令后,可满足条

件转至 ZERO处( )。

A.(VAR)=0 B.(VAR)=55H

C.VAR 中第 0,2,4,6 位为 0 D.VAR 中第 1,3,5,7 位为 0

分析:位测试指令 TEST 和比较指令 CMP 一样,经常用在条件转移指令前面,作为条件

Page 142: IBM-PC 汇编语言程序设计试题解

·138· IBM-PC 汇编语言程序设计试题解

标志的产生。位测试指令中的目的操作数是测试对象,可以是寄存器或者存储单元;源操作

数为逻辑测试值,通常取逻辑常量。也即对哪一位测试时,该位应取 1,否则取 0。该题中逻

辑常量为 55H,相当于二进制数 01010101B.可以看出表示要对 VAR 的第 0,2,4,6 位测试。

两操作数经过逻辑乘运算后,满足条件 ZF=1时,当然应该是变量 VAR 内容的第 0,2,4,6

位为 0,即 C选项是正确的。

答案: C

【598】当字存储单元 BUFFER 的内容为-1 时,转 JUMP0,下面错误的指令是( )。

A.MOV AX, BUFFER B.MOV BX, OFFSET BUFFER

XOR AX, 0FFFFH CMP [BX], 0FFFFH

JZ JUMP0 JZ JUMP0

C.LEA SI, BUFFER D.MOV AX,BUFFER

ADD [SI], 0001H AND AX, 0FFFFH

JZ JUMP0 JZ JUMP0

分析:对字存储单元 BUFFER 的内容是否为-1 的判断,可以通过多种不同的方法。该题

选项 A 中,通过将 BUFFER单元的内容与常数-1(0FFFFH)进行异或运算,根据异或运算“相

同位为 0,相异位为 1”的结果,可知选项 A 是正确的;选项 B 采用比较运算的方法也是可行

的;选项 C 采用若 BUFFER单元的内容为-1,那么再进行加 1运算后的结果应为 0 方法判断,

也是正确的;选项 D 采用逻辑乘运算,肯定无法对 BUFFER单元的内容是否为-1 作出判断,

显然错误的指令是选项 D。

答案:D

【599】下面是一个将字符串送 CRT显示的过程。在调用名为 CRT(外部定义)的过程时,

字符放在 AL 中。字符串以一个 null(0)结束。进入本过程时 DS:SI=字符串首地址。仔细

阅读下面程序,并填空使之完善。

ASSUME CS:CODE

CODE SEGMENT PUBLIC

( (1) ) CRT:NEAR

PRINT PROC NEAR

MOV AL,[SI] ;把待显示的字符送入 AL

CALL CRT ;显示字符

CMP ( (2) )[SI+1],0 ;检查下一个字符是否为 0

JE DONE

INC SI

JMP PRINT

DONE: RET

PRINT ( (3) )

CODE ENDS

(1)A.ASSUME B.PUBLIC C.EXTERN D.ENTRY

Page 143: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·139·

(2)A.BYTE PTR B.WORD PTR C.FAR PTR D.NEAR PTR

(3)A.ENDS B.END C.ENDP D.RET

分析:本题是要求掌握过程的格式和内、外部过程调用时的联系以及内存数据类型的使

用。对于外部过程的调用和其他外部符号的使用,应在调用或使用前用伪指令 EXTERN给予说

明。而在外部过程和外部符号定义的程序段用 PUBLIC 加以说明。若一般指令中操作数都是存

储单元,则应指出其操作数的类型。BYTE PTR,WORD PTR 等用于说明内存参数的长短,FAR

PTR 和 NEAR PTR 用于说明过程是远程调用还是近程调用。从程序看(2)处应是对字节操作,

所以此处应填入 BYTE PTR。作为一个过程的结束,应该用伪指令 ENDP 来表示。

答案:(1)C;(2)A;(3)C

【600】下面解答中,完成符号数 AX>BX 时转 GREAT,当 AX≤BX 时转 LESS 的正确操作是

( )。

A.CMP AX,BX B.CMP AX,BX C.CMP AX,BX D.CMP AX,BX

JA GREAT JBE LESS JC LESS JG GREAT

LESS: ... GREAT: ... GREAT: ... LESS: ...

... ... ... ...

GREAT: ... LESS: ... LESS: ... GREAT:...

分析:掌握好条件转移指令的应用,是进行分支程序设计的基础。条件转移指令中尤其

要分清对有符号数和无符号数比较结果实现转移的指令的区别。显然选项 D 是正确的。

答案:D

【601】对于下列程序段:

AGAIN: MOV AL,[SI]

MOV ES:[DI],AL

INC SI

INC DI

LOOP AGAIN

也可用指令( )完成同样的功能。

A.REP MOVSB B.REP LODSB C.REP STOSB D.REPE SCASB

答案:A

【602】阅读下列程序,设:DATA=4000H,KIOK=4050H,STE=6000H,CODE=8000H。

选择正确答案填空(程序中的行号是本文为说明方便加进的)。

行号 标号 程序

1 DATA SEGMENT

2 BASE DB 100,10,1

3 DATA ENDS

4 SSEG SEGMENT STACK

Page 144: IBM-PC 汇编语言程序设计试题解

·140· IBM-PC 汇编语言程序设计试题解

5 DB 100 DUP(?)

6 SSEG ENDS

7 CODE SEGMENT

8 ASSUME CS:CODE,DS:DATA,SS:SSEG

9 ORG 200H

10 BEGIN: MOV AX,DATA

11 MOV DS,AX

12 MOV AL,0F3H

13 LEA BX,BASE

14 MOV CX,3

15 @100: MOV DL,30H ;置数字 0的 ASCII 码

16 @150: SUB AL,[BX]

17 JB @200

18 INC DL

19 JMP @150

20 @200: ADD AL,[BX]

21 PUSH AX

22 MOV AH,2

23 INT 21H ;调用 DOS显示功能

24 POP AX

25 INC BX

26 LOOP @100

27 MOV AH,4CH

28 INT 21H ;返回 DOS

29 CODE ENDS

30 END BEGIN

第一次执行指令 SUB AL,[BX]的源操作数,其存储器实际地址(物理地址)是( (1) )H。

在该程序已给定的参数下,执行指令 INC DL,其中 DL 中出现过的最大值是( (2) )H。

由指令 LOOP @100 引起的循环,有( (3) )次。程序执行的最后结果,在屏幕上显示

( (4) )。程序执行结束时,寄存器 AL 中的最后结果是( (5) )H。CPU 直接执行该

程序应从地址( (6) )H 开始。

(1)A.8050H B.44050H C.4000H D.4050H

(2)A.34H B.4 C.3 D.35H

(3)A.2 B.3 C.4 D.5

(4)A.2 B.3 C.43 D.243

(5)A.243 B.43 C.00 D.30

(6)A.80200 B.8200 C.8000 D.2000H

分析:(1)程序在第 13行把 BASE 的有效地址存入 BX 后到第一次执行 SUB AL,[BX]指令

时 BX 内容没变。根据物理地址=SEG.DATA*10H+OFFSET BASE=44050H,可知(1)的正确答

Page 145: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·141·

案是 B。

(2)第 15 行到第 20 行是:(AL)=(AL)-[BX]直到不够减为止,每减一次 DL的内容+1,

第 1 次循环[BX]=100,故可得到(AL)的百位数。由于(DL)是从 30H 开始计数的,所以可

以直接得到 ASCII 码。同理,第 2 次循环可以得到(AL)的十位数,第 3 次循环可以得到(AL)

的个位数。题目中,(AL)=0F3H 转换成十进制数是 243,所以计算在十位数 4 时,即第二个

循环结果 DL中为 4 的 ASCII码 34H,是程序运行中 DL 出现过的最大值。所以(2)的正确答

案是 A。

(3)LOOP 指令的隐含寻址是 CX,程序第 14 行把 CX 的值置为 3,可引起 3次循环,所以

(3)的正确答案是 B。

(4)根据以上的分析可知:程序执行的最后结果,应在屏幕上显示 243,所以(4)的正

确答案是 D。

(5)程序在第三次循环时,第 17 行指令在 AL 减 1 结果为-1时转移到第 20 行,再加 1

得 0,所以(5)的正确答案是 C。

(6)程序中第 9 行 ORG 200H 指令可知标号 BEGIN的偏移量地址是 200H,其物理地址=代

码段寄存器值(CS)*10H+偏移量地址=80200H。CPU 直接执行该程序应从地址 80200H开始。

答案:(1)B;(2)A;(3)B;(4)D;(5)C;(6)A

【603】下面解答中,判断寄存器 AL中的内容是否为偶校验的正确操作是( )。

A.TEST AL,1 B.TEST AL,1 C.OR AL,AL D.AND AL,AL

JNE YES JE YES JPE YES JPO YES

... ... ... ...

分析:对操作数是否为奇、偶校验的判断,主要依据状态标志寄存器中的 PF 标志位。

若为偶校验时 PF=1,记为 PE;若为奇检验时 PF=0,记为 PO,相应判断为偶校正确转移和

奇校正确转移的条件转移指令即为 JPE和 JPO,因此选项 C是正确的。

答案:C

【604】执行下列程序,选择正确的结果:

MOV SP,2000H

MOV AX,0F0H

MOV SI,1234H

MOV DX,5678H

PUSH SI

POP DI

SHL DX,1

TEST AX,DX

PUSH DX

HLT

(1)SP=( ); A.2000H B.1FFFH C.2001H D.1FFEH

(2)DH 内容所在存储器的偏移地址为( );

Page 146: IBM-PC 汇编语言程序设计试题解

·142· IBM-PC 汇编语言程序设计试题解

A.1FFFFH B.1FFEH C.1FFDH D.1FFCH

(3)DL 内容所在存储器的偏移地址为( );

A.1FFFH B.1FFEH C.2000H D.1FFDH

(4)AX=( );

A.0H B.78H C.0F0H D.56H

(5)DI=( ); A.1234H B.5678H C.2000H D.00F0H

(6)DX=( ); A.5678H B.0ACF0H C.2B3CH D.0ABF0H

(7)标志位 CF=( ); A.0 B.1 C.不定

(8)标志位 ZF=( )。 A.0 B.1 C.不定

分析:指令执行的情况如下:

MOV SP,2000H ;(SP)=2000H

MOV AX,0F0H ;(AX)=00F0H

MOV SI,1234H ;(SI)=1234H

MOV DX,5678H ;(DX)=5678H

PUSH SI ;将 SI 的内容压入堆栈

POP DI ;将堆栈的内容弹出到 DI,则(DI)=1234H

SHL DX,1 ;(DX)=0ACF0H

TEST AX,DX ;其结果只影响标志位,而对 AX、DX不产生影响

PUSH DX ;将 DX 的内容压入堆栈

HLT

指令 TEST AX,DX 执行后,条件码的设置为:CF=OF=0,AF 位无定义,而 SF、ZF、

PF 则根据运算结果设置。

0000 1111 0000 0000(AX)

0000 1100 0000 0000

AND) 1010 1100 1111 0000(DX)

SF=0,ZF=0,PF=1。

堆栈情况如下图所示:

1FFEH 34H/F0H ←SP

1FFFH 12H/ACH

2000H

答案:(1)D;(2)A;(3)B;(4)C;(5)A;(6)B;(7)A;(8)A

【605】下列程序执行后,请选择正确的结果:

10A3H:2000H XOR AL,AL

2002H MOV AX,CS

2004H MOV SS,AX

2006H MOV SP,2F00H

2009H MOV DX,2012H

200CH PUSH DX

Page 147: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·143·

200DH CALL 2700H

2010H ADD CX,DX

2012H HLT

10A3H:2700H POP CX

RET

(1)(AX)=( ); A.10A3H B.2000H C.2012H D.2799H

(2)(SP)=( ); A.2F02H B.2F00H C.2EFEH D.2EFCH

(3)(DX)=( ); A.2700H B.2F00H C.2012H D.2010H

(4)(CX)=( ); A.2700H B.2F00H C.2010H D.4024H

(5) ZF= ( ); A.1 B.0 C.不定 D.-1

分析:程序执行的情况如下:

10A3H: 2000H XOR AL,AL ;(AL)=0,ZF=1。

2002H MOV AX,CS ;(AX)=10A3H。

2004H MOV SS, AX ;(SS)=10A3H。

2006H MOV SP,2F00H ;(SP)=2F00H。

2009H MOV DX,2012H ;(DX)=2012H。

200CH PUSH DX ;将 DX 压入堆栈。

200DH CALL 2700H ;将返回的偏移地址 2010H 压入堆栈。

2010H ADD CX,DX

2012H HLT

10A3H: 2700H POP CX ; (CX)=2010H。

RET ;弹出的返回偏移地址为 2012H,而不是 2010H,所以

;程序不执行 ADD CX,DX,而执行 HLT。

该程序段只有第一条指令影响标志位。其堆栈的操作如下图所示:

2EFBH

2EFCH 10H

2EFDH 20H

2EFEH 12H

2EFFH 20H

10A3:2F00H ←SP

答案:(1)A;(2)B;(3)C;(4)C;(5)A

【606】执行下列指令后:

MOV AX,1234H

MOV CL,4

ROL AX,CL

DEC AX

MOV CX,4

MUL CX

Page 148: IBM-PC 汇编语言程序设计试题解

·144· IBM-PC 汇编语言程序设计试题解

HLT

寄存器 AH 的值是( (1) ),寄存器 AL 的值是( (2) )。

(1)A.92H B.8CH C.80H D.00H

(2)A.60H B.00H C.04H D.AOF

分析:指令执行的情况如下:

MOV AX,1234H ;(AX)=1234H

MOV CL,4 ;(CL)=4

ROL AX,CL ;(AX)=2341H

DEC AX ;(AX)=2340H

MOV CX,4 ;(CX)=4

MUL CX ;(DX)=0000H,(AX)=8D00H

HLT

所以,程序执行完后,(AX)=8D00H, (DX)=0000H。

答案:(1)C;(2)B

【607】下列程序执行后,请选择正确的结果:

MOV AX,1234H

MOV BX,5678H

ADD AL,BL

DAA

MOV CL,AL

MOV AL,AH

ADC AL,BH

DAA

(1)(AL)=( ); A.69 B.78 C.56 D.34

(2)(CL)=( )。 A.12 B.34 C.56 D.78

分析:

MOV AX,1234H ; (AX)=1234H

MOV BX,5678H ; (BX)=5678H

ADD AL,BL ; (AL)=0ACH

DAA ; (AL)=12H

00110100(34H)

+)01111000(78H)

10101100((AL)=0ACH) AL寄存器的低 4 位是 0CH,

+)00000110

10110010 AL 寄存器的高 4 位是 0AH,

故加 06H,并将AF置 1。

+)01100000

CF=1,00010010((AL)=12H)

故加 60H,并将CF置 1。

MOV CL,AL ; (CL)=(AL)=12H

Page 149: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·145·

MOV AL,AH ; (AL)=(AH)=12H

ADC AL,BH ; (AL)=69H

DAA ; (AL)=69H

00010010(12H)

01010110(56H)

01101001 ((AL)=69H) 进行运算后,CF=AF=0,且高、低 4 位

+) 1(CF=1)

都在 0~9 的范围内,故不需要进行十进制

调整。

答案:(1)A;(2)A

【608】分析下面指令序列执行后的正确结果是( )。

MOV BX,0FFFCH

MOV CL,2

SHR BX,CL

A.3FFFH B.0FFFFH C.0FFFCH D.0FFF5H

分析:我们知道利用逻辑右移指令 SHR 和算术右移指令 SAR均能完成除以 2 的运算。而

特别要注意的是算术右移指令 SAR 经一次右移后最高位保持不变,其余各位依次向低位移动

一位。因此常用 SHR 指令完成无符号数除以 2n的运算。该题 BX 寄存器的初始值为 0FFFCH,

相当于无符号数。经两次逻辑右移后,即完成 65532/22=16383(0FFFCH/4=3FFFH)运算。

因此正确结果应选择 A。

答案:A

【609】下面是多字节加法程序,第一个数是 8A0BH,第二个数是 D705H。

DATA SEGMENT

FIRST DB ( (1) ),( (2) ),0H

SECOND DB ( (3) ),( (4) )

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV CX,( (5) )

MOV SI,0

( (6) )

NEXT: MOV AL,SECOND[SI]

ADC FIRST[SI],AL

INC SI

LOOP NEXT

Page 150: IBM-PC 汇编语言程序设计试题解

·146· IBM-PC 汇编语言程序设计试题解

MOV AL,0

ADC AL,( (7) )

MOV FIRST[SI],AL

MOV AH,4CH

INT 21H

CODE ENDS

END START

请选择正确答案填入空格中:

(1)A.8AH B.0BH C.D7H D.05H

(2)A.8AH B.0BH C.D7H D.05H

(3)A.8AH B.0BH C.D7H D.05H

(4)A.8AH B.0BH C.D7H D.05H

(5)A.3 B.2 C.1 D.4

(6)A.CLC B.CLD C.STC D.CLI

(7)A.1 B.-1 C.0 D.0FFH

分析:程序执行的情况如下:

DATA SEGMENT

FIRST DB 08H,8AH,0H ;进行多字节的加法,将低字节放在低地址单元

SECOND DB 05H,D7H ;将高字节放在高地址单元

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV CX,2 ;由于是两个数相加,故循环的次数设置为 2

MOV SI,0 ;采用变址寻址方式

CLC ;多字节的加法要用进位,首先将其清零

NEXT: MOV AL,SECOND[SI] ;取一个加数

ADC FIRST[SI],AL ;两个数相加,采用带进位的加法指令

INC SI ;修改变址指针

LOOP NEXT ;循环

MOV AL,0 ;多字节相加,要考虑其进位情况,这里三

条指令就

ADC AL,0 ;是考虑进位的情况。产生的进位存放在

FIRST+2 的

MOV FIRST[SI],AL ;单元内

MOV AH,4CH

INT 21H

CODE ENDS

Page 151: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·147·

END START

答案:(1)B;(2)A;(3)D;(4)C;(5)B;(6)A;(7)C

【610】将 AL中带符号数乘 10 送 AL,正确的程序段是( )。

A.SAL AL,1 B.ADD AL,AL C.MOV CL,4 D.ADD AL,AL

MOV BL,AL MOV BL,AL MOV BL,AL ADD AL,AL

SAL AL,1 ADD AL,AL SAL AL,CL ADD AL,AL

SAL AL,1 ADD AL,AL ADD AL,BL ADD AL,AL

ADD AL,BL ADD AL,AL ADD AL,AL

分析:

A.SAL AL,1 ;2X(AL)

MOV BL,AL ;(BL)=2X(AL)

SAL AL,1 ;2X2X(AL)=4X(AL)

SAL AL,1 ;2X4X(AL)=8X(AL)

ADD AL,BL ;8X(AL)+2X(AL)=10X(AL)

B.ADD AL,AL ;2X(AL)

MOV BL,AL ;(BL)=2X(AL)

ADD AL,AL ;2X(AL)+2X(AL)=4X(AL)

ADD AL,AL ;4X(AL)+4X(AL)=8X(AL)

ADD AL,BL ;2X(AL)+8X(AL)=10X(AL)

答案:A、B

【611】下面程序段中,当满足条件转到 NEXT标号执行时,AL中的值正确的是( )。

CMP AL,0FBH

JNL NEXT

...

NEXT: ......

A.AL=80H B.AL=8FH C.AL=0F0H D.AL=0FFH

分析:8086/8088 提供了丰富的条件转移指令,它们分为:根据单个条件标志的条件转

移指令;根据两个无符号数比较结果实现转移的条件转移指令;根据两个有符号数比较结果

实现转移的条件转移指令。在该题中,条件转移指令 JNL NEXT 属于上述第三类。因此只有当

AL 中的有符号数不小于(即大于等于)有符号数 0FBH(即为-5)时,才能满足条件转至标

号 NEXT 处执行。所给的 4 个选择中只有 D.AL=0FFH(即为-1)才是正确的。

答案:D

【612】下列子程序完成除法操作,请将程序填写完整。

dee_div PROC

MOV DL,0

LOP: SUB AX,CX

( (1) )

Page 152: IBM-PC 汇编语言程序设计试题解

·148· IBM-PC 汇编语言程序设计试题解

INC DL

JMP SHORT LOP

NEXT: ( (2) )

RET

dee_div ENDP

(1)A.JMP NEXT B.JC NEXT C.JNC NEXT D.JE NEXT

(2)A.MOV AX,CX B.MOV CX,AX C.ADD AX,CX D.ADD CX,AX

答案:(1)B;(2)C

【613】下面的程序是将 10 个 8 位的无符号数按递减次序排序。请选择正确的答案将程

序填充完整。

DATA SEGMENT

ARRAY DB 05H,78H,0FFH,7BH,00H

DB 8CH,20H,A0H,0F0H,60H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

MAIN PROC FAR

START: PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

AB1: MOV SI,OFFSET ARRAY

MOV BL,0

MOV CX,10

( (1) )

AGAIN: MOV AL,[SI]

INC SI

CMP AL,[SI]

( (2) ) CD1

MOV AH,[SI]

MOV [SI],AL

DEC SI

MOV [SI],AH

INC SI

MOV BL,1

CD1: LOOP AGAIN

DEC BL

Page 153: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·149·

( (3) ) AB1

RET

MAIN ENDP

CODE ENDS

END START

(1)A.INC BL B.INC SI C.DEC CX D.INC CX

(2)A.JC B.JNC C.JE D.JA

(3)A.JC B.JNE C.JZ D.JP

分析:该程序是采用冒泡算法,共有两个循环体。内循环进行两两相邻比较,如果符合

递减次序则不交换,否则就相互交换。每一轮比较的次数为 10-1=9。外循环设置一个交换

标志位(BL),每次进行外循环就设置为 0,而内循环每作一次交换就将该标志设置为 1,在

每次内循环结束后就测试交换标志,如果该位为 1,则再一次进入外循环;如果该位不为 1,

则说明上一轮比较已经引起交换操作,数组已经排序完毕,这样就立即结束外循环。

答案:(1)C;(2)B;(3)C

【614】读程序回答问题:

XOR AX,AX

MOV BX,1

MOV CX,5

LOP: ADD AX,BX

INC BX

INC BX

LOOP LOP

HLT

程序执行到 HLT,(AX)=( (1) ), (BX)=( (2) )。

A.9 B.10 C.11 D.20 E.25 F.36

答案:(1)E;(2)C

【615】完成 41H 送[2100H]、42H 送[2101H]的正确程序段是( )。

A.MOV AL,41H B.MOV SI,2100H C.MOV AX,4241H D.MOV AX,'AB'

MOV [2100H],AL MOV [SI],'A' MOV [2100H],AX MOV [2100H],AX

INC AL INC SI

MOV [2100H],AL MOV [SI],'B'

答案:B、C

【616】设 AH=0,AL=06H,BL=09H,执行指令

ADD AL,BL

AAA

Page 154: IBM-PC 汇编语言程序设计试题解

·150· IBM-PC 汇编语言程序设计试题解

之后,其结果应是( )。

A.AH=01,AL=05 B.AH=1,AL=15

C.AH=0,AL=0FH D.AH=0,AL=05

答案:A

【617】下面指令执行后,变量 DAB中的内容是( )。

DAW DW 2A05H

DAB DB 0FAH

MOV AL,BYTE PRT DAW

SUB DAB,AL

A.0DAH B.0FAH C.0F5H D.0D0H

答案:C

【618】执行下列指令后,正确的结果是( )。

MOV AL,100

MOV BL,-2

A.AL=100H,BL=02H B.AL=64H,BL=0FEH

C.AL=64H,BL=82H D.AL=100H,BL=0FEH

答案:B

【619】设数据段中已有:

DA1 DB 2H,34H

DA2 DW 56H,78H

下面有语法错误的语句是( )。

A.ADR1 DW DA1 B.MOV DA1+1,AX

C.MOV BYTE PTR DA2+1,AL D.MOV WORD PTR DA1+1,AX

答案:B

【620】实现将 DX:AX 中存放的 32 位数扩大 4 倍,正确的程序段是( )。

A.SHL AX,2 B.RCL AX,2 C.MOV CX,2 D.SHL AX,1

ROL DX,2 SHL DX,2 LOP: SHL AX,1 SHL AX,1

RCL DX,1 RCL DX,1

LOOP LOP RCL DX,1

答案:C

【621】DATA SEGMENT

Page 155: IBM-PC 汇编语言程序设计试题解

第 2 章 选 择 题 ·151·

TA1 DW 0102H,0304H,0506H

TA2 DB 02H,03H,04H

...

MOV BX,DS:[0006H]

AND BX,0FFH

OR BH,[BX]

上述指令序列运行后,BX 的内容是( )。

A.0605H B.0402H C.0606H D.0204H

答案:B

【622】下面指令序列测试 BH 中的数是否为奇数,若为奇数则转移至 K1处,横线处的指

令应为( )。

TEST BH,01H

_______ K1

A.JNE B.JZ C.JS D.JC

答案:A

【623】测试 BL 寄存器内容是否与数据 4FH 相等,若相等则转 NEXT 处执行,可实现的方

法是( )。

A.TEST BL,4FH B.XOR BL,4FH C.AND BL,4FH D.OR BL,4FH

JZ NEXT JZ NEXT JZ NEXT JZ NEXT

答案:B

【624】设 AX=1000H

NEG AX

NOT AX

执行上述指令后,正确的结果是( )。

A.AX=1001H B.AX=0FFFH C.AX=1000H D.AX=0111H

答案:B

【625】DA1 EQU BYTE PTR DA2

DA2 DW 0ABCDH

...

SHL DA1,1

SHR DA2,1

上述指令序列执行后,DA2 字存储单元的内容是( )。

A.0ABCDH B.0AB9AH C.55CDH D.559AH

答案:C

Page 156: IBM-PC 汇编语言程序设计试题解

·152· IBM-PC 汇编语言程序设计试题解

【626】 MOV CL,8

ROL AX,CL

OR AX,BX

假设 AX=0012H,BX=0034H,那么上述程序段执行后,AX 中的结果是( )。

A.1234H B.3412H C.0046H D.0034H

答案:A

【627】执行下列指令序列后,正确的结果是( )。

MOV AL,81H

ADD AL,AL

ADC AL,AL

A.AL=05H B.AL=204H C.AL=04H D.AL=205H

答案:A

【628】DA2 DB 12H,34H,56H,0ABH

DB $− DA2

BUF1 DB 10H,20H,30H

...

LEA SI,DA2

MOV CL,4[SI]

MOV CH,LENGTH BUF1

上述指令序列运行后,CX 的内容是( )。

A.03ABH B.01ABH C.0304H D.0104H

答案:D

【629】从 BUF 单元开始存放有 10 个字节数据,欲找出与 AL 中内容不同的数据,并将该

数据的偏移地址送 ADR单元,正确选择的指令序列是( )。

A.CLD B.CLD C.CLD D.CLD

REP CMPSB REPNZ CMPSB REPZ SCASB REPZ SCASB

JZ K1 JNZ K1 JZ K1 JNE K1

MOV ADR,DI MOV ADR,DI DEC DI DEC DI

K1:... K1:... MOV ADR,DI MOV ADR,DI

K1:... K1:...

答案:C

Page 157: IBM-PC 汇编语言程序设计试题解

第 3章 判 断 题

对第 630 题至第 767 题的指令操作作出判断。

【630】 POP CS

答案:错误。不能对 CS直接操作。

【631】 PUSH WORD PTR 20[BX+SI−2] 答案:正确。

【632】 LEA BX,4[BX]

答案:正确。

【633】 JMP BYTE PTR[BX]

答案:错误。偏移地址应该是 16bit 的。

【634】 ADD BX,OFFSET A ;A是 DB 定义的变量

答案:正确。

【635】 IN AL,3F0H

答案:错误。只能利用 8bit 立即数表示端口,当端口号超出 8bit 数可以表示的范围时

要用 IN AL,DX。

【636】 MOV AL,BX

答案:错误。操作数类型不一致。

【637】 MOV [BX],[SI]

答案:错误。(1)指令中没有表示数据类型的信息。(2)MOV 指令的两个操作不能同时

是存储器。

【638】 MOV AX,[BX][BP]

答案:错误。不能两个基址指针寄存器同时使用。

【639】 MOV ARRAY[BX][SI],ES:AX

答案:错误。存储器访问时可以使用段跨越前缀,段地址与偏移地址合成物理地址。寄

存器在 CPU内部,不存在地址问题,访问时不能使用段跨越前缀。

Page 158: IBM-PC 汇编语言程序设计试题解

·154· IBM-PC 汇编语言程序设计试题解

【640】 MOV BYTE PTR[BX],1000

答案:错误。立即数 1000 超出了字节类型所能表示的范围。

【641】 MOV BX,OFFSET ARRAY[SI]

答案:正确。

【642】 MOV CS,AX

答案:错误。不能利用 MOV 指令对 CS赋值。

【643】 CMP 15,CX

答案:错误。正确的是:CMP CX,15。

【644】 CMP VAL1,25 ;VAL1 是 DB定义的变量

答案:正确。

【645】 CMP VAL1,VAL2 ;VAL1,VAL2是 DB 定义的变量

答案:错误。CMP 指令的两个操作不能同时是存储器。

【646】 CMP AX,VAL2 ;VAL2 是 DB定义的变量

答案:错误。操作数类型不一致。

【647】 MOV BP,AL

答案:错误。操作数类型不一致。

【648】 MOV VAL[BX+4*5][DI],SP ;VAL是 DW 定义的变量

答案:正确。

【649】 MOV VAL1,VAL2 ;VAL1,VAL2是 DB 定义的变量

答案:错误。MOV 指令的两个操作不能同时是存储器。

【650】 MOV AX,VAL[DX] ;VAL是 DW 定义的变量

答案:错误。DX 不是指针索引寄存器。

【651】 MOV VAL,DS ;VAL是 DW 定义的变量

答案:正确。

【652】 MOV SP,SS:VAL[BX][SI] ;VAL是 DW 定义的变量

答案:正确。

Page 159: IBM-PC 汇编语言程序设计试题解

第 3 章 判 断 题 ·155·

【653】 MOV [BX][SI],2

答案:错误。指令中没有表示数据类型的信息。

【654】 MOV AX,VAL2−VAL1 ;VAL1,VAL2是 DW 定义的变量

答案:正确。本指令的寻址方式是立即寻址,指令的意义是将 VAL2,VAL1 之间的字节

数存入 AX。

【655】 ADD VAL1,VAL2 ;VAL1,VAL2是 DB 定义的变量

答案:错误。ADD 指令的两个操作不能同时是存储器。

【656】 SUB AL,VAL ;VAL是 DW 定义的变量

答案:错误。操作数类型不一致。

【657】 JMP LAB[SI] ;LAB 是标号

答案:错误。

【658】 JNZ VAR ;VAL是 DW 定义的变量

答案:错误。JMP VAR 是正确的,条件转移只能用位移量。

【659】 JMP NEAR LAB ;LAB 是标号

答案:错误。正确的是 JMP NEAR PTR LAB。

【660】 JMP FAR PTR BX

答案:错误。错误地使用了寄存器 BX。FAR PTR为段间跳转,BX 只能提供偏移地址,不

能提供段地址。

【661】 JLE FAR PTR LAB

答案:错误。远程标号不能作为条件转移指令的操作数。

【662】 CALL AX

答案:正确。

【663】 MOV DS,2000H

答案:错误。不能将立即数直接赋值到段寄存器。

【664】 SHL BP,3

答案:错误。8086 的移位指令中,当移动次数大于 1 时,要求用 CL 来表示移动次数。

【665】 PUSH [BX]

Page 160: IBM-PC 汇编语言程序设计试题解

·156· IBM-PC 汇编语言程序设计试题解

答案:正确。

【666】 INC [BX]

答案:错误。指令中没有表示数据类型的信息。

【667】 CMP SS,AX

答案:错误。段寄存器不能作为运算指令的操作数。

【668】 RET 3

答案:正确。虽然使用空弹出返回指令时,一般都是空弹出偶数字节,但是本指令没有

语法错误。

【669】 DIV 10

答案:错误。错误地使用了立即数,使得指令中没有表示数据类型的信息。

【670】 CMP AX,[SI+DI]

答案:错误。不能两个变址指针寄存器同时使用。

【671】任何存储单元都只有惟一的段地址和偏移地址。

答案:错误。存储单元的物理地址是惟一的。

【672】 MOV CL,[BL]

答案:错误。BX 是基址寄存器,BL不能单独使用。

【673】 REP MOVS ES:WORD PTR[DI],DS:[SI]

答案:正确。

【674】 RCR [BX+SI],CX

答案:错误。8086 的移位指令中,当移动次数大于 1 时,要求用 CL 来表示移动次数。

【675】 MOV BX,VAL:[DX]

答案:错误。DX 不是指针索引寄存器。

【676】 MOV DS,[BP+DI]

答案:正确。

【677】 JMP DWORD PTR [BX+SI]

答案:正确。

Page 161: IBM-PC 汇编语言程序设计试题解

第 3 章 判 断 题 ·157·

【678】 PUSH OFFSET VAL ;VAL是 DB 定义的变量

答案:正确。

【679】 MOV CL,HIGH VAL ;VAL是 DW 定义的变量

答案:正确。

【680】 TEST DL,00000100B

答案:正确。

【681】 MOV DS,0

答案:错误。不能将立即数直接赋值到段寄存器。

【682】 MOV AX,[SI][DI]

答案:错误。两个变址指针寄存器不能同时使用。

【683】 MOV BYTE PTR[BX],10H

答案:正确。

【684】每个汇编语言源程序模块都必须以 END 伪指令结束。END 伪指令用于向汇编程序

指示源程序的结束;在需要时,还可以用于程序入口地址。

答案:正确。

【685】若 X为一字单元,则 LES AX,X 是不合法的。

答案:正确。

【686】ADD AX,1 指令与 INC AX 指令都执行 (AX)=(AX)+1 的操作,两者完全可以相互替

代使用。

答案:错误。ADD AX,1 指令会影响标志位 CF,但 INC AX 不会,在关心 CF 状态的程序

中不能相互替代使用。

【687】同一模块中不允许定义相同的宏名。

答案:错误。

【688】LDS AX,WORD0(字内存变量)指令将 WORD0 的偏移量赋给 AX,将段地址赋给 DS。

答案:错误。LDS 指令的意义是:将某个定义为 DD 的内存变量中的内容,低字放到所指

定的 16 位寄存器内,高字放到 DS。

【689】AAM 指令是对除法的运算结果进一步整理。

答案:错误。AAM 是乘法的 ASCII 调整指令。

Page 162: IBM-PC 汇编语言程序设计试题解

·158· IBM-PC 汇编语言程序设计试题解

【690】REPNZ CMPSB 指令可完成比较两字符串是否相同的功能。

答案:错误。

【691】MOV AX,[AX]是不合法指令。

答案:正确。

【692】POP CS:[BX]是合法指令。

答案:正确。

【693】当循环体可能执行 0 次时,不能用 DO-WHILE 结构。

答案:正确。

【694】当 CPU 处于死循环状态时是无法响应硬中断的。

答案:错误。从外设发出中断请求到 CPU 响应中断,有两个控制条件是起决定性作用的:

(1)该外设的中断请求是否被屏蔽,这个条件由 8259A 的中断屏蔽寄存器(端口地址为

21H)控制;

(2)CPU 是否允许响应中断,这由标志寄存器(FLAG)中的中断允许位 IF控制。但 CPU

不能禁止非屏蔽中断,对于非屏蔽中断 CPU 总会响应。

【695】在生成的可执行文件中,伪指令是不存在的。

答案:正确。

【696】宏定义中可使用伪操作“%表达式”传送表达式的值,但表达式中不允许出现寄

存器。

答案:正确。

【697】关闭文件只是取消该文件的代号,但对文件的内容是没有影响的。

答案:错误。

【698】汇编语言源程序中,符号地址和标号必须先定义后使用。

答案:错误。标号不用先定义。

【699】MOV AX,WORDX 中源操作数是直接寻址(WORDX 是字变量符号地址)。

答案:正确。

【700】硬中断处理程序是可使用 INT 指令来调用执行的。

答案:正确。

【701】MOV [100],AX 与 MOV AX,[301]的访存次数相同。

Page 163: IBM-PC 汇编语言程序设计试题解

第 3 章 判 断 题 ·159·

答案:错误。80x86 CPU 对奇地址的存储器做一个字的操作时要访问 2 次,而对偶地址

则要 1 次。

【702】MOV AX,[AX]的原操作数是寄存器间接寻址。

答案:错误。地址指针寄存器有:BX、BP、SI、DI,AX 不能做地址指针使用。

【703】宏是不可以递归定义的。

答案:错误。

【704】同一个文件内不允许出现相同的子程序名。

答案:正确。

【705】非压缩的 BCD 码调整指令的作用是将运算结果重新整理。

答案:正确。

【706】语句 X=X− Y 执行后按照减法规则影响标志位。

答案:错误。语句 X=X− Y 不是指令,不影响标志位。

【707】JMP SHORT PTR LABEL 是段内直接短转移。

答案:正确。

【708】结构中具有多个值的字段是不允许预赋值的。

答案:错误。

【709】END LAB 语句指示本程序执行到标号 LAB处则结束。

答案:错误。标号 LAB指示程序开始执行的起始地址。

【710】当汇编源程序只包含一个段时,连接后就能转换成.COM 文件。

答案:错误。在建立源文件后,经过汇编、连接形成 EXE 文件,然后可以通过 EXE2BIN

程序来建立 COM 文件。

【711】对于指令 DIV AX,当 AX=0时则会产生溢出,并使得标志位 OF=1。

答案:正确。

【712】指令 MOV AX,3 LT 5,汇编后变为 MOV AX,1。

答案:错误。汇编后变为 MOV AX,0FFFFH。条件真用数字-1 表示,条件假用数字 0 表

示。

【713】同一地址既可以看作是字节单元的地址,也可以看作是字单元的地址。

Page 164: IBM-PC 汇编语言程序设计试题解

·160· IBM-PC 汇编语言程序设计试题解

答案:正确。

【714】一个字存入存储器要占有相继的两个字节,低位字节存入低地址,高位字节存入

高地址。

答案:正确。

【715】MOV AX,1000H 指令中的目的操作数是立即寻址。

答案:错误。目的操作数是寄存器 AX,源操作数是立即寻址。

【716】MOV AX,ES:[DI− SP]中源操作数是带段跨越前缀的基址变址寻址。

答案:错误。[DI− SP]错误,SP 不是基址,基址变址合成有效地址时使用的是加法。

【717】MOV AX,ES:[DI+BP− 2]

答案:正确。

【718】IN DX,AL 指令从 DX 指定的端口地址读入一个字节到 AL寄存器中。

答案:错误。应该是 IN AL,DX。

【719】PUSH AL将 AL 寄存器的内容压入堆栈。

答案:错误。每次对堆栈的操作至少 16bit,而 AL 是字节(8bit)。

【720】ADD AX,BX与 ADC AX,BX 指令得到的结果总是不同的。

答案:错误。两个指令的区别是:执行 ADC 指令时 CF 将参与运算,而 ADD 指令则不是,

但是当 CF=0 时,两个指令得到的结果是相同的。

【721】MOVS ES:BYTE PTR[DI],DS:[SI]完全等价于 MOVSB。

答案:正确。

【722】无符号数比较指令和有符号数比较指令的比较结果有可能相同。

答案:正确。

【723】隐含地认为变量表达式的类型属性和变量的类型属性是相同的。

答案:正确。

【724】DUP 操作不可以嵌套。

答案:错误。

【725】对于 MOV 指令,不可以将一个存储单元的内容直接送入另外一个存储单元。

答案:正确。

Page 165: IBM-PC 汇编语言程序设计试题解

第 3 章 判 断 题 ·161·

【726】对于数值回送操作符 TYPE、LENGTH、SIZE 之间有如下关系:(SIZE 变量)=(LENGTH

变量)*(TYPE变量)

答案:正确。

【727】定义在代码段 C中的类型属性为 FAR 的过程只能在代码段 C 之外调用。

答案:错误。

【728】程序直接 I/O 方式可以大大提高 CPU 的效率。

答案:错误。提高 CPU 的效率的问题不能笼统地说,针对随机或大量的 I/O 访问,中断、

DMA 能大大提高 CPU 的效率。

【729】对于加法指令 ADD AX,BX 来说,当执行后若 OF=1,则说明有溢出,结果是错误

的。

答案:错误。判断符号数的运算结果可以用 OF 标志,但是,判断无符号数的运算结果

要用 CF 标志。

【730】定义结构

ST1 STRUC

XX1 DW 1

XX2 DW 2

ENDS

则指令 MOV AX,XX1[BX]是合法的。

答案:错误。结构成员表示方法错误。

【731】 MOV [BX],60H

MOV AL,80H

ADD [SI],AL

答案:第 1条指令 MOV [BX],60H 错误。没有表示操作类型的信息。

【732】 MOV [BX][SI],80H

MOV [BX][SI],AL

MOV [BX+SI],AX

答案:第 1条指令 MOV [BX][SI],80H错误。没有表示操作类型的信息。

【733】 MOV DS,50H

MOV SI,30H

MOV DS:[SI],12H

答案:第 1条指令 MOV DS,50H 错误。不能将立即数直接赋值到段寄存器。

Page 166: IBM-PC 汇编语言程序设计试题解

·162· IBM-PC 汇编语言程序设计试题解

第 3 条指令 MOV DS:[SI],12H 错误。没有表示操作类型的信息

【734】 MOV AX,1234

MOV CX,08H

SHR AL,CL

答案:正确。

【735】 X DW ?

MOV AX,X

MOV X[2],X

答案:第 3条指令 MOV X[2],X 错误。MOV 指令的两个操作不能同时是存储器。

【736】 MOV AX,DX

MOV DX,AX

ADD [DI],0080H

答案:第 3条指令 ADD [DI],0080H 错误。没有表示操作类型的信息。

【737】 MOV AX,[BX]

ADD AX,[SI+06H]

MOV [BX]SI,AX

答案:第 3条指令 MOV [BX]SI,AX 错误。应该是 MOV [BX][SI],AX。

【738】 SUB CX,80H

ADD CL,80H

ADD BX+SI,CX

答案:第 3条指令 ADD BX+SI,CX 错误。应该是 ADD [BX+SI],CX。

【739】 MOV CL,10H

MOV AL,25H

ADD AL,BL

SHR AL,4

答案:第 4 条指令 SHR AL,4 错误。8086 的移位指令中,当移位次数大于 1 时,要求用

CL 来表示移位次数。

【740】MOV AH,1

INT 21H

MOV CL,4

MOV BL,4

SHL AL,BL

Page 167: IBM-PC 汇编语言程序设计试题解

第 3 章 判 断 题 ·163·

答案:第 5条指令 SHL AL,BL 错误。8086 的移位指令中,当移位次数大于 1 时,要求用

CL 来表示移位次数。

【741】下面程序计算 100 个数之和,改正其中的错误:

DATA SEGMENT

TAB DW A1,A2,A3,…,A100

YY DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE DS:DATA

GO PROC FAR

MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET TAB

MOV CX,100

ADD AL,BX

INC BX

JNZ LOP

MOV YY,AX

MOV AX,4C00

INT 21H

GO ENDP

CODE ENDS

END GO

答案:改正的程序为:

DATA SEGMENT

TAB DW A1,A2,A3,…,A100

YY DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE DS:DATA

GO PROC FAR

MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET TAB

MOV CX,100

XOR AX,AX ;存放求和数据的寄存器要先清零

LOP: ADD AX,[BX] ;利用寄存器间接寻址访问存储器

INC BX

Page 168: IBM-PC 汇编语言程序设计试题解

·164· IBM-PC 汇编语言程序设计试题解

INC BX

;由于数据是WORD类型,每操作一次指针要+2

DEC CX

JNZ LOP

;循环变量− 1

MOV YY,AX

MOV AX,4C00H

INT 21H

;十六进制数字后面要加“H”。

GO ENDP

CODE ENDS

END GO

【742】MOV DS,2010H

答案:错误。不能将立即数直接给段寄存器。

【743】PUSH AL

答案:错误。不能对字节进行堆栈操作。

【744】MOV DX, [SP]

答案:错误。无[SP]寻址方式,存储器地址只能通过 BX,BP,SI,DI 寻址。

【745】IN AL,0A00H

答案:错误。端口地址大于 FFH 应用 DX 寻址端口。

【746】XCHG CL,CH

答案:正确。

【747】AAA CX

答案:错误。AAA 为无操作数指令,默认操作数 AL。

【748】ADD [BP+DI],[1000H]

答案:错误。两个操作数不能均为存储器。

【749】OUT DX,CL

答案:错误。端口只能通过 AL 或 AX 传送数据。

【750】CBW BH

答案:错误。符号扩展命令为无操作数指令,默认操作数 AL。

【751】ADD 03ECH,AX

答案:错误。目的操作数不能为立即数。

Page 169: IBM-PC 汇编语言程序设计试题解

第 3 章 判 断 题 ·165·

【752】MOV BX,[SP+DI]

答案:错误。无[SP+DI]寻址,必须是基址(BX或 BP)+ 变址(SI或 DI)。

【753】MOV DI,[AX]

答案:错误。无[AX]寻址方式,存储器地址只能通过 BX,BP,SI,DI 寻址。

【754】LDS CH,[DI]

答案:错误。LDS 指令目的操作数应为一个 16 位寄存器。

【755】LEA BX,1000H

答案:错误。LEA 源操作数应为一个存储器操作数,不能是立即数。

【756】DIV 0010H

答案:错误。单操作数不能是立即数。

【757】LEA DX,DI

答案:错误。LEA 源操作数应为一个存储器操作数,不能是寄存器。

【758】MUL AX,200H

答案:错误。MUL 为单操作数指令,且源操作数不能为立即数,AX 隐含。

【759】MOV AX,[BX+BP]

答案:错误。无[BP+BX]寻址,存储器地址只能通过 BX,BP,SI,DI 寻址。

【760】CMP [BX],[SI]

答案:错误。双操作数不能均为存储器。

【761】MUL 24H

答案:错误。MUL 为单操作数指令,且源操作数不能为立即数。

【762】OUT DX,BX

答案:错误。端口只能通过 AL 或 AX 传送数据。

【763】AND 0FH,AL

答案:错误。目的操作数不能为立即数。

【764】JNZ AAA

答案:错误。AAA 是一条指令,不能作为符号地址。

Page 170: IBM-PC 汇编语言程序设计试题解

·166· IBM-PC 汇编语言程序设计试题解

【765】JMP NEXT

答案:正确。

【766】SBB AX,[DX]

答案:错误。DX 不能间接寻址。

【767】MOV AX,ES:[BX]

答案:正确。

Page 171: IBM-PC 汇编语言程序设计试题解

第 4章 简 答 题

【768】数在计算机中是怎样表示的?

答案:计算机中的数是用二进制来表示的,数的符号也是用二进制表示的,这样表示的

数称为机器数。机器数可用不同的码制来表示,常用的有原码、反码和补码表示法,补码表

示法是最常用的一种表示方法。

【769】补码有哪些性质?

答案:用补码表示的数有以下特征:对 X 的补码做求补运算,可以得到-X 的补码,因

此计算机中用对减数求补的方法把减法转换为加法。补码的加、减运算十分简便,不必判断

数的正负,只要符号位参加运算,就能自动得到正确结果。

【770】ASCII码的 0AH 和 0DH 对应的是什么字符?

答案:它们并不代表可显示的字符,而是表示某种操作。0DH 表示回车,就是使光标回

到本行首位;0AH 表示换行,就是使光标进入下一行,但列位置不变。

【771】如何将十六进制数转换为 ASCII?

答案:字符“0”到“9”的 ASCII 码为 30H 到 39H,因此只要把 0 到 9 加上 30H 就可以

了;但字符“A”到“F”的 ASCII 码为 41H 到 46H,0AH 到 0FH除了加上 30H 之外,还要再加

上 7。

【772】机器字长的含义是什么?

答案:机器字长是指微处理器一次可以直接处理的二进制数码的位数,它通常取决于微

处理器内部通用寄存器的位数和数据总线的宽度,它标志着计算精度。

【773】存储器与寄存器有什么不同?

答案:寄存器在 CPU 的内部,它的访问速度快,但容量小(8086 微处理器只有 14个 16

位寄存器)、成本高,它用名字来标识(如 AX、BX 等),没有地址;存储器在 CPU 的外部,它

的访问速度比寄存器慢,容量大(20 根地址线寻址 1M 内存空间)、成本低,存储单元用地址

来标识,地址可用各种方式形成。

【774】软件系统由哪两大类软件构成?

答案:软件系统分为系统软件和用户软件两大类。系统软件是由计算机的生产厂家提供

给用户的一组程序,这些程序是用户使用机器时为产生、准备和执行用户程序所必需的,系

统软件的核心称为操作系统。用户软件则是用户自行编制的各种程序。

Page 172: IBM-PC 汇编语言程序设计试题解

·168· IBM-PC 汇编语言程序设计试题解

【775】采用存储器地址分段方法的目的是什么?并说明物理地址的组成。

答案:采用存储器地址分段方法是为了在 16 位字长的机器里,表示 20位的地址信息;

物理地址由段地址和偏移地址组成,其计算方法是:物理地址=16×段地址+偏移地址。

【776】什么叫汇编语言?

答案:是一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地

址、常量和变量。它与机器语言几乎是一一对应的。

【777】简述汇编语言相对于高级语言的优点。

答案:汇编语言相对于高级语言的优点:一是汇编语言中的字符直接涉及到计算机的组

成部分,是利用计算机提供的操作系统编写的具体指令,能完全控制机器操作;二是汇编语

言是对高级语言的补充,可自编程序或调用 BIOS子程序;三是汇编语言执行速度快,经过汇

编程序形成机器语言。

【778】简述汇编语言从源程序的建立到运行可执行程序的主要步骤。

答案:(1)用编辑程序建立 ASM 汇编语言源文件;

(2)用汇编程序对源文件进行汇编,把 ASM 文件转换成 OBJ 文件;

(3)用连接程序对目标文件进行连接,把 OBJ文件转换成 EXE 文件;

(4)用 DOS命令直接键入文件名即可执行。

【779】在 DEBUG 调试工具调试汇编程序时,以下命令的功能是什么?

命令字母 命 令 功 能

A

D

E

F

G

L

R

T

U

答案:

命令字母 命 令 功 能

A 汇编命令

D 显示存储单元的命令

E 修改该存储单元内容的命令

F 填写命令

G 运行命令

L 装入命令

R 检查和修改寄存器内容的命令

T 跟踪命令

Page 173: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·169·

U 反汇编命令

【780】简述 8086 处理器中各工作寄存器的功能。

答案:(1)AX 作为累加器使用,是算术运算的主要寄存器。另外,所有的 I/O 指令都使

用这一寄存器与外部设备传送设备。

(2)BX 作为通用寄存器使用,此外在计算存储器地址时,它经常用作基址寄存器。

(3)CX 可作通用寄存器使用,此外在循环和串处理指令中用作隐含的计数器。

(4)DX 可作为通用寄存器用,一般在作双字长运算时把 DX 和 AX 组合在一起存放一个

双字长数,DX 用来存放发高位字。此外,对某些 I/O 操作,DX 可用作存放 I/O 的端口地址。

(5)SP 是堆栈指针寄存器,表示堆栈区中当前栈顶的偏移地址。

(6)BP 是基址指针寄存器,可与 SS寄存器连用确定堆栈段中的某一存储单元的地址。

(7)SI 称为源变址寄存器,DI 称为目的变址寄存器,一般与 DS 联用,用来确定数据段

中某一存储单元的地址。

(8)CS 是代码段寄存器,DS 是数据段寄存器, SS 是堆栈段寄存器,ES 是附加段寄存

器,它们都用来存放相应的段地址。

(9)IP 指令指针寄存器,用来存放代码段中的偏移地址。

(10)PSW 程序状态字寄存器,用来记录程序运行结果的状态和一些控制信息。

【781】标志寄存器中的状态标志和控制标志有什么区别?

答案:状态标志用来记录程序运行结果的状态信息,许多指令执行完毕后都相应地设置

状态标志,它又称为条件码标志,包括进位标志、溢出标志、符号标志、零标志、奇偶标志

等;控制标志用来控制处理器执行指令的方式,一般在程序中根据需要由指令设置,如方向

标志、中断标志、陷阱标志等。

【782】溢出标志 OF 和进位标志 CF 有什么不同?

答案:当运算结果的最高有效位有向高位的进位(加法)或借位(减法)时,进位标志

CF置 1;当运算结果超出了机器所能表示的数的范围时,产生溢出,溢出标志 OF置 1。

【783】一个字在存储器中是如何存放的?

答案:一个字在存储器中占用相邻的两个存储单元,低 8位存入低地址,高 8 位存入高

地址,字单元的地址用它的低地址来表示。

【784】为什么要将存储器分段管理?

答案:对于 16 位字长的 8086 CPU 而言,只能表示 16 位存储器地址(编号从 0000H~

FFFFH);但 8086 CPU 的地址线是 20 根,最大可寻址 1MB 的存储空间,其物理地址范围从

00000H~FFFFFH。为了用 16 位地址在 1MB 空间寻址,将 1MB 存储器空间分成许多逻辑段,这

样每个存储单元就可以用“段地址:偏移地址”来表示其准确的物理位置。段地址是逻辑段

在主存中的起始位置,8086 规定段地址必须是 xxxx0H 形式,省略低 4 位 0,段地址就可用

16 位二进制数表示,通常保存在段寄存器中;偏移地址是存储单元距离段起始位置的偏移值,

每个段最大 64KB,所以偏移地址也可用 16 位二进制数表示。这样,物理地址就可通过段地

Page 174: IBM-PC 汇编语言程序设计试题解

·170· IBM-PC 汇编语言程序设计试题解

址乘以 16 加上偏移地址得到。

【785】程序中的指令与数据在存储器中是怎样存放的?

答案:程序中的指令序列存放在代码段中,程序中使用的堆栈存放在堆栈段中,程序中

的数据默认存放在数据段中,有时也放在附加段中。

【786】简述 CPU 的组成。

答案:CPU 由以下三部分组成:

(1)算术逻辑部件 ALU,用来进行算术和逻辑运算;

(2)控制逻辑,负责对全机的控制工作;

(3)工作寄存器组,用来存放计算过程中所需要的或所得到的各种信息。

【787】将下列左边项与右边的解释联系起来(用字母填入)。

(1)CPU ( ) A.相对于段起始地址的偏移量。

(2)段地址 ( ) B.以先进后出方式工作的存储区域。

(3)物理地址 ( ) C.是逻辑段的起始地址。

(4)偏移地址 ( ) D.分析、控制并执行指令的部件。

(5)存储器 ( ) E.CPU 发出的访问存储器的地址信息。

(6)堆栈 ( ) F.存储程序、数据等信息的记忆装置。

答案:(1)D;(2)C;(3)E;(4)A;(5)F;(6)B。

【788】将下列左边项与右边的解释联系起来(用字母填入)。

(1)IP ( ) A.执行部件由 ALU 和寄存器组等组成。

(2)SP ( ) B.指出指令操作结果的标志。

(3)BIU ( ) C.保存当前栈顶地址的寄存器。

(4)EU ( ) D.控制操作的标志。

(5)状态标志 ( ) E.总线接口部件,实现执行部件所需要的所有总线操作。

(6)控制标志 ( ) F.指示下一条将要执行的指令的地址。

答案:(1)F;(2)C;(3)E;(4)A;(5)B;(6)D。

【789】简述 BIU和 EU 的功能。

答案:BIU 的功能是:负责 CPU 与存储器、I/O 之间的信息传送,它根据 CS:IP 形成的

物理地址从存储器中取出指令,经指令队列送往 EU 读取并执行。BIU 还根据 EU 提供的地址

和数据进行存取操作。

EU 的功能是:从 BIU 的指令队列中读取指令代码,执行指令规定的全部功能。例如,需

要向存储器或 I/O 传送数据时,EU要向 BIU 发送访问存储器或 I/O 的指令,并提供访问的数

据和地址。

EU和 BIU 是既分工又合作的两个独立部件。它们的操作是并行的,分别完成不同的任务,

从而大大加快了指令执行的速度。

Page 175: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·171·

【790】简述逻辑地址、有效地址、物理地址。

答案:逻辑地址:在程序设计中通常采用逻辑地址,它由段基值和偏移量两部分组成,

例如 DS:0200H。

有效地址:寻找数据存放的存储单元,有时所需的偏移地址是由相关项组成的,它被

称为有效地址用 EA 表示,例如 DS:[BX+02H],其有效地址就是由 BX 与 02H 的和构成偏移量。

物理地址:由 20 位二进制数构成(00000H~FFFFFH),逻辑地址转换成物理地址的方法

是:先将 16位段基值左移 4 位,形成 20 位的段基址,再与 16 位偏移量相加,产生 20位的

物理地址。CPU 与存储器之间交换信息使用物理地址。

【791】简述汇编语言与机器语言和高级语言的区别。

答案:由二进制代码编写的程序称为机器语言,它不需要进行转换便可直接在机器上执

行,但机器语言难于理解,不易记忆。

用定义符和数据项等内容编写的程序称为高级语言,它与算法有关而与机器无关。它需

要经过编译程序转换成目标代码,相对而言转换后占用的内存字节数较多,执行时间较长。

用助记符和数据项等内容编写的程序称为汇编语言,它与机器语言相比需要经过汇编

程序转换成目标代码,在表达形式上比机器语言易于理解。与高级语言相比它与机器有密

切关系,转换后占用的内存字节数相对少一些,从而执行的速度快,但不像高级语言那样

易于理解。

【792】请指出下列操作中可使用哪些寄存器。

(1)存放各种运算操作的数据。

(2)存放数据串操作时的计数值。

(3)查看程序已执行到哪条指令的地址。

(4)查看堆栈中当前正要进行入出栈的存储单元地址。

(5)查看运算结果是否等于零。

(6)查看程序中的数据存放的段区是从哪个地址开始的。

(7)查看程序中的指令存放的段区是从哪个地址开始的。

答案:(1)AX,BX,CX,DX,SI,DI,SP,BP;

(2)CX(它与 SI 和 DI在一起进行串操作);

(3)IP(它与 CS 组合构成物理地址);

(4)SP(它与 SS 组合构成物理地址);

(5)PSW(标志寄存器);

(6)DS,ES,SS;

(7)CS

【793】什么是寻址方式?

答案:在指令中,有时要寻找操作数的地址,有时要寻找转移地址(如转移指令、CALL

指令等),这些寻找地址的方式就称为寻址方式。8086 微处理器寻找操作数地址有 7 种方式:

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

Page 176: IBM-PC 汇编语言程序设计试题解

·172· IBM-PC 汇编语言程序设计试题解

对基址变址寻址等;寻找转移地址的方式有段内寻址和段间寻址,它们又分为段内直接、段

内间接、段间直接、段间间接寻址等。

【794】设 DS=2000H,BX=1256H,变量 TABLE 的偏移地址为 20A1H,(232F7H)=3280H。

下列指令分别执行后,IP 的值各是多少?

(1)JMP BX

(2)JMP TABLE[BX]

答案:(1)IP=1256H;(2)IP=3280H

【795】MOV 指令有什么特殊规定?

答案:MOV 指令是双操作数指令,两个操作数不能同为存储器寻址方式且不能同时为段

寄存器,目的操作数不允许用立即寻址方式且不能是代码段段寄存器 CS,立即数不能直接送

段寄存器等。

【796】根据下面给定的条件写出指令或指令序列:

(1)将一个字节的立即数送到地址为 NUM 的存储单元中。

(2)将一个 8 位立即数与地址为 BUF的存储单元内容相加。

(3)将地址为 ARRAY 的存储单元中的字数据循环右移一位。

(4)将 16 位立即数与地址为 MEM 的存储单元中的数比较。

(5)测试地址为 BUFFER的字数据的符号位。

(6)将 AX 寄存器及 CF 标志位同时清零。

(7)用直接寻址方式将首地址为 ARRAY 的字数组中第 5 个数送往寄存器 BX 中。

(8)用寄存器间接寻址方式将首地址为 ARRAY的字数组中第 5个数送往寄存器 BX中。

(9)用相对寻址方式将首地址为 ARRAY 的字数组中第 8 个数送往寄存器 BX 中。

(10)用基址变址寻址方式将首地址为 ARRAY 的字数组中第 N 个数送往寄存器 BX 中。

(11)将首地址为 BCD_BUF 存储单元中的两个压缩 BCD 码相加,并将和送到第三个存储

单元中。

答案:

(1)MOV BYTE PTR NUM,D8

(2)ADD BYTE PTR BUF,D8

(3)ROR WORD PTR ARRAY,1

(4)CMP WORD PTR MEM,D16

(5)TEST WORD PTR BUFFER,8000H

(6)SUB AX,AX

(7)MOV BX,ARRAY+8 ;排序从第 1开始

(8)LEA SI,ARRAY+8 ;排序从第 1开始

MOV BX,[SI]

(9)LEA SI,ARRAY

MOV BX,14[SI] ;排序从第 1开始

Page 177: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·173·

(10)LEA BP,ARRAY

MOV SI,2*N− 2

MOV BX,DS:[BP][SI]

(11)MOV AL,BCD_BUF

MOV BL,BCD_BUF+1

ADD AL,BL

DAA

MOV BCD_BUF+2,AL

【797】PUSH指令和 POP指令有什么特点?

答案:这是两个重要的对堆栈操作的指令,它们只能做字操作,它们所带的操作数不能

是立即数,POP 指令不允许使用 CS 寄存器。

【798】算术移位指令和逻辑移位指令有什么不同?

答案:算术移位指令一般用于带符号数的乘 2或除以 2 运算,正确的运算结果应保证符

号位不变;逻辑移位指令用于无符号数的乘 2 或除以 2 运算,参与移位的操作数的最高有效

位并不代表符号位。

【799】ADD、SUB、NEG 等指令执行完毕后,CF和 OF 的值意味着什么?

答案:CF=1 意味着把参与运算的数看作无符号数时,运算出现了错误,同时它确实代

表最高有效位有向高位的进位(加法)或借位(减法);OF=1 意味着把参与运算的数看作带

符号数时,运算出现了错误。也就是说,CF 位可用来表示无符号数的溢出,OF 位可用来表示

带符号数的溢出。

【800】乘法指令和除法指令有什么特殊规定?

答案:在乘法指令中,隐含使用累加器 AL 或 AX 参与运算,两个 8 位数相乘得到 16 位

乘积,存放在 AX 中;两个 16 位数相乘得到 32 位乘积,存放在 DX,AX 中。在除法指令中,隐

含使用 DX,AX 或 AX 做被除数,16 位数除以 8 位数,8 位商在 AL 中,8 位余数在 AH 中;32

位数除以 16位数,16 位商在 AX 中,16 位余数在 DX 中。

【801】逻辑运算指令的主要作用是什么?

答案:逻辑运算指令对处理操作数的某些位很有用,例如可屏蔽某些位(将这些位置 0),

将某些位置 1,将某些位变反,测试某些位等。

【802】选用 NOT,AND,OR,XOR 逻辑指令编写一指令序列,实现将 AL 第 0 位,第 2 位

同时置 1,其他位变反。

答案:XOR AL,0FFH;AND AL,00000101B

【803】串处理指令有什么特殊规定?

Page 178: IBM-PC 汇编语言程序设计试题解

·174· IBM-PC 汇编语言程序设计试题解

答案:在串处理指令中,源串默认在数据段中,但允许使用段跨越前缀来修改,源操作

数用 SI 寻址;目的串只能在附加段中,目的操作数用 DI 寻址。SI 与 DI 有自动增、减量的

功能,可完成正向或反向、字节操作或字操作的串处理。

【804】简述 RERZ CMPSB 指令的执行过程。

答案:(1)如(CX)=0或 ZF=0 时退出,否则往下执行。

(2)(CX)(CX)-1

(3)DS:((SI))-ES:((DI))

(4)(SI)(SI)±1, (DI)(DI)±1,DF=0 时为+,DF=1 时为-

(5)重复步骤(1)~(4)

【805】条件转移指令和无条件转移指令有什么不同?

答案:条件转移指令的位移量只允许 8 位,即目标地址应在本条转移指令的下一条指令

地址的-128 ~ +127 个字节的范围之内,因此它只能实现段内转移;无条件转移指令则没

有此限制,它能够实现段内和段间两种转移,段内转移可使用 8 位或 16 位位移量。

【806】完成下列操作,选用什么指令:

(1)将 AX 的内容,减去 0520H 和上次运算的借位;

(2)将变量名 TABL 的段地址送 AX。

答案:(1) SBB AX,0520H;(2) MOV AX,SEG TABL

【807】指令和伪指令的关系是什么?

答案:指令是在程序运行期间由计算机来执行的,而伪指令(伪操作)是在汇编程序对

源程序进行汇编时处理的操作,完成诸如数据定义、存储器分配、指示程序开始结束等功能。

【808】汇编语言源程序中的变量和标号有哪些属性?

答案:源程序中的变量和标号都有三种属性:段、偏移及类型。变量在除代码段以外的

其他段中定义,段地址存放在段寄存器中,偏移地址存放在基址或变址寄存器中,变量的类

型可以是 BYTE(字节)、WORD(字)、DWORD(双字)等;标号指示指令的地址,它的段地址

总在 CS 中,偏移地址在 IP 中,标号的类型可以是 NEAR(近)或 FAR(远)。

【809】指令 AND AL, OPR1 AND 0FFH 中的两个 AND有什么区别?

答案:第一个 AND 是操作码,表明这是一条逻辑运算指令,完成逻辑与运算;第二个 AND

是一个按位操作的逻辑操作符,它只能用于数字表达式。

【810】D1 DB 20H DUP(?)

D2 DW D1

请写出用一条指令实现取 D1 的偏移地址存入 SI中的三种方法。

答案:(1) LEA SI,D1;(2) MOV SI,OFFSET D1;(3) MOV SI,D2

Page 179: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·175·

【811】下列语句在存储器中分别为变量数据区分配多少个字节单元?

(1)VAR3 DD 10

(2)VAR4 DW 4 DUP(?),2

答案:(1)4BYTE;(2)4*2+1BYTE

【812】解释以下操作符:

OFFSET,SEG,ORG,EQU,$

答案:

OFFSET:是取变量或标号的偏移地址。

SEG:是取变量或标号的段地址。

ORG:是使下一个字节的地址从 ORG后的常数表达式的值开始。

EQU:定义一个常量符号,把等号右边的常量赋给等号左边的符号。

$:地址计数器,用来保存当前正在汇编的指令的地址。

【813】按照给定的条件为程序定义一个数据段,并画出存储单元的示意图:

(1)STR 是字符串 THIS IS A DATA_SEGMENT。

(2)DAT1 是字节变量,初值为 23,4BH,126,0D3H。

(3)DAT2是 16 位数字变量,初值为 100,256,2 DUP(3,5)。

(4)LEN 是以上存储单元的字节数。

答案:

STR DB 'THIS IS A DATA_SEGMENT'

DAT1 DB 23,4BH,126,0D3H

DAT2 DW 100,256,2 DUP(3,5)

LEN DB $− STR

地址 数据 地址 数据 地址 数据 地址 数据 地址 数据

STR 'T' 'D' 'M' 0D3H 5

'H' 'A' 'E' DAT2 100 0

'I' 'T' 'N' 0 3

'S' 'A' 'T' 0 0

20 '_' DAT1 23 1 5

'A' 'S' 4BH 3 0

20 'E' 126 0 LEN 34

【814】程序的基本逻辑结构有几种?

答案:基本的逻辑结构共有 5 种,每种结构都只有一个入口和一个出口。它们是:

(1)顺序;

(2)IF_THEN_ELSE;

(3)CASE;

Page 180: IBM-PC 汇编语言程序设计试题解

·176· IBM-PC 汇编语言程序设计试题解

(4)DO_WHILE;

(5)DO_UNTIL;

结构化程序设计要求每个程序都由这 5 个基本结构组合或嵌套而成,同时也不排斥子程

序结构的使用。

【815】为什么说循环结构是分支结构的特例?

答案:循环结构在满足循环条件时实行循环,这实际上是多次走同一个分支,当不满足

循环条件时,就走另一个分支,因此循环结构是一种特殊的分支结构。

【816】子程序调用和返回指令完成哪些操作?

答案:子程序调用指令首先把子程序的返回地址(即调用程序中 CALL 指令的下一条指

令的地址)存入堆栈,然后转移到子程序的入口地址去执行,它又分为段内调用和段间调用;

返回指令的操作是返回地址出栈送 IP 寄存器(段内或段间)和 CS 寄存器(段间)。

【817】结构伪操作 STRUC 的作用是什么?

答案:结构伪操作 STRUC 把不同类型的数据定义在同一个数据结构里,便于某些数据处

理的需要。如使用堆栈传递参数地址时,通过访问结构数据的方法来取得主程序通过堆栈传

递过来的参数,能避免地址计算可能带来的错误。

【818】在用堆栈传参的子程序设计中,为什么常用带常数的返回指令?

答案:在用堆栈传参时,主程序中要把参数的地址压入堆栈,子程序中通过 BP 寄存器

访问堆栈单元取出参数的地址,而不是用出栈的方法。因此为使返回到主程序后堆栈能恢复

原始状态不变,要用带常数的返回指令调整 SP的值。

【819】在用堆栈传参的子程序设计中,为什么要 PUSH BP?

答案:这是因为子程序中要用到 BP 寄存器。在子程序中,为了取得从堆栈传递过来

的参数,必须访问堆栈,这就要用到 BP 寄存器,而 BX、SI、DI 等寄存器都不能用来访问

堆栈。

【820】请写出调用程序和子程序之间的信息传达方式。

答案:信息传送方式也称为变量传送方式,通常有以下几种:

(1)通过寄存器传送变量;

(2)通过地址表传送变量地址;

(3)通过堆栈传送参数或参数地址;

(4)如果过程和调用程序在同一源文件中,则过程可直接访问模块中的变量。

【821】简述不同模块的程序之间是怎样进行参数传递的。

答案:在源程序中用户定义的符号可以分为局部符号和外部符号两种。其中在本模块中

定义,又在本模块中引用的符号称为局部符号;而在另一模块中定义,在本模块中引用的符

Page 181: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·177·

号称为外部符号。外部符号在提供给其他模块使用时必须要用 PUBIC 定义该符号为外部符号。

格式为

PUBLIC SOMBOL

而在另一个模块中定义的需要在本模块中使用时必须使用 EXTRN 伪操作。其格式为

EXTRN SYMBOL NAME:TYPE

这两个伪操作的使用必须相匹配,这样在连接时就要检查每个模块中的 EXTRN 语句中的

每个符号是否能和与其相连接的其他模块中的 PUBLIC 语句中一个符号相匹配,如匹配,就可

以在不同模块的程序间通过变量来传递参数。

【822】简述什么是宏?宏与子程序的区别与联系。

答案:宏是源程序中一段有独立功能的程序代码。它只需要在源程序中定义一次,就可

以多次调用它,调用时只需要用一个宏指令语句就可以了。

使用子程序结构可提高编程效率,节省存储空间。但每次调用子程序,返回、保存及恢

复寄存器以及参数的传送等都要增加程序的额外开销。因此,子程序结构适合于子程序代码

较长,传参较多,有紧缩存储空间要求的情况下使用。使用宏汇编的程序执行效率较高,但

汇编后的目标代码占用存储空间较大。因此,宏汇编一般用于子功能代码较短,传参较少的

程序。其实,使用子程序结构还是使用宏汇编结构,并没有固定的标准,大多数情况下,取

决于程序员的编程风格。

【823】宏指令是如何定义的?

答案:定义宏指令称为宏定义,宏定义是用一组伪操作来实现的,其格式为:

宏指令名 MACRO [虚参 1,虚参 2,…]

(宏定义体:一组有独立功能的程序代码)

ENDM

【824】什么是宏调用?什么是宏展开?

答案:在源程序中对宏指令的调用称为宏调用,但对宏指令必须先定义后调用。宏展开

是用宏定义体取代源程序中的宏指令名,并且用实元取代宏定义中的哑元的汇编过程。

【825】在宏展开时,实参和虚参的个数不等,怎么办?

答案:汇编程序不要求实参和虚参的个数必须相等,当实参个数大于虚参个数时,多余

的实参不予考虑;当实参个数小于虚参个数时,则多余的虚参作“空”处理。

【826】什么叫条件汇编?使用条件伪操作的目的是什么?

答案:汇编程序根据条件伪操作能把一个程序段包括在源程序中,或排除在源程序之外,

也可以根据不同条件选择不同的程序段进入源程序,这为汇编语言编程提供了很大的便利。

【827】宏调用中的实参(实元)可以是表达式吗?

答案:可以是表达式,还可以是常数、字符串、寄存器、存储单元名以及用寻址方式能

Page 182: IBM-PC 汇编语言程序设计试题解

·178· IBM-PC 汇编语言程序设计试题解

找到的地址等,也可以是指令的操作码或操作码的一部分。应注意的是,宏展开后,即用实

参取代虚参(又称哑元)后,所得到的汇编语句应该是有效的,否则汇编程序将会指示出错。

在 MASM6 中,还可以用“:REQ”指定某个参数是必须有的。

【828】&操作符及%操作符应如何使用?

答案:&操作符可以把前后两个符号合并形成操作码、操作数或是一个字符串。%操作符

把跟在它之后的表达式的值转换成当前基数下的数,在宏展开期间,用这个数来取代哑元。

【829】.XALL、.LALL 和.SALL 有什么区别?

答案:这 3 个伪操作是列表伪操作,用来控制汇编清单中宏展开的列出方式。一般在 LST

清单中,使用隐含的.XALL 伪操作,它使不产生目标代码的语句在清单中不列出来。.LALL

列出包括注释在内的所有宏展开;.SALL 则不列出任何展开信息。

【830】LOCAL伪操作的作用是什么?

答案:若宏定义体内的功能代码使用了标号,而在程序中要多次调用该宏定义,此时宏

展开后会出现标号的多重定义,这是不能允许的。为了解决这个问题,系统提供了 LOCAL 伪

操作,其格式是:LOCAL 局部标号 1,局部标号 2,…汇编程序对 LOCAL 伪操作之后的每一个

局部标号,在展开时用“??0000”取代局部标号“1”,用“??0001”取代局部标号“2”,以

此类推,这样在展开后的程序中的标号就是惟一的了。

【831】IRP与 IRPC 的区别是什么?

答案:IRP与 IRPC 是不定重复伪操作,它们的不同之处在于自变量的取代方式。IRP 的

自变量表用尖括号括起来,每次重复用自变量表中的一项来取代重复块中的哑元。重复次数

由自变量表中的自变量个数来确定。IRPC 的自变量表必须是字符串,重复次数由字符串中的

字符个数确定,每次重复用字符串中的一个字符取代重复块中的哑元。

【832】什么是宏库?宏库的扩展名是什么?

答案:包含若干常用宏定义的文件称为宏库,宏库通常用.MAC 或.INC作为扩展名。

【833】下面的语句是什么含义?

IF1

INCLUDE MACRO.MAC

ENDIF

答案:INCLUDE 语句说明该应用程序中要用到宏库 MACRO.MAC 中的宏定义,汇编程序将

把 MACRO.MAC 中的所有宏定义都包含在应用程序中。而条件伪操作 IF1语句可使 INCLUDE 只

在汇编的第一遍扫视期间出现,这样宏库的拷贝将不在汇编清单中出现。

【834】什么是 I/O 端口?CPU 使用什么指令与外设进行数据交换?

答案:CPU 与 I/O 设备通过硬件接口或控制器相连接,这些接口或控制器都有数量不等

Page 183: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·179·

的端口,这些端口有统一的地址编码,CPU 通过这些端口使用输入输出指令 IN、OUT 与外设

进行数据交换。

【835】CPU 为什么不能用 MOV 指令进行 I/O 数据传输?

答案:在 80x86 微机系统中,I/O 端口编址在一个独立的地址空间中,它和存储器是完

全分离的。因此,对于存储器的存取操作使用 MOV 指令,而与端口进行信息交换的操作使用

专门的 I/O指令,二者不能混淆。

【836】I/O 设备有哪几种数据传送方式?

答案:程序查询、中断、DMA。

【837】使用查询方式进行输入输出的优缺点是什么?

答案:使用查询方式编程可直接在端口级上输入输出信息,数据的传送速度和吞吐量比

较高,另外在控制多个设备的 I/O 时,可在程序中安排它们的优先级,最先查询的设备,其

工作的优先级也最高。修改程序中的查询次序,实际上也就修改了设备的优先级,这样以最

简便的方法实现了对设备优先级的控制。查询方式的缺点主要是在查询过程中,要反复地查

询等待,浪费了 CPU 原本可执行大量指令的时间,而且由询问转向相应的处理程序的时间较

长,尤其在设备比较多的情况下。

【838】什么是中断?

答案:计算机在执行程序过程中,遇到需要处理的事件时,暂停当前正在运行的程序,

转去执行有关的服务程序,处理完后自动返回原程序,这个过程称为中断(interrupt)。中

断在现代计算机系统中是一种非常重要的技术,输入输出设备和主机交换数据、分时操作、

实时系统、多处理机系统、计算机网络和分布式计算机系统都要用到这种技术。

【839】什么是中断源?中断分为几类?

答案:中断可分为内中断和外中断。内中断是由计算机内部原因引起的中断,内中断又

称为软中断,它通常由三种情况引起:

(1)由中断指令 INT 引起;

(2)由于 CPU 的某些错误而引起,如溢出中断、除法错中断等;

(3)为调试程序(DEBUG)设置的中断,如单步中断、断点中断。

外中断指由外部事件引起的中断,又称为硬中断。硬件中断主要有两种来源:

(1)非屏蔽中断(NMI),如电源故障中断、实时钟中断等;

(2)可屏蔽中断,一般是由于各种外部设备请求 CPU 提供服务所引起的中断。

【840】简述中断发生时硬件自动完成的操作。

答案:(1)CPU 接收外设的中断类型号;

(2)当前的 PSW、CS、IP的内容存入堆栈;

(3)清除 IF、TF;

Page 184: IBM-PC 汇编语言程序设计试题解

·180· IBM-PC 汇编语言程序设计试题解

(4)根据中断类型号取出的中断向量送 CS 和 IP;

(5)转中断处理子程序。

【841】简述修改中断服务程序的基本过程。

答案:(1)保存原中断向量(INT 21H 的 35H 功能),设置新的中断向量(INT 21H 的 25H

功能);

(2)设置设备的中断屏蔽位;

(3)设置 CPU 的中断允许位(开中断);

(4)在主程序结束之前,恢复原中断向量。

【842】简述 8086 CPU 的中断响应过程。

答案:(1)取中断类型号 N;

(2)寄存器(FLAG)内容入栈;

(3)当前代码段寄存器(CS)内容入栈;

(4)当前指令计数器(IP)内容入栈;

(5)禁止硬件中断和单步中断(IF=0, TF=0);

(6)从中断向量表中取 4×N 的字节内容送 IP,取 4×N+2 中的字节内容送 CS;

(7)转中断处理程序。

【843】什么是中断向量?中断向量表的作用是什么?

答案:为了提高响应中断的速度,通常把所有中断处理程序的入口地址(或称为中断向

量)汇集在中断向量表中,当 CPU 响应中断时,根据中断源的中断类型号,直接从中断向量

表中得到相应的入口地址,并从该地址开始执行中断处理程序。

【844】中断向量表一般安排在存储器的什么位置?

答案:存储器最低的 1K 字节,地址从 00000~03FFH存放中断向量。中断向量表中的 256

项中断向量对应 256 种中断类型,每项占用 4 个字节,其中两个字节存放中断处理程序的段

地址(16 位),另两个字节存放偏移地址(16 位)。

【845】什么是中断类型?

答案:80x86中断系统能处理 256 种中断,每种中断都安排一个编号,称之为中断类型。

256 种中断类型号排列为 00~0FFH。

【846】在某子程序的开始处要保护 AX,BX,CX,DX4 个寄存器信息,在子程序结束时要

恢复这 4 个寄存器信息。例如:

PUSH AX \

PUSH BX \ 保护现场

PUSH CX /

PUSH DX /

Page 185: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·181·

}恢复现场

试写出恢复现场时的指令序列。

答案:POP DX;POP CX;POP BX;POP AX

【847】图中所示是主程序在执行过程中的中断请求情况,试分析主程序以及各中断子程

序完成的时间顺序。

答案:首先,CPU 响应优先级高的 IR2,转去执行 IR2 的中断处理程序。进入 IR2 处理

程序后,IF 被置 1。当 IR1 的中断请求到达后,因 IR1 的优先级高于 IR2,CPU 就立即中断

IR2 的程序,转去执行 IR1 的处理程序。在 IR1 处理程序中,由指令发出了 EOI 命令,结束

了 IR1 的中断请求。返回 IR2 处理程序后,同样由于发出了 EOI 命令清除了 IR2 的中断请求,

所以在较低级的中断请求 IR4 到达后,即转向处理 IR4 的中断请求,EOI 命令结束了 IR4 的

中断请求,IR4 执行完后,IR2 继续执行直到返回主程序。

【848】某外设能否得到 CPU 的中断服务取决于什么控制条件?

答案:从外设发出中断请求到 CPU响应中断,有两个控制条件是起决定性作用的:

(1)该外设的中断请求是否被屏蔽,这个条件由 8259A 的中断屏蔽寄存器(端口地址为

21H)控制;

(2)CPU 是否允许响应中断,这由标志寄存器(FLAG)中的中断允许位 IF控制。但 CPU

不能禁止非屏蔽中断,对于非屏蔽中断 CPU 总会响应。

【849】什么是开中断和关中断?如何控制开中断和关中断?

答案:允许 CPU 响应外设的中断请求叫做开中断,此时 IF=1;不允许 CPU 响应外设的

中断请求叫做关中断,此时 IF=0。有两条指令能控制开、关中断:STI 开中断(IF=1),

CLI 关中断(IF=0)。

【850】为什么产生中断后,要清除 IF 位和 TF 位?

答案:在中断发生时,CPU 自动清除了 IF 位和 TF 位,这样设计的目的是使 CPU 转入中

断处理程序后,不允许再产生新的中断,包括单步执行。如果在执行中断处理程序的过程中,

还允许外部的中断,可通过 STI 指令再把 IF 置为 1。

【851】当多个中断源同时向 CPU 请求中断时,CPU 应如何处理?

答案:各种中断源事先安排有中断优先级,当多个中断源同时申请中断时,CPU 先比较

Page 186: IBM-PC 汇编语言程序设计试题解

·182· IBM-PC 汇编语言程序设计试题解

他们的优先级,然后从优先级高到优先级低的次序来依次处理各个中断源的中断请求。

【852】在中断处理程序中,如何发出 EOI 命令?

答案:EOI 命令即中断结束命令,用两条指令完成: MOV AL,20H 和 EOI位为 1 的命令

码 OUT 20H,AL。命令码送中断命令寄存器(端口地址为 20H)。

【853】中断程序的编写方法是什么?

答案:在主程序中要为中断做如下准备工作:

(1)设置中断向量(使用 INT 21H的 25H 功能);

(2)设置中断设备的屏蔽位(I/O 端口 21H);

(3)开中断(STI)。

中断处理程序的编写步骤:

(1)保存工作寄存器的内容;

(2)如允许中断嵌套,则开中断(STI);

(3)中断处理功能;

(4)关中断(CLI);

(5)送中断结束命令(EOI)给中断命令寄存器(I/O 端口 20H);

(6)恢复工作寄存器内容;

(7)返回被中断的程序(RET)。

【854】什么是中断嵌套?处理中断嵌套时应注意什么?

答案:中断嵌套是指正在运行的中断处理程序又被其他中断源中断的情况。一个正在执

行的中断处理程序,在开中断(IF=1)的情况下,能被优先级高于它的中断源中断,但如果

要被同级或低级的中断源中断,则必须发出 EOI 命令,清除正在执行的中断请求,才能响应

同级或低级的中断。80x86 没有规定中断嵌套的深度(中断程序又被中断的层次),但在实际

使用时,多重的中断嵌套要受到堆栈容量的限制,所以在编写中断程序时,一定要考虑有足

够的堆栈单元来保存多次中断的断点及各寄存器的内容。

【855】系统提供的 INT 1CH 的中断处理程序是怎样的?为什么?

答案:系统提供的 INT 1CH 的中断处理程序中只有一条指令:IRET。实际上这是系统为

用户设置的一个中断类型号,用户可以用自己设计的中断处理代码来代替原 1CH 程序。如果

用户有某种定时周期性的工作需要完成,就可以利用系统定时器的中断间隔(约每秒中断

18.2 次),嵌套调用 1CH的中断处理程序,并用计数的方法控制时间周期。例如,需要 10 秒

钟的周期,则将计数值设置为 182。定时器中断程序每调用一次 INT 1CH,计数值减 1,当计

数值为 0 时,说明已到 10 秒。

【856】BIOS中断调用的基本用途是什么?使用 BIOS 调用的好处是什么?

答案:BIOS是系统提供的基本输入输出例行程序,它包括系统加电自检,引导装入,主

要 I/O 设备的处理程序以及接口控制等功能模块。BIOS 有两个基本用途:一是给不同系列的

Page 187: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·183·

微处理器提供兼容的 I/O 服务,使程序员在编程时不必考虑不同型号机器的具体差别。二是

给程序员提供文件化的,直接对硬件进行操作的子功能,程序员可不必了解硬件操作的具体

细节。所以利用 BIOS 功能编写程序简单方便,可读性好。

【857】DOS 功能调用的用途是什么?与 BIOS 中断调用在使用上有什么差别?

答案:DOS 是 PC 机上最重要的操作系统,它和 BIOS 一样包括有近百个设备管理、目录

管理和文件管理程序,是一个功能齐全、使用方便的中断例行程序的集合。使用 DOS 操作比

使用相应功能的 BIOS 操作更简易,而且对硬件的依赖性更少些。

【858】BIOS和 DOS 中断调用的方法是什么?

答案:BIOS功能与 DOS功能都是通过软件中断调用的。在中断调用前需要把功能号装入

AH 寄存器,把子功能号装入 AL 寄存器,除此而外,通常还需在 CPU 寄存器中提供专门的调

用参数。一般地说,调用 DOS 或 BIOS 功能时,有以下几个基本步骤:

(1)把调用参数装入指定的寄存器中;

(2)如需功能号,把它装入 AH;

(3)如需子功能号,把它装入 AL;

(4)按中断号调用 DOS或 BIOS 中断;

(5)检查返回参数是否正确。

【859】键盘上什么键能产生 ASCII?不能产生 ASCII 的键如何识别?

答案:键盘上的所有按键的识别采用行列扫描法,即根据对行线和列线的扫描结果来确

定闭合键的位置,并通过键盘数据线将闭合键所对应的扫描码(8 位)送往主机。其中字符

数字键给计算机传送一个 ASCII 字符,而扩展功能键产生一个动作,如按下 Home 键能把光标

移到屏幕的左上角,End 键使光标移到屏幕上文本的末尾,按动组合控制键能改变其他键所

产生的字符码。

【860】什么是通码和断码?它们的标志是什么?

答案:按下键时,产生的扫描码称为通码,放开键时产生的扫描码称为断码。若其代码

的最高位为 0,表示通码;若最高位为 1,表示是断码。

【861】如何判断按动了组合控制键?

答案:组合控制键的状态反映在键盘状态字节中,INT 16H 的 AH=2 的功能可以把表示

组合控制键的状态回送到 AL 寄存器。按动某键所对应的位为 1,反之为 0。

【862】DOS 键盘 06 功能是读写控制台,控制台是指什么?

答案:控制台是指主机及其配置的基本输入输出设备,一般是显示器和键盘。INT 21H

的 06 功能,当(DL)=0FFH 时,输入键盘字符;当(DL)=0~0FEH 时,请求输出设备工

作。

Page 188: IBM-PC 汇编语言程序设计试题解

·184· IBM-PC 汇编语言程序设计试题解

【863】DOS 功能 AH=1 和 AH=7、8 都是从键盘输入一个字符,它们有什么不同?

答案:INT 21H 功能 7 和 8 的输入操作与功能 01H相似,不同的是输入字符不回显。使

用功能 7,输入字符不回显,也不进行 Ctrl+C 或 Ctrl+Break 的检查处理。功能 8 不回显

字符,但与 01H 一样,支持 Ctrl+C或 Ctrl+Break 的中断处理。

【864】程序如何获得功能键和数字组合键的字符码?

答案:要接收功能键或数字组合键,程序必须进行两次 DOS 调用,第一次调用回送 00,

第二次调用回送所按键的扫描码。程序如下:

MOV AH,7 ;第一次 DOS键盘调用 INT 21H

CMP AL,0

JE ISEC ;(AL)=0,则是功能键或数字组合键

···

ISEC: MOV AH,7 ;第二次 DOS键盘调用

INT 21H ;(AL)=扫描码

···

【865】使用 21H 中断的功能 A 输入字符串时应注意些什么?

答案:使用 21H 中断的功能 A 输入字符串时,特别要注意缓冲区的定义方法。缓冲区的

第一个字节保存最大字符数,这个最大字符数由用户给出。第二个字节是实际输入字符的个

数,这个数据由功能 A 填入。在这两个字节之后,字符串就按字节存入缓冲区,最后一个字

节是结束字符串的回车符 0DH,因此整个缓冲区的字节空间应定义为最大字符数(包括 Return

在内)加 2。INT 21H 的功能 A 把实际字符数(不包括 Return)填入缓冲区的第二个字节,

并保持 DS : DX 指向缓冲区的第一个字节。所以,取输入的字符串应从指针 DX+2开始。

【866】在文本方式下,显示屏上的字符是如何表示的?

答案:对应显示屏幕上的每个字符,在存储器中由连续的两个字节表示,一个字节保存

ASCII,另一个字节保存字符的属性。

【867】什么是字符的属性?

答案:说明字符显示特性的字节称为字符属性。对单色显示,字符属性定义了字符是否

闪烁,是否加强亮度,是否反相显示等。对彩色显示,属性字节定义了显示字符(前景)和

背景的颜色以及闪烁和亮度等特性。

【868】屏幕上的字符位置和显存地址的关系如何?

答案:屏幕上某一字符位置和显存中的偏移地址的关系可由下列公式表示: 字符偏移

地址=页偏址+((行号×每行字符数)+列号)×2

【869】使用 INT 21H 显示字符串功能要注意些什么?

答案:使用 INT 21H 显示字符串,一定要在显示串之后加上定界符$,因为此功能是用$作

Page 189: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·185·

为标记来计算串的长度的。另外控制码不能出现在字符串中。显示字符串时,如果希望光标

能自动换行,那么可在字符串结束之前加上回车和换行的 ASCII。

【870】用显示字符串功能显示下面定义的字符串有什么问题?

(1)MESS DB 'DISPLAY THE STRING.',CR,LF,'$'

(2)MESS DB 'DISPLAY THE STRING.$',0DH,0AH

答案:(1)字符串中的回车符(CR)和换行符(LF)不能识别,必须在字符串中直接写

出它们的 ASCII 码(用十六进制或十进制表示均可):

MESS DB 'DISPLAY THE STRING.',13,10,'$'

另一种方法是用 EQU 定义出 CR 和 LF 的 ASCII 值,这时可在字符串中直接使用 CR 和 LF。

(2)字符串显示后,光标不能移动到下一行开始,因为回车换行符在定界符“$”

之后,而字符串显示功能把“$”作为显示字符串的结束标记。

【871】用打印机打印出一个字符串应使用什么功能调用?

答案:打印机的 I/O 中断调用没有提供打印字符串的功能,要打印一个字符串可多次调

用 DOS 或 BIOS 打印单字符的功能,字符串的长度作为循环打印字符的计数控制值。

【872】汇编程序的工作过程是怎样的?

答案:汇编程序的主要工作是把源文件转换为目标文件,这个过程需要进行两遍扫视。

第一遍扫视确定了源程序每一条指令的偏移地址,并提供一张符号表(或称标识符表),符号

表把源程序所定义符号的偏移地址都记录下来。在第二遍扫视的过程中,根据符号表、机器

指令表和伪操作表把汇编语言指令翻译成机器语言指令,完成汇编任务。

【873】汇编程序完成翻译任务,需要什么工具?

答案:(1)地址计数器——动态地指向被汇编指令的相对位置的一个指针。在汇编过程

中,地址计数器的内容就是当前正被汇编指令的偏移地址。

(2)符号表——汇编程序第一遍扫视建立的符号表,它记录了用户所定义的符号

的偏移地址。

(3)机器指令表——给出所有指令的助记符及其对应的机器指令代码信息。

(4)伪操作表——给出所有伪操作名及有关信息。

【874】如何解决汇编过程中的“向前引用问题”?

答案:汇编程序遇到向前引用问题时,最大的问题是不能确定某些指令的长度,因此下

一条指令的偏移地址就无法确定。解决的办法是,在编程序时,应先定义数据段,后定义代

码段,以便保证当指令引用到一些变量时,变量的地址、属性已经确定。另外指令中的标号

应注明它的类型属性,以确定目标地址是 8 位、16 位或是 32位的。EQU 语句也应是先定义后

引用。

【875】在程序中什么指令是浮动指令?其在程序清单中的标记是什么?

答案:如果指令的操作数字段涉及到变量或标号,那么由汇编程序确定的指令字中的值

Page 190: IBM-PC 汇编语言程序设计试题解

·186· IBM-PC 汇编语言程序设计试题解

就为浮动值,因为程序在装入存储器时,各段都要在 0 地址的基础上浮动一个值,这项工作

由连接程序完成。汇编程序在浮动指令的二进制代码之后标记 R。

【876】连接程序的主要功能是什么?

答案:(1)再定位功能——确定目标模块中的浮动地址;

(2)构成装入模块——确定各模块中外部符号所对应的地址,并将多个模块连接

起来形成一个可执行的 EXE 文件。

【877】模块之间的连接如何控制?

答案:多个模块连接时,LINK 程序按照 SEGMENT 伪操作提供的组合类型及类别来连接。

例如,PUBLIC 可以把不同模块中的同名段在装入模块中连接而形成一个段;COMMON把不同模

块中的同名段重叠而形成一个段;STACK 把不同模块中的同名段组合而形成一个段;MEMORY

使该段放在装入模块的最高区。

【878】什么是外部符号?什么是局部符号?

答案:在本模块中定义,又在本模块中引用的符号称为局部符号。在某一个模块中定义,

而又在另一个模块中引用的符号称为外部符号。

【879】一个模块如何引用外部符号?

答案:外部符号(包括变量、标号、过程名等)在定义它的模块中必须用 PUBLIC说明;

同时在使用外部符号的模块中必须用 EXTRN 伪操作加以定义。这两个伪操作定义的符号必须

相匹配,连接程序对此要进行检查,如果不匹配,则给出出错信息;如果相匹配,则给出确

定值。

【880】连接程序的工作过程是怎样的?

答案:连接程序需要对目标模块作两遍扫视。第一遍扫视应对所有段分配段地址,并建

立一张外部符号表(外部符号在汇编时是不可能确定其值的,LST 清单中对外部符号记以 E);

这样,第二遍扫视才能把与这些外部符号有关的指令的机器语言值确定下来。连接完成后建

立了装入模块,再由装入程序把该模块装入内存等待执行。

【881】汇编语言和高级语言连接要解决什么问题?

答案:一般说来,有两个连接问题需要解决。

(1)两种语言之间的控制传送问题。汇编语言程序一般作为高级语言的外部过程,由高

级语言通过函数或过程来调用汇编语言程序。

(2)参数传送问题。高级语言和汇编语言程序之间也存在参数传送问题,这些参数一般

用数值或地址的形式来表示,程序必须遵守它们之间的参数传送规程。

【882】C 语言与汇编语言混合编程有哪些方法?

答案:(1)用直接插入法编写混合语言程序:这种方法比较简单,但只适用于需插入的

Page 191: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·187·

汇编语句比较简短的情况。

(2)C 语言程序调用汇编语言过程:C语言程序经编译后产生 .OBJ 文件,汇编语言程序

经汇编后也产生 .OBJ 文件,然后由连接程序把它们连接起来而形成 .EXE可执行文件,执行

时,汇编语言程序作为 C 语言的一个子过程加以调用。

【883】C 语言与汇编语言是如何进行参数传送的?

答案:C 语言通过堆栈把参数传送给汇编语言程序。C 语言在调用汇编过程前,先使参

数入栈。C 语言规定参数入栈的次序是和程序中见到它们的次序相反的,或者说 C 语言按从

右到左的次序使参数入栈。要注意的是 C 语言传送的参数不是数值本身,而是数组的地址。

汇编语言子过程回送给 C 语言程序的参数是通过累加器回送的。如回送参数为 8 位(1 字节)

可用 AL 寄存器;如回送参数为 16 位(2 字节)可用 AX 寄存器;如回送参数为 32 位(4字节)

则可用 DX,AX 寄存器。

【884】什么是模块化程序设计?模块化程序设计的优点是什么?

答案:把一个程序分成具有多个明确任务的程序模块,分别编制、调试后再把它们连接

在一起形成一个完整的程序,这样的程序设计方法称为模块化程序设计。其优点为:

(1)单个程序模块易于编写、调试及修改。

(2)不同模块可以分配给不同的程序员来编写及调试,有利于加快工作进度。

(3)程序的易读性好。

(4)程序的修改可局部化。

(5)频繁使用的任务可以编制成模块存在库里供多个任务使用。

【885】简述在程序设计中,采用子程序结构有哪些优点?

答案:采用子程序结构的优点:

(1)简化了程序设计过程,节省了程序设计的时间。

(2)缩短了程序的长度,节省了程序所占的存储空间。

(3)增加了程序的可读性,便于对程序的修改和调试。

(4)便于程序的模块化,结构化和自顶向下的程序设计。

【886】简述一个完整的子程序结构应包括哪几方面的内容?

答案:一个完整的子程序结构应包括以下几方面的内容:

(1)为使子程序具有一定的通用性,在子程序设计时要建立子程序的说明文件。

(2)在子程序设计时,要注意现场的保护及现场的恢复,要合理地选择主程序与子程序

之间的参数传递。

(3)子程序是以过程的形式表示的,在定义子程序时要说明它的距离属性,以便正确完

成子程序的调用与返回。

【887】调用程序和子程序之间是如何进行参数传递的?参数传递有哪几种主要方式?各

自的特点是什么?

Page 192: IBM-PC 汇编语言程序设计试题解

·188· IBM-PC 汇编语言程序设计试题解

答案:调用程序传递输入参数和子程序传递输出参数的过程实现的就是二者之间的参数

传递,参数传递主要有三种方式:用寄存器传递、用堆栈传递和用存储器传递。寄存器传递

参数主要在 CPU 内部的各个寄存器之间完成,以减少与存储单元之间的交换;寄存器的数目

毕竟有限,利用堆栈传递参数比存储单元传递参数可以节省时间,采用的方法是后压入的先

弹出;利用存储器传递参数可以在较大的空间内有次序地逐一完成。

【888】编写子程序的基本要求是什么?

答案:编写子程序的基本要求是:

(1)子程序必须具有一定的通用性。

(2)注意信息的保存。

(3)正确使用堆栈。

(4)选择适当的方法进行主程序与子程序之间参数的传递。

(5)编写子程序文件。

【889】简述 DOS 系统功能调用的使用方法。

答案:DOS 系统功能调用方法是:

(1)送入口参量给指定寄存器。

(2)将功能号送入 AH 寄存器。

(3)执行中断指令 INT 21H。

【890】简述子程序设计的基本步骤。

答案:子程序设计的基本步骤是:

(1)确定子程序的算法,画出流程图,编写程序。

(2)以 PROC-ENDP 结构定义子程序,用 NEAR 或 FAR 定义调用属性。

(3)确定输入和输出的参数,并根据实际情况选择参数传递的方法。

(4)确定子程序占用寄存器和存储单元的情况,考虑好子程序的保护和恢复。

(5)建立子程序的文档。

【891】已知(CS)=1500H,(IP)=2050H,(SS)=3000H,(SP)=0050H,所在段的段基址

为 4000H,偏移地址为 0350H,执行 CALL FAR PROC指令后,请问:

(1)保存的断点偏移值是多少?

(2)子程序开始执行时的入口地址是多少?

答案:(1)断点偏移值是:1500H:2055H;(2)子程序开始执行时的入口地址是:

4000H:0350H

【892】已知 (CS)=2500H,(IP)=0110H,(SS)=3000H,(SP)=0050H,(30050H)=1234H,

(30052H)=2000H,(30054H)=1100H,执行 RET 2 指令后(段间返回),请问:

(1)堆栈内容被弹出后 SP 的值是多少?

(2)返回原断点的物理地址是多少?

Page 193: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·189·

答案:(1)SP 的值是:0056H;(2)原断点的物理地址是:2000H:1234H

【893】简述什么是循环结构?

答案:循环结构是指重复执行某个公共程序段若干次,直到满足某个条件才结束循环操作。

【894】循环程序由几部分组成?各部分的功能是什么?

答案:循环结构的程序主要由三部分组成:

(1)循环参数置初值部分,它的功能是为循环过程设置初始值。

(2)循环工作部分,它的功能是进行重复的操作并修改循环的参数。

(3)循环控制部分,它的功能是控制循环执行的次数,检测循环是否结束。

【895】设计循环程序时,一般采用哪几个步骤?

答案:设计循环程序时应采用以下几个步骤:

(1)分析问题,确定选取 0 次循环结构,还是非 0 次循环结构。

(2)根据循环变化的规律,确定适合于循环设计的工作部分。

(3)分析并确定参数的每次修改方法。

(4)根据循环程序控制方法的不同来设置循环参数的初值。

【896】简述开关控制法循环体的处理过程。

答案:开关控制法循环体的处理过程主要是:

(1)设置循环的初始化。

(2)设置开关预赋值。

(3)执行公共循环体;

(4)开关转移选择。

(5)执行对应开关部分的循环处理。

(6)进行开关切换。

(7)公共循环部分的参数修改。

【897】简述按正计数法、倒计数法的循环处理过程。

答案:正计数法是将计数器的初值设置为 0,每执行一遍循环体计数器加 1,然后与规

定的循环次数比较,若相等则结束循环,否则继续循环。倒计数法是先将计数器的初值设置

为循环次数,每执行一遍循环体计数器减 1,然后测试是否为 0,若为 0则结束循环,否则继

续循环。

【898】分支程序可分为哪几个功能部分?请用流程图形式表示。

答案:分支程序的主要功能部分是:判定条件和分支程序段。

【899】双分支条件怎样才能产生?多分支条件如何才能形成?

答案:双分支结构是根据条件满足或不满足进行两种处理的分支结构,请见流程图。多

Page 194: IBM-PC 汇编语言程序设计试题解

·190· IBM-PC 汇编语言程序设计试题解

分支结构运用于有多种条件的情况下,根据不同的条件进行不同情况的处理。

【900】各种分支程序判断条件的方法有什么不同?实现分支的方法有什么不同?

答案:双分支结构一般要有“产生条件”,“测试”,“定向”和“标号”四个部分。多分

支结构可采用的方法有转移表方法,地址表方法和逻辑表方法。

【901】编制一个较复杂的大程序的总体设计方法是什么?

答案:(1)把整个工作划分成多个具有独立功能的任务,并画出层次图;

(2)确切地定义每个任务与其他任务之间的通信方式,写出模块说明;

(3)把每个任务写成汇编语言模块,并进行调试;

(4)把各个模块连接在一起,经过联调形成一个完整的程序;

(5)把整个程序和它们的说明合在一起形成文件。

【902】层次图的作用是什么?

答案:层次图是一个方块图,用来表示模块和子模块之间的关系。

【903】如何写模块说明?

答案:模块说明应简要地写出模块的功能、所用基本算法、模块的输入输出以及它们的

数据结构等。这是复杂程序进行总体设计时所必需的。

【904】划分模块的原则是什么?

答案:模块的划分是很灵活的,总的说来,每个模块应该具有独立的功能,例如可以分

成输入任务、输出任务和一个或几个进行处理或计算的子任务等。此外,还应该考虑各个模

块之间的耦合关系。模块之间的控制耦合应尽可能简单,应该尽量避免从多个入口点进入模

块或从多个出口点退出。模块之间的数据耦合应最小,这包括数据传送量应当少,或者数据

传送方式应该是规则传送。另外模块的长度应适中。

【905】有序数组和有序链表的插入算法各有何特点?

答案:在有序数组中插入或删除一个元素时,需要移动其他元素的位置。有序链表结构

在插入或删除一个元素时,需要重新建立新的链接关系。

【906】计算机通信有哪两种方式?

答案:计算机通信有并行和串行两种方式。在并行数据传输方式中,8位或 16 位的数据

同时进行发送或接收。在串行通信方式中,通信接口每次由 CPU 得到 8 位或 16 位的数据,然

后一位位地串行传送。

【907】什么情况下中断处理子程序需要结束中断(EOI)?结束中断指令起什么作用?

答案:外部中断源通过中断控制器 8259 产生中断,且 8259 芯片初始化为“需要中断结

束命令”时,中断处理程序之中或在结束之前,应向 8259 芯片发出中断结束命令 EOI(End Of

Page 195: IBM-PC 汇编语言程序设计试题解

第 4 章 简 答 题 ·191·

Interrupt),EOI 能清除当前正在处理的中断请求,以便能够在该处理程序的过程中或结束

之后,8259芯片能再响应同级或低级的中断。

Page 196: IBM-PC 汇编语言程序设计试题解

第 5章 程序填空题

【908】从键盘逐一输入字符,并从显示器输出,当输入到字符'$'时,则停止操作。请

在程序中的括号里填入适当指令使其完整。

@50: MOV AH,1

INT 21H

( (1) )

JZ @100

( (2) )

MOV AH,2

INT 21H

( (3) )

@100: HLT

答案:(1)CMP AL,'$';(2)MOV DL,AL;(3)JMP @50

【909】下列程序结构以过程的形式表示,请在括号里填入适当的指令。

CODE SEGMENT

PROC1 ( (1) )

ASSUME CS:CODE,DS:DATA

BEGIN: PUSH DS

MOV AX,0

PUSH AX

...

处理过程

...

( (2) )

PROC1 ( (3) )

CODE ENDS

END BEGIN

答案:(1)PROC FAR;(2)RET;(3)ENDP

【910】下列程序完成的是在 3 个数中找出最小的数放于 AL 中,请在程序中的括号里填

入适当指令使其完整。

MOV AL,X

MOV BL,Y

MOV CL,Z

Page 197: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·193·

CMP AL,BL

( (1) )

( (2) )

@801: CMP AL,CL

( (3) )

( (4) )

@802: HLT

答案:(1)JLE @801;(2)XCHG AL,BL;(3)JLE @802;(4)XCHG AL,CL

【911】在数组 ARRAY 处存放着 N 个无符号字节数,求数组中前 N 个字节数的总和并保存

在 AX 寄存器中。如果总和值超过 AX 寄存器的容量,则置 AX 寄存器内容不变。请在程序中的

括号里填入适当指令使其完整。

LEA BX,ARRAY

MOV CX,N

XOR AX,AX

@200: MOV DX,AX

( (1) )

ADC AH,0

JNC @100

( (2) )

@100: INC BX

( (3) )

END0: HLT

答案:(1)ADD AL,[BX];(2)MOV AX,DX;(3)LOOP @200

【912】下面的子程序_strrchr 功能是:在给定字符串内查找指定字符最后出现的位置。

请在程序中的括号里填入适当指令使其完整。

.model small

.data

str DB '1234567896',0 ;给定的字符串,以 0 表示字符串的

结束

.code

_main PROC NEAR

MOV AX,@data

MOV DS,AX

XOR AX,AX

MOV AL,'6' ;指定字符

PUSH AX

LEA AX,str ;给定字符串首地址

Page 198: IBM-PC 汇编语言程序设计试题解

·194· IBM-PC 汇编语言程序设计试题解

PUSH AX

CALL NEAR PTR _strrchr

( (1) )

MOV AH,4ch

INT 21h

_main ENDP

_strrchr PROC NEAR

PUSH BP

MOV BP,SP

PUSH SI

MOV BX,( (2) ) ;取字符串首地址

XOR SI,SI

MOV CX,−1 ;CX 为位置指针

JMP SHORT @142

@58: MOV AL,[BX+SI]

CMP AL,( (3) ) ;与指定字符比较

JNE SHORT @114

( (4) )

@114: INC SI

@142: AND AL,AL

( (5) )

MOV AX,CX

INC AX

POP SI

POP BP

RET

_strrchr ENDP

END _main

答案:(1)ADD SP,4;(2)[BP+4];(3)[BP+6];(4)MOV CX,SI;(5)JNE SHORT @58

【913】下列程序完成的是 N!,输入的数据 N 送入 AX 寄存器中,输出结果保存在 BX寄存

器中,请在程序中的括号里填入适当指令使其完整。

MOV AX,N

CALL SUB1

MOV BX,DX

HLT

SUB1 PROC

CMP AL,0

JNZ @100

Page 199: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·195·

MOV DL,1

( (1) )

@100: PUSH AX

DEC AL

( (2) )

POP CX

( (3) )

MOV DX,AX

SUUB1 ENDP

SUB2 PROC

MOV AL,DL

MUL CL

( (4) )

SUB2 ENDP

答案:(1)RET;(2)CALL SUB1;(3)CALL SUB2;(4)RET

【914】下面程序的功能是:数组 A包含 15 个互不相等的整数,数组 B包含 20 个互不相

等的整数,将既在数组 A 中又在数组 B 中出现的整数存放在数组 C 中。请将程序填充完整。

DATA SEGMENT

A DW 15 DUP(?)

B DW 20 DUP(?)

C DW 15 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

MAIN PROC FAR

START: PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV ES,AX

BEGIN: MOV SI,0

MOV BX,0

MOV CX,15

NEXT1: PUSH CX

MOV DI,0

MOV CX,20

MOV AX,( (1) )

Page 200: IBM-PC 汇编语言程序设计试题解

·196· IBM-PC 汇编语言程序设计试题解

NEXT2: CMP B[DI],AX

JNE ( (2) )

MOV C[BX],AX

ADD BX,2

ABCD: ADD DI,2

LOOP ( (3) )

ADD SI,2

( (4) ) CX

LOOP NEXT1

RET

MAIN ENDP

CODE ENDS

END START

答案:(1)A[SI];(2)ABCD;(3)NEXT2;(4)POP

【915】填入正确的过程属性:

CODE1 SEGMENT

......

SUB PROC ( (1) )

......

RET

SUB ENDP

.......

CALL SUB

CODE1 ENDS

CODE2 SEGMENT

......

CALL SUB

......

CODE2 ENDS

分析:在代码段 CODE1 和代码段 CODE2 中都要调用子程序 SUB,所以它的属性应该为远

属性(FAR)。如果只在代码段 CODE1 中调用子程序 SUB,而在代码段 CODE2 中不调用子程序

SUB,则子程序 SUB 的属性可以为近属性(NEAR)。

答案:(1)FAR

【916】下列程序结构以调用 DOS 中断的形式返回系统,请在括号里填入适当的指令。

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

BEGIN: MOV AX,DATA

Page 201: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·197·

MOV DS,AX

...

处理过程

...

( (1) )

( (2) )

CODE ENDS

END BEGIN

答案:(1)MOV AH,4CH;(2)INT 21H

【917】下列程序完成的是将 16 位二进制数转换成 4 位十六进制数的 ASCII 码,请在程

序中的括号里填入适当指令使其完整。

DATA SEGMENT

X DW 1234H

CHAR DB 4 DUP(0)

DATA ENDS

...

LEA DI,CHAR

MOV CH,4

MOV BX,X

@801: MOV CL,4

( (1) )

MOV AL,BL

AND AL,0FH

CMP AL,09H

( (2) )

ADD AL,07H

@802: ADD AL,30H

MOV [DI],AL

INC DI

DEC CH

( (3) )

HLT

答案:(1)ROL BX,CL;(2)JLE @802;(3)JNZ @801

【918】以 ARRAY 为起始地址的字节表中存放着 M个带符号数据,分别找出最大值和最小

值,并分别送入到 AH 和 AL 中。请在程序中的括号里填入适当指令使其完整。

MOV SI,OFFSET ARRAY

XOR AX,AX

Page 202: IBM-PC 汇编语言程序设计试题解

·198· IBM-PC 汇编语言程序设计试题解

MOV CX,M

MOV BH,[SI]

MOV BL,BH

@801: ( (1) )

CMP AL,BH

JLE @802

MOV BH,AL

( (2) )

@802: CMP AL,BL

JGE @803

MOV BL,AL

@803: ( (3) )

MOV AX,BX

HLT

答案:(1)LODSB;(2)JMP @803;(3)LOOP @801

【919】在 VAL数据区中存放有一组无符号数据,该数组中的每个数均是 4位十进制数(组

合的 BCD码),存放在两个字节中,下列程序完成的是每个数据对应位按二进制数相加,结果分

别存放在 X1、X2、X3、X4各字节单元中。请在程序中的括号里填入适当指令使其完整。

DATA SEGMENT

VAL DW 1234H,3456H,6789H

COUNT EQU ($−VAL)/2 X1 DB ?

X2 DB ?

X3 DB ?

X4 DB ?

DATA ENDS

...

LEA SI,VAL

MOV CX,COUNT

@86: MOV DL,0

MOV AL,X1

( (1) )

MOV X1,AL

MOV AL,X2

( (2) )

MOV X2,AL

MOV AL,X3

( (3) )

Page 203: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·199·

MOV X3,AL

MOV AL,X4

( (4) )

MOV X4,AL

ADD SI,2

LOOP @86

HLT

SUB1 PROC

MOV BX,[SI]

( (5) )

MOV CL,DL

ROR BX,CL

( (6) )

AND BX,0FH

ADD AL,BL

ADD DL,4

RET

SUB1 ENDP

答案:(1)CALL SUB1;(2)CALL SUB1;(3)CALL SUB1;(4)CALL SUB1;(5)PUSH CX;

(6)POP CX

【920】现有数据段如下:

DATA SEGMENT

DA1 DB 1,2,3,4,5,6,7,8,9

COUNT EQU $− DA1

DA2 DB 10 DUP(0)

DATA ENDS

将以 DA1 开始的数据内容移动到以 DA2 开始的数据区中,现有程序如下,请在括号里填

入适当的指令。

MOV CX,( (1) )

CLD

MOV SI,( (2) )

MOV DI,( (3) )

( (4) )

HLT

答案:(1)COUNT;(2)OFFSET DA1;(3)OFFSET DA2;(4)REP MOVSB

【921】将两个字节的非压缩型 BCD码转换为 1个字节的压缩型 BCD 码。

DATA SEGMENT

Page 204: IBM-PC 汇编语言程序设计试题解

·200· IBM-PC 汇编语言程序设计试题解

BCD1 DB 01H,02H

BCD2 DB ?

DATA ENDS

...

MOV AL,BCD1

MOV BL,BCD1+1

MOV CX,4

( (1) )

( (2) )

MOV BCD2,AL

HLT

答案:(1)SHL AL,CL;(2)OR AL,BL

【922】在以 ARRAY 为起始地址的存储区域中存放有 100 个字节数据,现将其首、尾颠倒

过来,重新排放这 100个字节数据。请在程序中的括号里填入适当指令使其完整。

MOV CX,32H

LEA SI,ARRAY

MOV DI,SI

( (1) )

@80: MOV AL,[SI]

( (2) )

MOV [SI],AL

( (3) )

DEC DI

LOOP @80

HLT

答案:(1)ADD DI,99;(2)XCHG AL,[DI];(3)INC SI

【923】在以 ARRAY 为起始地址的字存储单元区域中存放着 N个带符号数据,编写一个程

序统计该数据区中正数、负数和零的个数。请在程序中的括号里填入适当指令使其完整。

LEA SI,ARRAY

XOR AX,AX

MOV BX,AX

MOV DX,AX

MOV CX,N

SHR CX,1

@801: MOV AX,[SI]

CMP AX,0

( (1) )

Page 205: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·201·

JNS @803

INC DL

( (2) )

@802: INC BH

JMP @804

@803: INC BL

@804: ( (3) )

( (4) )

HLT

答案:(1)JZ @802;(2)JMP @804;(3)ADD SI,2;(4)LOOP @801

【924】以 STR 为起始地址的存储区中存放若干个大小写字母,下列程序完成的是先将

字母变小写,然后将字母变大写,请在程序中的括号里填入适当指令使其完整。

DATA SEGMENT

STR DB 'ABCHORNRSDTRQWESB','$'

DATA ENDS

LEA SI,STR

CALL SUB1

LEA SI,STR

CALL SUB2

HLT

SUB1 PROC

@101: MOV AL,[SI]

( (1) )

JZ @103

CMP AL,'A'

JB @102

CMP AL,'Z'

JA @102

ADD BYTE PTR[SI],'a'− 'A'

@102: INC SI

JMP @101

@103: ( (2) )

SUB1 ENDP

SUB2 PROC

@201: MOV AL,[SI]

( (3) )

JZ @203

CMP AL,'a'

Page 206: IBM-PC 汇编语言程序设计试题解

·202· IBM-PC 汇编语言程序设计试题解

JB @202

CMP AL,'z'

JA @202

SUB BYTE PTR[SI],'a'− 'A'

@202: INC SI

JMP @201

@203: ( (4) )

SUB2 ENDP

答案:(1)CMP AL,'$';(2)RET;(3)CMP AL,'$';(4)RET

【925】下面程序是查找 STRING 中是否有“A”这个字符,如果有则转向 YES 去执行;没

有则转向 NO去执行。请将程序填充完整:

MOV CX,20 ;假设 STRING 的长度为 20

MOV BX, − 1

MOV AL,'A'

NEXT: ( (1) ) BX

CMP AL,STRING[BX]

( (2) ) NEXT

JNZ ( (3) )

YES: ……

……

JMP ( (4) )

NO: ……

……

EXIT: RET

答案:(1)INC;(2)LOOPNE;(3)NO;(4)EXIT

【926】设 X,Y,R,S,Z均为 16位无符号数据的单元符号地址。按已给的表达式:Z=(X+Y)/

(R− S)有程序如下,请在括号里填入适当的指令。

MOV AX,X

( (1) )

MOV CX,R

SUB CX,S

( (2) )

( (3) )

MOV Z,AX

MOV Z+2,DX

HLT

答案:(1)ADD AX,Y;(2)CWD;(3)DIV CX

Page 207: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·203·

【927】按照数据段的定义,根据 DAY 字节单元中的内容(1~7),从表 WEEK 中查出对应

的星期一到星期日的英文缩写。请在程序中的括号里填入适当指令使其完整。

DATA SEGMENT

WEEK DB 'MON','TUE','WED','THU','FRI','SAT','SUN'

DAY DB 3

WSTR DB 3 DUP(?)

DATA ENDS

...

XOR BX,BX

MOV BL,DAY

( (1) )

MOV AL,BL

SAL BL,1

( (2) )

MOV CX,3

SUB SI,SI

@80: MOV AL,WEEK[BX]

MOV BYTE PTR WSTR[SI],AL

( (3) )

INC SI

( (4) )

HLT

答案:(1)DEC BL;(2)ADD BL,AL;(3)INC BX;(4)LOOP @80

【928】设 ARRAY 为起始地址的字存储区域中存放着 10 个带符号数据,按递减顺序的方

式进行排序。请在程序中的括号里填入适当指令使其完整。

MOV BL,0FFH

@801: CMP BL,0

JZ @804

XOR BL,BL

MOV CX,10

DEC CX

MOV SI,0

@802: ( (1) )

CMP AX,ARRAY[SI+2]

( (2) )

XCHG ARRAY[SI+2],AX

MOV ARRAY[SI],AX

Page 208: IBM-PC 汇编语言程序设计试题解

·204· IBM-PC 汇编语言程序设计试题解

MOV BL,0FFH

@803: ( (3) )

( (4) )

JMP @801

@804: HLT

答案:(1)MOV AX,ARRAY[SI];(2)JGE @803;(3)ADD SI,2;(4)LOOP @802

【929】以 ARRAY 为起始地址的字节区域中有一组无符号数据,请找出其中最大值(送入

MAX 存储单元中)及它所在数组中的位置(送入 POINT 存储单元中),请在程序中的括号里填

入适当指令使其完整。

DATA SEGMENT

ARRAY DB 10,20,30,40,50,60,70,80

COUNT EQU $− ARRAY

MAX DB ?

POINT DB ?

DATA ENDS

...

LEA SI,ARRAY

MOV CX,COUNT

XOR AX,AX

MOV BH,1

MOV BL,0

CALL SUB1

HLT

( (1) )

@100: CMP AL,[SI]

JA @200

MOV AL,[SI]

MOV BL,BH

@200: INC SI

( (2) )

LOOP @100

MOV MAX,AL

MOV POINT,BL

( (3) )

SUB1 ENDP

答案:(1)SUB1 PROC;(2)INC BH;(3)RET

【930】在 ARRAY 数组中有 100 个字节类型的符号数据,找出最小的一个数,保存在 MIN

Page 209: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·205·

中。请在程序中的括号里填入适当指令使其完整。

LEA SI,ARRAY

MOV CX,64H

MOV AL,[SI]

@101: ( (1) )

JLE @102

( (2) )

@102: INC SI

( (3) )

MOV MIN,AL

HLT

答案:(1)CMP AL,[SI];(2)MOV AL,[SI];(3)LOOP @101

【931】下列程序结构以过程的形式表示,请在括号里填入适当的指令。

CODE SEGMENT

PROC1 ( (1) )

ASSUME CS:CODE,DS:DATA,...

BEGIN: PUSH DS

MOV AX,0

PUSH AX

...

处理过程

...

( (2) )

PROC1 ( (3) )

CODE ENDS

END BEGIN

答案:(1)PROC FAR;(2)RET;(3)ENDP

【932】下列程序结构以 RET 的形式返回系统,请在括号里填入适当的指令。

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,...

BEGIN: ( (1) )

XOR AX,AX

( (2) )

...

处理过程

...

Page 210: IBM-PC 汇编语言程序设计试题解

·206· IBM-PC 汇编语言程序设计试题解

RET

CODE ENDS

END BEGIN

答案:(1)PUSH DS;(2)PUSH AX

【933】设 X,Y,R,S,Z 均为 16 位有符号数据的单元符号地址,N为一个立即数。按已给的

表达式:Z=((X− (Y*R+S− N))/Y)有程序如下,请在括号里填入适当的指令。

MOV AX,Y

IMUL R

MOV CX,AX

MOV BX,DX

MOV AX,S

( (1) )

ADD CX,AX

ADC BX,DX

SUB CX,N

( (2) )

MOV AX,X

( (3) )

SUB AX,CX

SBB DX,BX

( (4) )

MOV Z,AX

MOV Z+2,DX

HLT

答案:(1)CWD;(2)SBB BX,0;(3)CWD;(4)IDIV Y

【934】对于符号函数

y=

请在程序中的括号里填入适当指令使其完整。

X DB N

Y DB ?

MOV AL,X

CMP AL,0

( (1) )

MOV Y,1

1 x>0 0 x=0

−1 x<0

Page 211: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·207·

( (2) )

@201: JL @202

MOV Y,0

( (3) )

@202: MOV Y,− 1

@203: HLT

答案:(1)JLE @201;(2)JMP @203;(3)JMP @203

【935】设以 ARRAY 为起始地址的字节区域中存放着 10 个无符号数据,按递增顺序的方

式进行排序。请在程序中的括号里填入适当指令使其完整。

LEA SI,ARRAY

MOV CX,10

@801: MOV BL,0

XOR AX,AX

CLD

@802: ( (1) )

CMP AL,[SI]

( (2) )

XCHG AL,[SI]

MOV [SI− 1],AL

INC BL

@803: ( (3) )

CMP BL,0

( (4) )

HLT

答案:(1)LODSB;(2)JBE @803;(3)LOOP @802;(4)JNZ @801

【936】下列程序完成的是将 2 位 BCD 码转换成 ASCII 码,请在程序中的括号里填入适当

指令使其完整。

DATA SEGMENT

VAR1 DB 45H

VAR2 DB ?,?

DATA ENDS

...

MOV AL,VAR1

MOV BL,AL

MOV CX,4

CALL A12

( (1) )

Page 212: IBM-PC 汇编语言程序设计试题解

·208· IBM-PC 汇编语言程序设计试题解

( (2) )

HLT

A12 PROC

( (3) )

ADD BL,30H

( (4) )

ADD AL,30H

RET

A12 ENDP

答案:(1)MOV VAR2,AL;(2)MOV VAR2+1,BL;(3)AND BL,0FH;(4)SHR AL,CL

【937】下面的程序通过子程序调用,将数组 ARRAY的 COUNT个元素求和,并将结果送入

SUM 单元,分析这段程序后,补充完整。

SUM DW ?

ARRAY DW 200 DUP(?)

COUNT DW 200

MOV BX,OFFSET SUM

PUSH BX

MOV BX,OFFSET ARRAY

PUSH BX

MOV BX,OFFSET COUNT

PUSH BX

CALL SUMPRO

SUMPRO PROC NEAR

PUSH AX

PUSH BX

PUSH SI

PUSH DI

PUSH BP

MOV BP,SP

MOV SI,[BP+( (1) )] ;得到 ARRAY的地址

MOV DI,[BP+( (2) )] ;得到 COUNT的地址

MOV CX,[DI]

MOV DI,[BP+( (3) )] ;得到 SUM 的地址

XOR AX,AX

NEXT:

Page 213: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·209·

ADD AX,[SI]

LOOP NEXT

MOV [( (4) )],AX ;送求和结果

POP ( (5) )

POP DI

POP SI

POP ( (6) )

POP AX

RET ( (7) )

SUMPRO ENDP

请填出用堆栈传送参数地址时,堆栈最满时的状态:

答案:

(1)14;(2)12;(3)16;(4)DI;(5)BP;(6)BX;(7)2*3

BP

DI

SI

BX

AX

IP

OFFSET COUNT

OFFSET ARRAY

OFFSET SUM

【938】在 ADDR 单元中存放着数 Y,下面的程序把 Y中 1 的个数存入 COUNT单元中,请在

括号里填入必需的内容。

DATASEG SEGMENT

ADDR DW Y

COUNT DW ?

DATASEG ENDS

Page 214: IBM-PC 汇编语言程序设计试题解

·210· IBM-PC 汇编语言程序设计试题解

CODESEG SEGMENT

ASSUME CS:CODESEG,DS:DATASEG

START: PUSH DS

MOV AX,DATASEG

MOV DS,AX

XOR CX,CX

MOV BX,OFFSET ADDR

MOV AX,[BX]

@100: TEST AX,0FFFFH

JZ ( (1) )

( (2) ) SHIFT

INC CX

SHIFT: SHL AX,1

JMP @100

EXIT: MOV ( (3) ),CX

MOV AX,4C00H

INT 21H

CODESEG ENDS

END START

答案:(1) EXIT;(2) JNS;(3) COUNT

【939】按已给的表达式(DX)=BCD1+BCD2-BCD3 进行计算,完成非压缩型 BCD 码的加

减运算,并将结果送入 DX 寄存器中。现有程序如下,请在括号里填入适当的指令。

MOV AL,BCD1

ADD AL,BCD2

( (1) )

MOV DL,AL

MOV AL,BCD1+1

ADC AL,BCD2+1

AAA

( (2) )

SUB AL,BCD3

AAS

XCHG AL,DL

SBB AL,BCD3+1

( (3) )

MOV DH,AL

HLT

答案:(1)AAA;(2)XCHG AL,DL;(3)AAS

Page 215: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·211·

【940】现给定两个子程序 SUB1 和 SUB2,执行 2 次 SUB1 后执行 1 次 SUB2,接着执行 1

次 SUB1 和 2次 SUB2,如此循环 10 次。请在程序中的括号里填入适当指令使其完整。

MOV BX,0AH

@301: MOV CX,06H

MOV AL,0D0H

@302: ROL AL,1

( (1) )

CALL SUB1

( (2) )

@303: CALL SUB2

@304: DEC CX

JNZ @302

( (3) )

JNZ @301

HLT

答案:(1)JNC @303;(2)JMP @304;(3)DEC BL

【941】下列程序完成的是两个无符号数的相乘,但采用重复相加的方法实现,请在程序

中的括号里填入适当指令使其完整。

DATA SEGMENT

D1 DB 5AH

D2 DB 26H

D3 DW ?

DATA ENDS

...

MOV BL,D1

MOV CL,D2

CMP CL,BL

( (1) )

XCHG CL,BL

@801: XOR AX,AX

MOV CH,0

@802: ( (2) )

ADC AH,0

( (3) )

MOV D3,AX

HLT

答案:(1)JBE @801;(2)ADD AL,BL;(3)LOOP @802

Page 216: IBM-PC 汇编语言程序设计试题解

·212· IBM-PC 汇编语言程序设计试题解

【942】下列程序完成的是将两个数字的 ASCII码转换成一字节两位的 BCD 码,请在程序

中的括号里填入适当指令使其完整。

DATA SEGMENT

VAR1 DB '3','6'

VAR2 DB ?

DATA ENDS

...

MOV AL,VAR1

MOV BL,VAR1+1

MOV CX,4

CALL SUB1

( (1) )

HLT

SUB1 PROC

SUB AL,30H

SUB BL,30H

( (2) )

( (3) )

RET

SUB1 ENDP

答案:(1)MOV VAR2,AL;(2)SHL AL,CL;(3)OR AL,BL

【943】下面的程序把从键盘读入的 0~FFFFH 的十六进制正数(字母为大写)转换为十

进制数,并在屏幕上显示出来,请在括号里填入必需的内容。

DISPLAY EQU 2H

KEY_IN EQU 1H

DOSCALL EQU 21H

HEXIDEC SEGMENT

MAIN PROC FAR

ASSUME CS:HEXIDEC

START: PUSH DS

SUB AX,AX

PUSH AX

CALL HEXIBIN

CALL CRLF

CALL BINIDEC

CALL CRLF

RET

Page 217: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·213·

MAIN ENDP

HEXIBIN PROC NEAR

MOV BX,0

NEWCHAR: MOV AH,KEY_IN

INT DOSCALL

SUB AL,30H

JL EXIT

CMP AL,( (1) )

JL ADD_TO

SUB AL,( (2) )

CMP AL,0AH

JL EXIT

CMP AL,10H

JGE EXIT

ADD_TO: MOV CL,( (3) )

SHL BX,CL

MOV AH,0

ADD BX,AX

JMP NEWCHAR

EXIT: RET

HEXIBIN ENDP

BINIDEC PROC NEAR

MOV CX,10000D

CALL DEC_DIV

MOV CX,1000D

CALL DEC_DIV

MOV CX,100D

CALL DEC_DIV

MOV CX,10D

CALL DEC_DIV

MOV CX,1

CALL DEC_DIV

RET

BINIDEC ENDP

DEC_DIV PROC NEAR

MOV AX,BX

Page 218: IBM-PC 汇编语言程序设计试题解

·214· IBM-PC 汇编语言程序设计试题解

MOV DX,( (4) )

DIV CX

MOV BX,DX

MOV ( (5) ),AL

ADD DL,30H

MOV AH,DISPLAY

INT DOSCALL

RET

DEC_DIV ENDP

CRLF PROC NEAR

MOV DL,0AH

MOV AH,DISPLAY

INT DOSCALL

MOV DL,0DH

MOV AH,DISPLAY

INT DOSCALL

RET

CRLF ENDP

HEXIDEC ENDS

END START

答案:(1)9;(2)7;(3)4;(4)0;(5)DL

【944】如下程序为一中断驻留程序,请在括号里填入必需的内容。

CODEX SEGMENT PARA

ASSUME CS:CODEX,DS:CODEX

ORG l00H

P1 PROC FAR ;此处为 9AH的中断处理程序

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

PUSH DI

PUSH BP

PUSH DS

PUSH ES

( (1) )

Page 219: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·215·

;此处为中断号为 9AH 的中断处理程序的处理部分

( (2) )

POP ES

POP DS

POP BP

POP DI

POP SI

POP DX

POP CX

POP BX

POP AX

( (3) )

P1 ENDP

LEN EQU $− 0

P2 PROC NEAR

MOV DX,( (4) )

MOV AX,( (5) )

MOV DS,AX

MOV AX,259AH

INT 21H ;设置 9AH 中断向量

MOV AX,3100H

MOV DX,( (6) )

INT 21H ;终止并驻留程序

P2 ENDP

CODEX ENDS

END ( (7) )

答案:(1)STI;(2)CLI;(3)IRET;(4)OFFSET P1;(5)CS;(6)((LEN+15)/16;

(7)P2

【945】现有数据段如下:

DATA SEGMENT

DA1 DW 789,568,357

DA2 DB 1,2,3

DA3 DB 6 DUP(?)

DATA ENDS

请将 DA1 中的第 2 个数据“568”与 DA2 中的第 2 个数据“2”相加,并将结果送入 DA3

开始的存储单元中。然后再将 DA1中的第 3 个数据“357”与第 DA2 中的第 3 数据“3”相加,

结果送入 DA3 中的第一个结果数据之后,现有程序如下,请在括号里填入适当的指令。

MOV AX,DA1+2

Page 220: IBM-PC 汇编语言程序设计试题解

·216· IBM-PC 汇编语言程序设计试题解

X0R BX,BX

( (1) )

ADD AX,BX

( (2) )

MOV AX,DA1+4

( (3) )

ADD AX,BX

( (4) )

HLT

答案:(1)MOV BL,DA2+1;(2)MOV WORD PTR DA3,AX;(3)MOV BL,DA2+2;(4)MOV WORD

PTR DA3+2,AX

【946】若 X单元中的内容为正,则将其高 4 位屏蔽并送入到 Y 单元中;若 X 单元中的内

容为负,则将其求补再送入到 Y 单元中;否则将 Y单元置为− 1。请在程序中的括号里填入适

当指令使其完整。

MOV AL,X

CMP AL,0

( (1) )

MOV AL,− 1

@801: MOV Y,AL

HLT

@802: JG @803

( (2) )

JMP @801

@803: ( (3) )

JMP @801

答案:(1)JNZ @802;(2)NEG AL;(3)AND AL,0FH

【947】以 STR1 为起始地址的字节存储单元中存放着一个字符串,请统计该字符串中的

每个字符含有“1”的个数,并将结果保存到以 STR2 为起始地址的各字节存储单元中。请在

程序中的括号里填入适当指令使其完整。

STR1 DB 'ABCDEFRHEJMTYY'

NUM EQU $− STR1

ADR2 DB NUM DUP(0)

LEA SI,STR1

LEA DI,STR2

MOV CX,NUM

@801: MOV AL,[SI]

MOV DL,0

Page 221: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·217·

@802: CMP AL,0

( (1) )

SHR AL,1

JNC @803

( (2) )

@803: JMP @802

@804: MOV [DI],DL

INC SI

INC DI

( (3) )

HLT

答案:(1)JZ @804;(2)INC DL;(3)LOOP @801

【948】现有数据段如下:

DATA SEGMENT

STR1 DB '111111','$'

STR2 DB '222222','$'

DATA ENDS

如果从键盘输入一个字符“2”,则在屏幕上显示输出 STR2 中的字符串;如果输入其他的

字符,则在屏幕上显示输出 STR1中的字符串。请在程序中的括号里填入适当指令使其完整。

MOV AH,7

INT 21H

CMP AL,'2'

JZ @101

CALL SUB1

JMP @102

@101: CALL SUB2

@102 HLT

SUB1 PROC

( (1) )

MOV AH,09H

INT 21H

( (2) )

SUB1 ENDP

SUB2 PROC

( (3) )

MOV AH,09H

INT 21H

( (4) )

Page 222: IBM-PC 汇编语言程序设计试题解

·218· IBM-PC 汇编语言程序设计试题解

SUB2 ENDP

答案:(1)MOV DX,OFFSET STR1 或 LEA DX,STR1;(2)RET;(3)MOV DX,OFFSET STR2

或 LEA DX,STR2;(4)RET

【949】以下程序是比较两个 ASCII字符串(均为大写)按字典顺序排列的大小(AX=1,0

表示结果),请在括号里填入必需的内容。

CMPSTRS PROC NEAR

PUSH ES

PUSH DI

PUSH SI

PUSH DS

POP ES

MOV SI,( (1) ) ;[SI]=A 串首地址(STRINGA)

MOV DI,( (2) ) ;[DI]=B 串首地址(STRINGB)

( (3) )

L0: LODSB

CMP AL,( (4) ) ;比较 A[I]及 B[I]

JZ L1

JA L2

MOV AX,0

( (5) )

L1: CMP AL,0

JZ L2

( (6) )

JMP SHORT L0

L2: MOV AX,1

L3: POP SI

POP DI

POP ES

RET

CMPSTRS ENDP

答案:(1)OFFSET STRINGA;(2)OFFSET STRINGB;(3)CLD;(4)[DI];

(5)JMP L3;(6)INC DI

【950】以下程序是将 ARY 指向的 100个字数组的内容相加,结果存于 SUM 字单元。要求

堆栈操作时其数据区在 SSEG 段内。请在括号里填入必需的内容。

DATA SEGMENT

ARY DW 100 DUP(?)

COUNT DW 100

Page 223: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·219·

SUM DW ?

DATA ENDS

SSEG SEGMENT

SSTT DW 100 DUP (?)

SSEG ENDS

DODE1 SEGMENT

MAIN PROC FAR

ASSUME CS:CODE1,DS:DATA,SS:SSEG

START: MOV AX,SSEG

MOV SS,AX

MOV SP,OFFSET SSTT ;设置堆栈

( (1) )

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET ARY

PUSH BX

MOV BX,OFFSET COUNT

PUSH BX

MOV BX,OFFSET SUM

PUSH BX

CALL FAR PTR PROADD

RET

CODE1 ENDS

CODE2 SEGMENT

ASSUME CS:CODE2

SSTRC STRUC

SAVE_BP DW ?

SAVE_CS_IP DW 2 DUP (?)

PAR3_ADDR DW ?

PAR2_ADDR DW ?

PAR1_ADDR DW ?

SSTRC ENDS

PROADD PROC FAR

PUSH BP

MOV BP,SP

Page 224: IBM-PC 汇编语言程序设计试题解

·220· IBM-PC 汇编语言程序设计试题解

PUSH AX

PUSH CX

PUSH SI

PUSH DI

MOV SI,[BP].PAR1_ADDR

MOV DI,[BP].PAR2_ADDR

MOV CX,[DI]

( (2) )

( (3) )

NEXT: ADD AX,[SI]

ADD SI,2

LOOP NEXT

MOV [DI],AX

POP DI

POP SI

( (4) )

POP AX

POP BP

RET 6

PROADD ENDP

END START

答案:(1)ADD SP,200;(2)MOV DI,[BP].PAR3_ADDR;(3)XOR AX,AX;(4)POP CX

【951】以下程序完成对首地址为 A的 N 字正整数组从小到大排序,填上缺少的指令。

DATA SEGMENT

A DW N DUP (?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: ( (1) )

( (2) )

MOV CX,N

( (3) )

LOOP1: MOV DI,CX

MOV BX,0

LOOP2: MOV AX,A[BX]

CMP AX,A[BX+2]

( (4) )

XCHG AX,A[BX+2]

Page 225: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·221·

MOV A[BX],AX

CONTINUE: ADD BX,2

LOOP LOOP2

( (5) )

LOOP LOOP1

MOV AH,4CH

INT 21H

CODE ENDS

END START

答案:(1)MOV AX,DATA;(2)MOV DS,AX;(3)DEC CX;(4)JL CONTINUE;

(5)MOV CX,DI

【952】现有数据段如下:

DATA SEGMENT

DA1 DB 1,2,3,4,5,6,7,8,9

DA2 DB ?

DATA ENDS

下面程序段将 DA1 开始的数据内容做逆序排列,现有程序如下,请在括号里填入适当的

指令。

LEA DI,DA1 ;DI 指向第 1个字符

LEA SI,DA2

DEC SI ;SI 指向最后一个有效字符

CLD

PUSH DS

( (1) )

JMP @122 ;先去判断循环条件

@121: MOV AL,[DI]

( (2) )

STOSB ;ES:[DI]=AL,DI++

( (3) )

@122: CMP DI,SI ;判断是否结束循环

( (4) )

HLT

答案:(1)POP ES;(2)XCHG [SI],AL;(3)DEC SI;(4)JB @121

【953】将以 ADR1 为偏移地址的源数据区域的内容按字节方式移送到以 ADR2 为偏移地址

的目标区域中,字节数为 N,设 DS,ES 均已经正确设置。请在程序中的括号里填入适当指令

使其完整。

LEA SI,ADDR1

Page 226: IBM-PC 汇编语言程序设计试题解

·222· IBM-PC 汇编语言程序设计试题解

LEA DI,ADDR2

MOV CX,N

CMP DI,SI

( (1) )

STD

ADD SI,CX

( (2) )

ADD DI,CX

DEC DI

( (3) )

@801: CLD

@802: ( (4) )

HLT

答案:(1)JB @801;(2)DEC SI;(3)JMP @802;(4)REP MOVSB

【954】以 ARRAY 为起始地址的字节区域中有若干个带符号数,如果数据大于等于 0,则

将高 4 位屏蔽;如果数据小于 0,则将该数据求补,并将结果依次存入到以 RESULT为起始地

址的存储单元中。请在程序中的括号里填入适当指令使其完整。

DATA SEGMENT

ARRAY DB 01H,02H,81H,82H,...

COUNT EQU $− ARRAY

RESULT DB COUNT DUP(?)

DATA ENDS

...

LEA SI,ARRAY

LEA DI,RESULT

MOV CX,COUNT

@101: MOV AL,[SI]

CMP AL,0

JGE @102

( (1) )

LOOP @101

HLT

@102: ( (2) )

LOOP @101

HLT

SUB1 PROC

( (3) )

( (4) )

Page 227: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·223·

INC SI

INC DI

RET

SUB1 ENDP

SUB2 PROC

( (5) )

( (6) )

INC SI

INC DI

RET

SUB2 ENDP

答案:(1)CALL SUB1;(2)CALL SUB2;(3)NEG AL;(4)MOV [DI],AL;

(5)AND AL,0FH;(6)MOV [DI],AL

【955】设 AX,BX 中的数一个为正数,一个为负数,下面程序段完成将正数送到 PLW 单

元中存放,请将程序中所缺指令语句补上。

TEST AX,8000H

( (1) )

MOV PLW,BX

JMP DONE

K1: ( (2) )

DONE:

答案:(1)JE K1;(2)MOV PLW,AX

【956】现有下列数据段:

DATA SEGMENT

STR1 DB 'ABCDEFGHIJKL'

COUNT EQU $− STR1

BUF DB COUNT DUP(0)

DATA ENDS

下面程序段是实现把 STR1 中所有字符逆向传送到 BUF 缓冲区(即 STR1 中第一个字符送

到 BUF 的最后一个单元,STR1 中最后一字符送到 BUF 的第一个单元)。试把程序中所空缺的

指令填上。

MOV SI,OFFSET BUF− 1

MOV DI,OFFSET BUF

MOV CX,COUNT

( (1) )

@100: MOVSB

( (2) )

Page 228: IBM-PC 汇编语言程序设计试题解

·224· IBM-PC 汇编语言程序设计试题解

LOOP @100

答案:(1)CLD;(2)SUB SI,2

【957】在 AL 寄存器中存放着一个有符号数 M1,对该数值逐次减 1,当它小于另一个有

符号数 M2 时再重新恢复此项操作。此程序段经常用于软件延时。请在程序中的括号里填入适

当指令使其完整。

MOV CX,5

@101: MOV AL,M1

@102: ( (1) )

CMP AL,M2

( (2) )

DEC CX

( (3) )

HLT

答案:(1)DEC AL;(2)JGE @102;(3)JNZ @101

【958】在以 STR1 为起始地址的字节存储区中存有若干个字符(NUM),统计非数字字符

的个数,并将结果回送到 STR2 单元中,请在程序中的括号里填入适当指令使其完整。

XOR BX,BX

LEA SI,STR1

MOV CX,NUM

XOR AX,AX

@801: MOV AL,[SI]

CMP AL,30H

( (1) )

CMP AL,39H

( (2) )

JMP @803

@802: INC BL

@803: ( (3) )

( (4) )

MOV STR2,BL

HLT

答案:(1)JB @802;(2)JA @802;(3)INC SI;(4)LOOP @801

【959】在 STR字符串中查找 CHAR中指定的字符,若查找到,则将该字符所在位置送入 POINT

中;若未查找到,则将 0送入 POINT中。请在程序中的括号里填入适当指令使其完整。

DATA SEGMENT

STR DB '8086 ASSEMBLER'

Page 229: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·225·

COUNT EQU $− STR

CHAR DB 'M'

POINT DB ?

DATA ENDS

...

LEA DI,STR

MOV CX,COUNT

MOV AL,CHAR

( (1) )

HLT

A11 PROC

CLD

XOR BX,BX

REPNZ SCASB

JNZ @100

( (2) )

MOV BX,DI

@100: MOV POINT,BL

( (3) )

A11 ENDP

答案:(1)CALL A11;(2)SUB DI,OFFSET STR;(3)RET

【960】从键盘输入一个字符。要求第一个键入的字符必须是'$',若不是则退出;若是

则开始接收键入的字符并顺序存放在首地址为 BUFFER 的缓冲区中,直到接收到空格符时退出

程序(空格符及'$'不存入)。

提示:

DATA SEGMENT

BUFFER DW 80 DUP(?)

FLAD DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

LEA BX,( (1) )

MOV FLAG,0

NEXT: MOV AH,01 ;输入一个字符

INT 21H

TEST FLAG,01H

Page 230: IBM-PC 汇编语言程序设计试题解

·226· IBM-PC 汇编语言程序设计试题解

( (2) ) FOLLOW

CMP AL,'$'

JNZ ( (3) )

MOV FLAG,1

JMP NEXT

FOLLOW: CMP AL,20H

JZ EXTT

MOV [BX],AL

( (4) )

JMP NEXT

EXTT: MOV AH,4CH

INT 21H

CODE ENDS

END START

答案:(1)BUFFER;(2)JNE;(3)EXIT;(4)INC BX

【961】以下程序完成对首地址为 A 的 N 字带符号数组从大到小排序,填上缺少的指令。

DATA SEGMENT

A DW N DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,( (1) )

START: MOV AX,DATA

MOV DS,AX

MOV CX,N

( (2) )

LOOP1: MOV DI,CX

MOV BX,0

LOOP2: MOV AX,A[BX]

CMP AX,A[BX+2]

( (3) )

XCHG AX,A[BX+2]

MOV A[BX],AX

CONTINUE: ADD BX,2

LOOP LOOP2

( (4) )

LOOP LOOP1

MOV AH,4CH

INT 21H

Page 231: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·227·

CODE ENDS

END START

答案:(1)DS:DATA;(2)DEC CX;(3)JGE CONTINUE;(4)MOV CX,DI

【962】DA1 数据区中有 50个字节数据,下面程序段将每个数据的低 4 位变反,高 4位不

变,并依次存入 DA2 数据区中。请将程序补充完整。

MOV CX,50

LEA SI,DA1

LEA DI,DA2

K1: MOV AL,[SI]

( (1) )

MOV [DI],AL

INC SI

INC DI

DEC CX

( (2) )

答案:(1)XOR AL,00001111B;(2)JNE K1

【963】下面程序段完成将存储单元 A1 中 1 个压缩型 BCD 码拆成 2 个非压缩型 BCD 码,

高位 BCD 码存放在 A3 单元,低位 BCD 码存放在 A2 单元,再分别转换为对应的 ASCII码。请

将程序补充完整。

MOV AL,A1

MOV CL,4

( (1) )

OR AL,30H

MOV A3,AL

MOV AL,A1

( (2) )

OR AL,30H

MOV A2,AL

答案:(1) SHR AL,CL;(2) AND AL,0FH

【964】以 ARRAY 为起始地址的字存储单元中存放有 N 个无符号数据,请找出最大值和最

小值,并分别送入 AX 和 DX 中。请在程序中的括号里填入适当指令使其完整。

MOV SI,ARRAY

MOV CX,N

MOV BX,[SI]

MOV DX,BX

CLD

Page 232: IBM-PC 汇编语言程序设计试题解

·228· IBM-PC 汇编语言程序设计试题解

@801: ( (1) )

CMP AX,BX

( (2) )

MOV BX,AX

( (3) )

@802: CMP AX,DX

JAE @803

MOV DX,AX

@803: DEC CX

( (4) )

MOV AX,BX

HLT

答案:(1)LODSW;(2)JBE @802;(3)JMP @803;(4)JNZ @801

【965】求以 N1 和 N2 两个数组对应的数据之和(数组中的数据个数为 M),并将结果存入

到新数组 N3存储单元中。此项计算一直进行到两数之和为 0或数组结束,并将新数组的长度

存放在 N4 单元中。请在程序中的括号里填入适当指令使其完整。

MOV CX,M

MOV BX, − 1

@801: ( (1) )

MOV AL,N1[BX]

ADD AL,N2[BX]

MOV N3[BX],AL

( (2) )

JZ @802

( (3) )

@802: MOV N4,BL

HLT

答案:(1)INC BX;(2)LOOPNZ @801;(3)INC BL

【966】用主程序调用子程序的结构形式,完成 ARRAY 数组的 N 个数据累加和,请在程序

中的括号里填入适当指令使其完整。

MAIN PROC FAR

PUSH DS

MOV AX,0

PUSH AX

CALL FUN

( (1) )

MAIN ENDP

Page 233: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·229·

FUN PROC

MOV AX,DATA

MOV DS,AX

LEA SI,ARRAY

MOV CX,N

@100: ADD AL,[SI]

ADC AH,0

INC SI

LOOP @100

( (2) )

( (3) )

HLT

答案:(1)RET;(2)RET;(3)FUN ENDP

【967】将 16位二进制数转换成 4 位十六进制数的 ASCII 码(字母用小写形式)。请在程

序中的括号里填入适当指令使其完整。

LEA SI,BINS

LEA DI,HEXS

MOV CH,4

@101: MOV CL,4

( (1) )

MOV AL,BL

AND AL,0FH

CMP AL,09H

JLE @102

( (2) )

JMP @103

@102: ( (3) )

@103: MOV [DI],AL

INC DI

DEC CH

( (4) )

HLT

答案:(1)ROL BX,CL;(2)ADD AL,'a'− 10;(3)ADD AL,30H;(4)JNZ @101

【968】以下为计算 N!的程序。变量 NUM 值的阶乘的结果放在变量 FNUM 中。

① 解释语句或语句段(1)、(2)的含义与作用。

② 在(3)、(4)、(5)处填上必要的语句。

DATA SEGMENT

Page 234: IBM-PC 汇编语言程序设计试题解

·230· IBM-PC 汇编语言程序设计试题解

NUM DB 5

FNUM DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA ;( (1) )

START PROC FAR

BEGIN: PUSH DS

MOV AX,0

PUSH AX ;( (2) )

MOV AX,DATA

MOV DS,AX

MOV AH,0

MOV AL,NUM

PUSH AX

CALL FACTOR

MOV FNUM,AX

RET

START ENDP

FACTOR PROC NEAR

PUSH BP

MOV BP,SP

PUSH SI

PUSH DI

MOV SI,[BP+4]

OR SI,SI

JE @86

CMP SI,1

JNE @114

@86: ( (3) )

JMP @142

@114: MOV AX,SI

( (4) )

PUSH AX

( (5) )

IMUL SI

MOV DI,AX

@142: MOV AX,DI

POP DI

POP SI

Page 235: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·231·

POP BP

RET 2

FACTOR ENDP

答案:

(1)说明 DATA 段为数据段,用 DS 段寄存器寻址,CODE 为代码段,用段寄存器 CS;

(2)保存返回 DOS 的数据,以便程序运行结束后,能用 RET 指令返回 DOS;

(3)MOV DI,1;当(AX)=0 时,恢复 AX,直接计算 1 的阶乘,即:(AX)=1!=1;

(4)DEC AX或 SUB AX,l,将 N 阶阶乘转化为(N-1)阶阶乘;

(5)CALL FACTOR;递归调用 FACTOR,计算(N-l)

【969】有 2 个 16 位的压缩型 BCD 数据进行求和运算,以 ADDR1 和 ADDR2 开始的存储区

中存放着被加数和加数,分别占用 8 个连续字节单元,结果存放到以 SUM 开始的连续的 8 个

字节单元中。请在程序中的括号里填入适当指令使其完整。

MOV CX,8

MOV SI,0

XOR AX,AX

@80: MOV AL,ADDR1[SI]

ADC AL,ADDR2[SI]

( (1) )

MOV SUM[SI],AL

( (2) )

DEC CX

( (3) )

HLT

答案:(1)DAA;(2)INC SI;(3)JNZ @80

【970】下列程序是一个多精度数的求补程序,请在程序中的括号里填入适当指令使其完整。

DATA SEGMENT

N DB 12H,34H,56H,78H,90H

NUM EQU $− N

DATA ENDS

LEA BX,N

MOV CX,NUM

PUSH CX

@1001: ( (1) )

INC BX

( (2) )

POP CX

LEA BX,N

Page 236: IBM-PC 汇编语言程序设计试题解

·232· IBM-PC 汇编语言程序设计试题解

STC

@1002: ADC BYTE PTR[BX],0

INC BX

( (3) )

HLT

答案:(1)NOT BYTE PTR[BX];(2)LOOP @1001;(3)LOOP @1002

【971】利用乘法指令实现两个无符号 32 位数相乘(N3=N1*N2),请填写适当的指令。

MOV AX,N2+2

( (1) )

MOV N3+6,AX

MOV N3+4,DX

MOV AX,N2+2

( (2) )

ADD N3+4,AX

ADC N3+2,DX

ADC N3,0

MOV AX,N2

( (3) )

ADD N3+4,AX

ADC N3+2,DX

ADC N3,0

MOV AX,N2

( (4) )

ADD N3+2,AX

ADC N3,DX

HLT

答案:(1)MUL N1+2;(2)MUL N1;(3)MUL N1+2;(4)MUL N1

【972】利用除法指令实现 2 个无符号 64 位数除以 16 位数(N1/N2,商 N3,余 N4),请

填写适当的指令。

DSEG SEGMENT

N1 DW 1234H,5678H,90ABH,0CDEFH

N2 DW 9876H

N3 DW 4 DUP(0)

N4 DW 0

DSEG ENDS

...

XOR DX,DX

Page 237: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·233·

MOV CX,( (1) )

MOV AX,( (2) )

DIV CX

MOV N3+6,AX

MOV AX,N1+4

DIV CX

MOV N3+4,AX

MOV AX,N1[2]

DIV CX

MOV N3[2],AX

MOV AX,N1

DIV CX

MOV N3,( (3) )

MOV N4,( (4) )

HLT

答案:(1)N2;(2)N1[6];(3)AX;(4)DX

【973】字节变量 A 与 B中分别存放 2 个数据,若 2 个数都是偶数,则保留原数据在 A 和

B 中。若 2 个数都是奇数,则分别加 1 再送入到 A和 B 中。若 1 个奇数、1个偶数,则将奇数

送入 A 中,偶数送入 B中。请在程序中的括号里填入适当指令使其完整。

MOV AL,A

MOV BL,B

TEST AL,1

( (1) )

TEST BL,1

( (2) )

INC A

INC B

JMP DON2

DON1: TEST BL,1

( (3) )

( (4) )

DON2: MOV A,AL

MOV B,BL

HLT

答案:(1)JZ DON1;(2)JZ DON2;(3)JZ DON2;(4)XCHG AL,BL

【974】对以 ADDR 为起始地址的 2 个字节单元中,统计其中值为 1 的位的个数。请在程序

中的括号里填入适当指令使其完整。

Page 238: IBM-PC 汇编语言程序设计试题解

·234· IBM-PC 汇编语言程序设计试题解

LEA BX,ADDR

MOV CX,0

MOV AX,[BX]

@201: AND AX,AX

( (1) )

SHL AX,1

( (2) )

INC CX

@202: ( (3) )

@203: HLT

答案:(1)JZ @203;(2)JNC @202;(3)JMP @201

【975】以 STR 为起始地址的 5 个字节单元中存放着 5 个字母,下述程序可以实现字母大

写与小写的相互转换。请在程序中的括号里填入适当指令使其完整。

MOV BX,OFFSET STR

MOV CX,5

@801: MOV AL,[BX]

MOV AH,20H

AND AL,AH

MOV AL,0DFH

( (1) )

@802: OR [BX],AH ;将 bit5 置 1,使大写变小写

INC BX

( (2) )

JMP @804

@803: AND [BX],AL ;清除 bit5,使小写变大写

INC BX

( (3) )

@804: HLT

答案:(1)JNZ @803;(2)LOOP @801;(3)LOOP @801

【976】下列程序实现的是ΣN!=1!+2!+3!+4!+5!,结果保存在 BX 中。请在程序中

的括号里填入适当指令使其完整。

MOV CX,5

XOR BX,BX

@101: ( (1) )

CALL SUB1

( (2) )

ADD BX,AX

Page 239: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·235·

LOOP @101

SUB1 PROC

MOV AL,1

@102: MUL CL

LOOP @102

( (3) )

SUB1 ENDP

HLT

答案:(1)PUSH CX;(2)POP CX;(3)RET

【977】在 TABLE表中有 10个数据项,每项由 3个字符组成,在 N单元中只要给定一个数,

执行下列程序后就会显示出所对应的字符串。请在程序中的括号里填入适当指令使其完整。

TABLE DB

'MOV','LEA','LDS','LES','ADD','ADC','SUB','SBB','MUL'

N DB 6

MOV AL,N

DEC AL

MOV BL,AL

( (1) )

ADD AL,BL

LEA BX,TABLE

ADD BL,AL

ADC BH,0

MOV CX,3

@100: ( (2) )

MOV AH,2

INT 21H

( (3) )

( (4) )

HLT

答案:(1)SAL AL,1;(2)MOV DL,[BX];(3)INC BX;(4)LOOP @100

【978】下面程序是将键盘输入的数字月份查表后显示出相应英文字母的缩写形式。请在

程序中的括号里填入适当指令使其完整。

DATASG SEGMENT PARA 'DATA'

THREE DB 3

MONIN DB 3,4 DUP(?)

ALFMON DB '???','$'

MONTAB DB

Page 240: IBM-PC 汇编语言程序设计试题解

·236· IBM-PC 汇编语言程序设计试题解

'JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','N

OV','DEC'

DATASG ENDS

CODESG SEGMENT PARA 'CODE'

ASSUME CS:CODESG, DS:DATASG, ES:DATASG

MAIN PROC FAR

( (1) )

SUB AX,AX

( (2) )

MOV AX,DATASG ;POINT TO DATA SEG.

MOV DS,AX

MOV ES,AX

CALL INPUT ;INPUT AND CONVERT

CALL LOCATE ;LOCATE MONTH

CALL DISPLAY ;DISPLAY ALPHA MONTH

RET

MAIN ENDP

;INPUT AND CONVERT ASCII TO BINARY:

INPUT PROC NEAR

PUSH DX

MOV AH,0AH ;INPUT FROM KEYBOARD

LEA DX,MONIN ;ADDRESS OF BUFFER

INT 21H

MOV AH,MONIN+2 ;FETCH NUMERIC MONTH

MOV AL,MONIN+3

( (3) )

CMP AH,00 ;MONTH 01− 09 ?

JZ RETURN ;YES,BYPASS

SUB AH,AH ;NO,CLEAR AH

ADD AL,10 ;CORRECT FOR BINARY

RETURN: POP DX

RET

INPUT ENDP

; LOCATE MONTH IN TABLE

LOCATE PROC NEAR

PUSH SI ;SAVE THE REGISTERS

PUSH DI

PUSH CX

LEA SI,MONTAB

Page 241: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·237·

DEC AL ;CORRECT FOR TABLE

( (4) )

ADD SI,AX

MOV CX,03 ;INIT'ZE 3 CHARS MOVE

( (5) )

LEA DI,ALFMON

REP MOVSB ;MOV 3 CHARS

POP CX ;RESTORE REGISTERS

POP DI

POP SI

RET

LOCATE ENDP

;DISPLAY ALPHA MONTH

DISPLAY PROC NEAR

PUSH DX

( (6) )

MOV AH,09 ;DISPLAY FUNCTION

INT 21H ;DOS CALL

POP DX

RET

DISPLAY ENDP

CODESG ENDS

END MAIN

答案:(1)PUSH DS;(2)PUSH AX;(3)XOR AX,3030H;(4)MUL THREE;(5)CLD;

(6)LEA DX,ALFMON

【979】未经排序的数组 ARRAY,程序在该数组中查找指定数字 N,如果找到则把它从数

组中删除。请在程序中的括号里填入适当指令使其完整。

DSEG SEGMENT

ARRAY DW 5,6,7,17,45,1234H,8

LEN EQU ($− ARRAY)/2

N DW 45

DSEG ENDS

PROG SEGMENT

MAIN PROC FAR

ASSUME CS:PROG,DS:DSEG,ES:DSEG

PUSH DS

SUB AX,AX

PUSH AX

Page 242: IBM-PC 汇编语言程序设计试题解

·238· IBM-PC 汇编语言程序设计试题解

MOV AX,DATASEG

MOV DS,AX

( (1) )

LEA DI,ARRAY

MOV CX,( (2) )

MOV AX,N

CALL DEL

RET

MAIN ENDP

DEL PROC NEAR

CLD

PUSH DI

REPNE ( (3) )

JE @1001

POP DI

JMP SHORT @1004

@1001: JCXZ @1003

@1002: MOV BX,ES:[DI]

MOV ( (4) ),BX

ADD DI,2

LOOP @1002

@1003: POP DI

DEC ( (5) )

@1004: RET

DEL ENDP

PROG ENDS

END MAIN

答案:(1)MOV ES,AX;(2)LEN;(3)SCASW;(4)ES:[DI-2];(5)WORD PTR ES:[DI]

【980】数据段有字数组 X、Y 和 Z,程序实现下述运算,请在程序中的括号里填入适当指

令使其完整。

Z[0]=X[0]+Y[0]; Z[1]=X[1]+Y[1]; Z[2]=X[2] −

Y[2];

Z[3]=X[3] −

Y[3];

Z[4]=X[4] −

Y[4]

Z[5]=X[5]+Y[5]; Z[6]=X[6] −

Y[6];

Z[7]=X[7] −

Y[7];

Z[8]=X[8]+Y[8]

Z[9]=X[9]+Y[9]

DSEG SEGMENT

X DW 11,12,13,14,15,16,17,18,19,20

Y DW 1,2,3,4,5,6,7,8,9,10

N EQU ($− Y)/2

Page 243: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·239·

Z DW 10 DUP(0)

LOGIC_RULE DW 00DCH

DSEG ENDS

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS:CSEG,DS:DSEG

MOV AX,DSEG

MOV DS,AX

MOV BX,0

MOV CX,N

MOV DX,LOGIC_RULE

@100: MOV AX,X[BX]

SHR DX,1

( (1) )

ADD AX,Y[BX]

( (2) )

@200: SUB AX,Y[BX]

@300: MOV Z[BX],AX

ADD BX,2

( (3) )

MOV AX,4C00H

INT 21H

RET

MAIN ENDP

CSEG ENDS

END MAIN

答案:(1)JC @200;(2)JMP SHORT @300;(3)LOOP @100

【981】数据段里有一个 N 个字的数组 A,程序利用起泡排序算法对数组进行从大到小的

次序排序。请在程序中的括号里填入适当指令使其完整。

DSEG SEGMENT

A DW 78,56,92,34,21,87,63,15,49,98

LEN EQU ($− A)/2

DSEG ENDS

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS:CSEG,DS:DSEG

MOV AX,DSEG

MOV DS,AX

Page 244: IBM-PC 汇编语言程序设计试题解

·240· IBM-PC 汇编语言程序设计试题解

MOV CX,LEN

DEC CX

LOOP1: MOV DI,CX

XOR BX,BX

LOOP2: MOV AX,A[BX]

CMP AX,A[BX+2]

( (1) )

( (2) )

MOV A[BX],AX

@300: ADD BX,2

LOOP LOOP2

( (3) )

LOOP LOOP1

RET

MAIN ENDP

CSEG ENDS

END MAIN

答案:(1)JGE @300;(2)XCHG AX,A[BX+2];(3)MOV CX,DI

【982】下面子程序的功能是清除 AX 寄存器中指定的位。请在程序中的括号里填入适当

指令使其完整。

BIT_CLEAR PROC

;输入参数: AX=WORD (OR AL BYTE)

; CL=BIT NUMBER TO CLEAR

;输出参数: AX=RESULT

PUSH BX

PUSH CX

MOV BX,1

AND CL,15

SHL BX,CL

( (1) )

AND AX,BX

( (2) )

( (3) )

RET

BIT_CLEAR ENDP

答案:(1)NOT BX;(2)POP CX;(3)POP BX

【983】下面子程序的功能是将指定字符串反序。请在程序中的括号里填入适当指令使其

Page 245: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·241·

完整。

REVERSE PROC

;输入参数: DS:SI=字符串首地址

; CX 字符串长度

PUSH AX

PUSH CX

PUSH DI

PUSH SI

CMP CX,1

JBE ( (1) )

MOV DI,SI

ADD DI,CX

DEC DI

( (2) )

CLD

@100: LODSB

XCHG AL,[DI]

( (3) )

DEC DI

LOOP @100

@200: POP SI

POP DI

POP CX

POP AX

RET

REVERSE ENDP

答案:(1)@200;(2)SHR CX,1;(3)MOV [SI− 1],AL

【984】下面子程序的功能是计算指定字符串的长度,假设字符串符合 C 语言的标准,即

以 0 表示结束。请在程序中的括号里填入适当指令使其完整。

STRLEN PROC

;输入参数 ES:DI=字符串首地址

;输出参数 AX=字符串长度

PUSH CX

PUSH DI

MOV CX,− 1

XOR AL,AL

CLD

( (1) ) SCASB

Page 246: IBM-PC 汇编语言程序设计试题解

·242· IBM-PC 汇编语言程序设计试题解

MOV AX,− 2

( (2) )

POP DI

POP CX

RET

STRLEN ENDP

答案:(1)REPNE;(2)SUB AX,CX

【985】下面子程序的功能是比较两个指定字符串,假设字符串符合 C语言的标准,即以

0 表示结束。请在程序中的括号里填入适当指令使其完整。

STRCMP PROC

;输入参数 DS:SI=STRING1 的首地址

; DS:DI=STRING2 的首地址

;输出参数 CX=相等的字符个数

; AL=0 表示不相等

; AL=1 STRING1 先结束

; AL=2 STRING2 先结束

PUSH ES

PUSH DI

PUSH SI

PUSH ES

POP DS

( (1) )

@1001: INC CX

LODSB

MOV AH,ES:[DI]

INC DI

OR AL,AL

JZ @1004

OR AH,AH

JE @1005

CMP AL,AH

( (2) )

MOV AX,0

@1002: POP SI

POP DI

POP ES

RET

@1004: CMP AL,AH

Page 247: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·243·

MOV AL,( (3) )

JMP @1002

@1005: CMP AH,AL

MOV AL,( (4) )

JMP @1002

STRCMP ENDP

答案:(1)MOV CX, − 1;(2)JE @1001;(3)1;(4)2

【986】下面程序的功能是从键盘输入 2 个表示月份的数字,查表后显示出该月份的英文

单词缩写。请在程序中的括号里填入适当指令使其完整。

DSEG SEGMENT PARA 'DATA'

THREE DB 3

MONIN DB 3,4 DUP(?)

ALFMON DB '???','$'

MONTAB DB

'JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','N

OV','DEC'

DSEG ENDS

CSEG SEGMENT PARA 'CODE'

ASSUME CS:CSEG,DS:DSEG,ES:DSEG

MAIN PROC FAR

MOV AX,DSEG

MOV DS,AX

( (1) )

CALL INPUT

CALL LOCATE

CALL DISPLAY

MOV AX,4C00H

INT 21H

MAIN ENDP

INPUT PROC NEAR

PUSH DX

MOV AH,0AH

LEA DX,MONIN

INT 21H

MOV AH,MONIN+2

MOV AL,MONIN+3

XOR AX,3030H

CMP AH,0

Page 248: IBM-PC 汇编语言程序设计试题解

·244· IBM-PC 汇编语言程序设计试题解

JZ RETURN

SUB AH,AH

( (2) )

RETURN: POP DX

RET

INPUT ENDP

LOCATE PROC NEAR

PUSH SI

PUSH DI

PUSH CX

LEA SI,MONTAB

( (3) )

MUL THREE

ADD SI,AX

MOV CX,03

CLD

LEA DI,ALFMON

( (4) )

POP CX

POP DI

POP SI

RET

LOCATE ENDP

DISPLAY PROC NEAR

PUSH DX

LEA DX,ALFMON

MOV AH,09

( (5) )

POP DX

RET

DISPLAY ENDP

CSEG ENDS

END MAIN

答案:(1)MOV ES,AX;(2)ADD AL,10;(3)DEC AL;(4)REP MOVSB;

(5)INT 21H

【987】下面程序的功能是:利用递归算法计算 ackermann 函数 ACK(m,n)的值。请在程

序中的括号里填入适当指令使其完整。

ACK 函数定义如下:对于 m≥0 和 n≥0有

Page 249: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·245·

m 1

1

0

m

m

− − =

− =

+ =

)) 1 n , ( ACK , m ( ACK ) n , ( ACK

) 1 , m ( ACK ) 0 , ( ACK

1 n ) n , ( ACK

FRAME STRUC

SAVE_BP DW ?

SAVE_CSIP DW 2 DUP(?)

N DW ?

M DW ?

RES_ADDR DW ?

FRAME ENDS

DSEG SEGMENT

MM DW 5

NN DW 3

RESULT DW ?

TEMP DW ?

DSEG ENDS

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS:CSEG,DS:DSEG

MOV AX,DSEG

MOV DS,AX

LEA SI,RESULT

PUSH SI

MOV AX,MM

PUSH AX

MOV BX,NN

PUSH BX

CALL FAR PTR ACK

MOV AX,4C00H

INT 21H

MAIN ENDP

ACK PROC FAR

PUSH BP

MOV BP,SP

MOV SI,[BP].RESULT_ADDR

MOV AX,[BP].M

MOV BX,[BP].N

CMP AX,0

JG TESTN

Page 250: IBM-PC 汇编语言程序设计试题解

·246· IBM-PC 汇编语言程序设计试题解

INC BX

MOV [SI],BX

( (1) )

TESTN: CMP BX,0

JG MN

DEC AX

MOV BX,1

PUSH SI

PUSH AX

PUSH BX

( (2) )

JMP EXIT2

MN: PUSH SI

PUSH AX

( (3) )

PUSH BX

CALL ACK

PUSH SI

MOV AX,[BP].M

( (4) )

PUSH AX

MOV DX,[SI]

PUSH DX

CALL ACK

EXIT2: POP BP

( (5) )

ACK ENDP

CSEG ENDS

END MAIN

答案:(1)JMP EXIT2;(2)CALL ACK;(3)DEC BX;(4)DEC AX;(5)RET 6

【988】下面程序的功能是:从键盘输入一行字符,要求第一个键入的字符必须是空格,

如果不是,则退出程序;如果是,则开始接收键入的字符,并顺序存放在首地址为 STR 的缓

冲区中(空格符不存入),直到接收到第二个空格符时退出。请在程序中的括号里填入适当指

令使其完整。

DSEG SEGMENT

STR DB 80 DUP(?)

FLAG DB ?

DSEG ENDS

Page 251: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·247·

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS:CSEG,DS:DSEG

MOV AX,DSEG

MOV DS,AX

LEA BX,STR

MOV FLAG,0

NEXT: MOV AH,01

INT 21H

TEST FLAG,01H

( (1) )

CMP AL,20H

JNZ EXIT

MOV FLAG,1

JMP NEXT

FOLLOW: CMP AL,20H

( (2) )

MOV [BX],AL

INC BX

( (3) )

EXIT: MOV AX,4C00H

INT 21H

MAIN ENDP

CSEG ENDS

END MAIN

答案:(1)JNZ FOLLOW;(2)JZ EXIT;(3)JMP NEXT

【989】下面程序的功能是:利用递归算法求 2 个正整数 N1、N2 的最大公约数,递归公

式如下。请在程序中的括号里填入适当指令使其完整。

≠=

=0n)n%m,m(GCD

0nm)n,m(GCD

.model small

.data

N1 DW 12

N2 DW 8

GCD DW ?

.code

_gcd PROC NEAR

PUSH BP

Page 252: IBM-PC 汇编语言程序设计试题解

·248· IBM-PC 汇编语言程序设计试题解

MOV BP,SP

MOV CX,( (1) )

MOV BX,( (2) )

OR BX,BX

( (3) )

MOV AX,CX

JMP SHORT @114

@86: MOV AX,CX

XOR DX,DX

DIV BX

PUSH DX

( (4) )

CALL NEAR PTR _gcd

@114: POP BP

( (5) )

_gcd ENDP

_main PROC NEAR

MOV AX,@data

MOV DS,AX

MOV AX,N1

PUSH AX

MOV AX,N2

PUSH AX

CALL NEAR PTR _gcd

MOV GCD,AX

MOV AX,4C00H

INT 21H

_main ENDP

END _main

答案:(1)[BP+4];(2)[BP+6];(3)JNE SHORT @86;(4)PUSH BX;(5)RET 4

【990】下面的子程序功能是:无符号双字取余数。请在程序中的括号里填入适当指令使

其完整。

UL_MOD PROC NEAR

PUSH BP

PUSH SI

PUSH DI

MOV BP,SP

MOV AX,[BP+08H] ;被除数低字

Page 253: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·249·

MOV DX,[BP+0AH] ;被除数高字

MOV BX,[BP+0CH] ;除数低字

MOV CX,[BP+0EH] ;除数高字

;以下程序段计算(DI,SI,DX,AX)÷(CX,BX)的余数=(DX,AX)

MOV BP,CX

MOV CX,( (1) ) ;设置循环次数

XOR DI,DI

XOR SI,SI

UL_MOD36: SHL AX,1

RCL DX,1

RCL SI,1

RCL DI,1

CMP DI,BP

JB UL_MOD38

JA UL_MOD37

CMP SI,BX

JB UL_MOD38

UL_MOD37: SUB SI,BX

( (2) )

UL_MOD38: LOOP UL_MOD36

MOV AX,( (3) )

MOV DX,( (4) )

POP DI

POP SI

POP BP

( (5) )

UL_MOD ENDP

答案:(1)20H;(2)SBB DI,BP;(3)SI;(4)DI;(5)RET 8

【991】下面的子程序功能是:无符号双字的乘法(DX,AX)=(DX,AX)×(CX,BX)。请

在程序中的括号里填入适当指令使其完整。

NL_MUL PROC NEAR

PUSH SI

XCHG AX,SI

XCHG AX,DX

TEST AX,AX

( (1) )

MUL BX

@1E: ( (2) )

Page 254: IBM-PC 汇编语言程序设计试题解

·250· IBM-PC 汇编语言程序设计试题解

XCHG AX,CX

MUL SI

ADD AX,( (3) )

@25: XCHG AX,SI

MUL BX

ADD DX,( (4) )

POP SI

RET

NL_MUL ENDP

答案:(1)JZ @1E;(2)JCXZ @25;(3)CX;(4)SI

【992】下面的子程序_sitod 功能是:将给定的符号整数转换为 10 进制字符串。请在程

序中的括号里填入适当指令使其完整。

.model small

.data

str DB 10 DUP(32),0 ;以 0 表示字符串的结束

.code

_main PROC NEAR

MOV AX,@data

MOV DS,AX ;取数据段地址

MOV SI,123 ;要转换的符号整数

LEA AX,str

PUSH AX

PUSH SI

CALL NEAR PTR _sitod

MOV AX,4C00H

INT 21H

_main ENDP

_sitod PROC NEAR

PUSH BP

MOV BP,SP

PUSH SI

PUSH DI

MOV SI,( (1) ) ;取要转换的数据

MOV DI,( (2) ) ;取字符串首地址

;下面程序段判断要转换数据的符号,并将符号字符保存在 CH

OR SI,SI

( (3) )

Page 255: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·251·

NEG SI

MOV CH,'− '

( (4) )

@86: MOV CH,'+'

;下面程序段计算给定字符串的长度,并保存在 BX 中

XOR BX,BX ;设置字符串操作指针

JMP SHORT @142

@114: INC BX

@142: CMP ( (5) )

JNE SHORT @114

;下面程序段将给定的整数数据转换为 10 进制字符

JMP SHORT @226

@198: MOV AX,SI

MOV BP,10

CWD

IDIV BP

( (6) )

DEC BX

MOV [BX+DI],DL

;下面程序段判断是否结束转换过程

MOV AX,SI

MOV BP,10

CWD

IDIV BP

MOV SI,AX

OR AX,AX

JE SHORT @254

@226: OR BX,BX

JNE SHORT @198

@254:

;下面程序段在给定字符串内填写符号字符

OR BX,BX

JE SHORT @338

( (7) )

MOV [BX+DI],CH

JMP SHORT @338

@338:

MOV AX,DI ;返回字符串首地址

POP DI

Page 256: IBM-PC 汇编语言程序设计试题解

·252· IBM-PC 汇编语言程序设计试题解

POP SI

POP BP

RET ( (8) )

_sitod ENDP

END _main

答案:(1)[BP+4];(2)[BP+6];(3)JGE SHORT @86;(4)JMP SHORT @142;(5)BYTE

PTR [BX+DI],0;(6)ADD DL,'0';(7)DEC BX;(8)4

【993】下面的子程序_atoi 功能是:将表示 10 进制数据的字符串转换为符号整数。请在

程序中的括号里填入适当指令使其完整。

.model small

.data

str DB ' − 1234A5678 ',0 ;要转换的字符串,以 0 表

示字符

串的结束

.code

_main PROC NEAR

MOV AX,@data

MOV DS,AX ;取数据段地址

LEA AX,str

PUSH AX

CALL NEAR PTR _atoi

MOV AX,4C00H

INT 21H

_main ENDP

_atoi PROC NEAR

PUSH BP

MOV BP,SP

PUSH SI

PUSH DI

MOV SI,( (1) ) ;取字符串首地址

;下面程序段的功能是:跳过字符串前面的无效空格

JMP SHORT @86

@58: INC SI

@86: CMP BYTE PTR [SI],32

JE SHORT @58

;下面程序段的功能是:判断符号字符,并保存在 DI 中

MOV DI,1

MOV AL,[SI]

Page 257: IBM-PC 汇编语言程序设计试题解

第 5 章 程序填空题 ·253·

CMP AL,'+'

JE ( (2) )

CMP AL,'− '

JNE ( (3) )

MOV DI,− 1

@254: INC SI

@282: XOR CX,CX ;CX 转换结果

;下面程序段做字符串到整数的转换

JMP SHORT @338

@310: MOV AX,10

MUL CX

ADD AL,BYTE PTR [SI]

( (4) )

ADD AX,( (5) ) ;将 ASCII 码转换为数字

MOV CX,AX

INC SI

@338: CMP BYTE PTR [SI],'0' ;遇到非数字字符则结束转换过

JL ( (6) )

CMP BYTE PTR [SI],'9'

( (7) )

@394: MOV AX,DI ;返回数据保存在 AX 中

IMUL CX

POP DI

POP SI

POP BP

RET ( (8) )

_atoi ENDP

END _main

答案:(1)[BP+4];(2)SHORT @254;(3)SHORT @282;(4)ADC AH,0;(5)− 48;(6)

SHORT @394;(7)JLE SHORT @310;(8)2

Page 258: IBM-PC 汇编语言程序设计试题解

第 6章 编 程 题

编写汇编语言程序是复杂和困难的工作,需要考虑的因素很多,稍有遗漏,程序就不能

正确运行。编写程序时需要解决两大关键问题,一个是算法问题,另一个是语言问题。如果

将两类问题混在一起解决,就很难排除编程过程中出现的错误,编程效率难以提高。例如,

程序得到一个错误的结果,究竟是算法出错了,还是汇编语言使用不当造成的?因为两者的

错误都会影响到程序的最终结果。

本书建议将算法问题和语言问题分开研究,首先研究出正确的算法,然后再编写汇编语

言的程序。研究算法可以通过高级语言来实现,如 C 语言、BASIC 语言等。首先用高级语言

编写出任务要求的程序,保证程序运行正确,也就是算法正确了,然后再用汇编语言编写最

终的程序。上述做法的优点是:编写复杂的汇编语言程序时不必考虑算法问题,把重点放在

汇编语言的语言问题上就可以了。将一个任务分两步解决,看似工作量增加了,但编程效率

将大大提高,您不妨一试。

编写程序的思路和方法很多,本书提供的程序答案仅供参考。答案中所有程序都经过

Microsoft MASM5.0和 Microsoft Link5.50 调试通过。

为了减少篇幅,部分程序的输入、输出功能直接调用了本书提供的函数库(mylib.lib),

不再单独书写其源码了。函数库在光盘里提供给大家,函数库中的函数基本符合 C 语言标准,

读者编程序时也可以直接利用。读者也可以自行编写输入、输出子程序。

若汇编语言源文件 test1.asm 需要使用函数库(mylib.lib)的子程序,应先初始化函

数库,具体做法请模仿答案中的程序。读者可按下面步骤汇编 test1.asm 源文件,连接库文

件并生成运行程序 test1.exe。

masm test1;

link test1,,,mylib;

6.1 编程题题目

【994】编写一类似 C 语言字符串输入函数 gets(char *s)的子程序,从键盘上输入字符

串,并打印出来。

【995】按照下列形式将字节 X 中的二进制位进行交换。A7A6A5A4A3A2A1A0-> A5A4 A7A6 A1A0 A3A2

【996】设在 DAT 单元存放一个-9~+9 的字节数据,在 SQRTAB数据区中存放了 0~9 的

平方值,请用直接查表法编写一个子程序,在 SQRTAB 中查找出 DAT 单元中数据对应的平方值

送入 SQR 单元,并写出主程序的调用方式。

【997】有一函数:

=y

写一程序,输入 x 值,输出 y 值。

x(x<1) 2x-1 1≤x<10 3x-11 x≥10

Page 259: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·255·

【998】判断某年是否为闰年。

【999】把 100~200 之间的不能被 3 整除的数输出。

【1000】猴子吃桃问题。猴子第一天摘下若干桃子,当时吃了一半,还不过瘾,又多吃

一个,第二天将剩下的吃了一半,又多吃一个,以后每天如此,第 N 天时只剩一个。求第一

天共摘多少桃子。N 直接在数据段初始化。

【1001】有 N 张牌和 N 个人,这 N 张牌排成一排并按顺序编号。第一个人把牌全部翻成

正面朝下;第二个人把序号为 2 的倍数的牌都翻过来;第三个人把所有序号是 3 的倍数的牌

都翻过来;……第 j 个人把序号为 i 的倍数的牌都翻过来;以此类推。当第 N 个人翻过后,

有哪几张牌是正面朝上的?设用 1表示正面朝上;0 表示正面朝下。

【1002】今有一堆苹果,如果每次拿走 2 个,最后剩下 1 个;如果每次拿走 3 个,最后

剩下 2 个;如果每次拿走 5 个,最后剩下 4 个;如果每次拿走 6 个,最后剩下 5 个;只有当

每次拿走 7个时,才能拿完。问这堆苹果最少有多少个?

【1003】在公元 5 世纪,我国一部数学著作《张邱建算经》里有一个著名的数学问题:

设公鸡每只价 5 元,母鸡每只价 3 元,小鸡 3 只价 1 元。今用 100 元钱买鸡 100只,问买公

鸡、母鸡、小鸡各多少只?在数学史上,这类问题就叫做“百鸡问题”。

【1004】编密码。按以下规律编码:

字母 A 变为 E,a 变为 e,即变成其后的第 4 个字母,W 变为 A,X 变为 B,Y 变为 C,Z

变为 D,非字母不变。如“China!”变为“Glmre!”。

【1005】验证数论中的角谷猜想。角谷猜想为:对任何一个给定的正整数,若为奇数,

则乘 3 加 1;若为偶数,则除以 2,所得的结果重复以上步骤,经过有限步后,必得整数 1。

【1006】有 15 个数有序存放在一数组 a[15]中,针对一个数 number,要求用折半查找

法找出该数是数组中的第几个元素的值,如该数的值超范围,则打印“-1”,不在数组中,

则打印“0”。

【1007】中央电视台有一个娱乐性的节目,节目的名称是《幸运 52》。节目中有一个猜商

品价格的活动,具体做法是:主持人出示一件商品,由参加者猜这个商品的价格,主持人针

对参加者猜出的价格,仅告知“高”、“低”和“正确”。猜价格的过程可以反复进行,如果猜

对了,则参加者就赢得这个商品。当然,猜价格的时间是被限制的,参加者必须在规定的时

间内猜对,否则就算失败。假设商品的价格在 0~65535 元之间,请你编写一计算机猜价格的

程序,猜价格的次数越少越好。

【1008】从键盘输入 2 个整数,输出其最大公约数和最小公倍数。

【1009】打印所有“水仙花数”。(“水仙花数”:三位数,各位数字的立方和为数字本身,

例如:153=13+5

3+3

3)

【1010】从键盘输入一个数,判断其是否为素数,显示结果。

【1011】求 10 到 200 之间的孪生素数对。孪生素数对指两值相差 2 的一对素数,如 11

与 13;17 与 19;…

【1012】如果一个数从左边和从右边读都是相同的数,就称它为回文数,例如 383。求出

1000 以内既是回文数又是素数的自然数。

【1013】打印出 1000 以内同时满足如下条件的数:

(1)个位数与十位数之和除以 10 所得的余数等于百位数字;

Page 260: IBM-PC 汇编语言程序设计试题解

·256· IBM-PC 汇编语言程序设计试题解

(2)该数为素数。

【1014】验证哥德巴赫猜想:任意一个不小于 6的偶数,总可以表示为两个素数之和。

【1015】用循环程序,在屏幕上显示 9-9 乘法表。

【1016】用循环程序,在屏幕上显示一 ASCII 字符表。(从 20H~FFH)

【1017】求具有下列两个性质的最小自然数 x:(1)x 的个位数是 m;(2)如果将 x 的个

位数字 m 移到其余各位数字之前,所组成的新数是 x 的 n倍(n 的范围是 1 到 m)。

【1018】从键盘输入一个正整数,计算其平方根并输出。

【1019】输入 a,b,c 三边长后,判断是否能构成三角形;如能构成三角形,就用海伦公

式求三角形的面积。

【1020】用键盘输入 4 位 16 进制数,将它转换为 2-15 进制显示出来。

【1021】从键盘输入一行字符,统计字母、空格、数字、其他字符的个数,并显示。

【1022】从键盘输入一字符串,将其大写字母变为小写字母并显示,然后将所有小写字

母转换为大写再输出。

【 1023】检查长度为 n 的字符串序列 s=s1s2…sn 内是否包含给定的字符序列

p=p1p2…pm(1<m<n),即检查是否存在最小的 i 值,使得 si=p1,si+1=p2,…si+m-1=pm,如果存在这

样的 i 则返回其值,否则返回 0。

【1024】从键盘输入一字符串,按其反序存放并输出。

【1025】计算任意两个正整数相加的精确值(设它们的位数不超过 50)。

【1026】计算任意两个正整数相乘的精确值(设它们的位数不超过 50)。

【1027】计算并打印杨辉三角形,要求打印到第 N 行,N 由键盘输入。

【1028】计算并打印帕斯卡三角,要求打印到第 N 行,N 由键盘输入。

【1029】输入一个奇数 Q,计算并输出 Q 阶幻方阵。

例如:

8 1 6

3 5 7

4 9 2

【1030】一个数如果恰好等于它的因子之和,这个数就称为“完数”,例如,6 的因子为

1,2,3,而 6=1+2+3,因此 6 是完数。编程找出 10000以内的所有完数。

【1031】找出由数字 1~9 中的任意三位数字组成的且满足下列条件的全部三位数:

(1)1~9 中的任意一个数字在这些三位数中只能出现一次;(2)这些三位数都必须是完全平

方数,即其平方根是整数。

【1032】给出一百分制成绩,要求输出成绩等级“A”,“B”,“C”,“D”,“E”。90 分以上

为 A,80~89 分为 B,70~79 分为 C,60~69 分为 D,60 分以下为 E。

【1033】编写一用箭头键控制光标移动的程序:箭头控制移动,ALT+键头控制移动并画

线,CTRL+箭头控制移动并擦除。

【1034】用子程序递归的方法实现 N!的计算,N 在数据段初始化。

【1035】在内存中驻留一程序,每秒钟响声一次,类似钟表。(提示:用中断 1CH)

【1036】编写无符号双字除以无符号双字的程序,无符号双字的除数与被除数直接在数

据段初始化。

Page 261: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·257·

【1037】笼子里有鸡和兔共 50 只,只知道鸡和兔的腿共有 160 只,求鸡和兔各多少只?

【1038】请设计一个程序,让计算机找出 40 个自然数来,使得其中任意两个数之差均不

相等。

【1039】求 13 的 13 次方的最后三位数。

【1040】一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一

个三位数,且这两个三位数的数码正好相反,求这个三位数。

【1041】求具有 abcd=(ab+cd)2性质的 4 位数。3025 这个数具有一种独特的性质:将它

平分为二段,即 30 和 25,使之相加后求平方,即(30+25)2,恰好等于 3025 本身。请求出具

有这样性质的全部 4 位数。

【1042】波瓦松酒的分酒趣题。法国著名数学家波瓦松在青年时代研究过一个有趣的数

学问题:某人有 12 品脱的啤酒一瓶,想从中倒出 6 品脱,但他没有 6品脱的容器,仅有一个

8 品脱和 5 品脱的容器,怎样倒才能将啤酒分为两个 6 品脱呢?

【1043】将大于 0 小于 1000 的阿拉伯数字转换为罗马数字。

【1044】计算分数的精确值。使用数组精确计算 M/N(0<M<N<=100)的值。如果 M/N 是

无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数位的

序号)。

【1045】求 3000 以内的全部亲密数。如果整数 A 的全部因子(包括 1,不包括 A 本身)

之和等于 B;且整数 B 的全部因子(包括 1,不包括 B 本身)之和等于 A,则将整数 A和 B 称

为亲密数。

【1046】现有 21 根火柴,两人轮流取,每人每次可以取走 1至 4 根,不可多取,也不能

不取,谁取最后一根火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;

计算机一方为“常胜将军”。

【1047】输入 m 和 n(20≥m≥n>0),求出满足以下方程的正整数数列 i1,i2,...,in,

使得:i1+i1+...+in=m,且 i1≥i2...≥in。例如,当 n=4,m=8 时,将得到如下 5 个

数列:5 1 1 1;4 2 1 1;3 3 1 1;3 2 2 1;2 2 2 2

6.2 编程题参考答案

【994】编写一类似 C 语言字符串输入函数 gets(char *s)的子程序,从键盘上输入字

符串,并打印出来。

算法思路:

可以利用 DOS 中断 0AH 功能实现字符串的输入,但是 DOS 中断 0AH 功能对字符串缓冲

区有特殊要求,即两个字节的头信息。参考答案的程序使用 DOS 中断文件输入功能(3FH),

字符缓冲区可以很大(64K 字节),也没有头信息的特殊要求。

汇编语言程序如下:

.model small

.data

str DB 200 DUP(?) ;定义字符串

.code

_main PROC NEAR

Page 262: IBM-PC 汇编语言程序设计试题解

·258· IBM-PC 汇编语言程序设计试题解

MOV AX,@data

MOV DS,AX ;取数据段地址

LEA AX,str ;串的偏移地址

PUSH AX ;利用堆栈传递参数

CALL _gets

POP CX

MOV BX,AX ;字符串的长度

MOV str[BX],'$' ;添加字符串结束标记

LEA DX,str ;取串的首地址

MOV AH,9

INT 21h ;调用 dos 中断,打印字符串

MOV AX,4c00h

INT 21h ;调用 dos 中断,返回系统

_main ENDP

_gets PROC NEAR

PUSH BP

MOV BP,SP

MOV DX,[BP+4] ;从堆栈中取串的偏移地址

MOV AH,3fh ;读功能

MOV BX,0 ;文件定向为标准输入

XOR CX,CX ;允许最多输入的字符

INT 21h

POP BP

RET ;(ax)=实际读入的字节数

_gets ENDP

END _main

【995】按照下列形式将字节 X 中的二进制位进行交换。A7A6A5A4A3A2A1A0-> A5A4 A7A6 A1A0 A3A2

算法思路:

可以经由 4个移位步骤完成,然后将各个结果组合起来。针对本题的特点,有更加快速

简便的程序,请读者自己编写完成。

汇编语言程序如下:

.model small

.data

x DB 1bh

.code

_main PROC NEAR

Page 263: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·259·

MOV AX,@data

MOV DS,AX

MOV AL,x

AND AL,00001100b ;只关心 A3A2

MOV CL,2

SHR AL,CL

MOV AH,AL ;(ah)=000000A3A2

MOV AL,x

AND AL,00000011b ;只关心 A1A0

MOV CL,2

SHL AL,CL

OR AH,AL ;(ah)=0000A1A0A3A2

MOV AL,x

AND AL,11000000b ;只关心 A7A6

MOV CL,2

SHR AL,CL

OR AH,AL ;(ah)=00A7A6A1A0A3A2

MOV AL,x

AND AL,00110000b ;只关心 A5A4

MOV CL,2

SHL AL,CL

OR AH,AL ;(ah)=A5A4A7A6A1A0A3A2

MOV x,AH

MOV AX,4c00h

INT 21h

_main ENDP

END _main

【996】设在 DAT 单元存放一个-9~+9 的字节数据,在 SQRTAB数据区中存放了 0~9 的

平方值,请用直接查表法编写一个子程序,在 SQRTAB 中查找出 DAT 单元中数据对应的平方值

送入 SQR 单元,并写出主程序的调用方式。

算法思路:

针对一些复杂的函数计算,不妨使用查表的方法。

汇编语言程序如下:

Page 264: IBM-PC 汇编语言程序设计试题解

·260· IBM-PC 汇编语言程序设计试题解

.model small

.data

dat DB − 9 ;求平方的数据

sqrtab DB 0,1,4,9,16,25,36,49,64,81 ;平方表

sqr DB ? ;结果

.code

_main PROC NEAR

MOV AX,@data ;取得数据段地址

MOV DS,AX

MOV AL,dat ;取查表数据

XOR AH,AH

PUSH AX ;利用堆栈传递函数参数

MOV AX,OFFSET sqrtab ;取表的首地址

PUSH AX

CALL subrot

POP CX ;恢复堆栈

POP CX

MOV sqr,AL

MOV AH,4ch ;调用 DOS 中断,返回系统

INT 21h

_main ENDP

subrot PROC NEAR

PUSH BP

MOV BP,SP

PUSH SI

MOV BX,[BP+4] ;从堆栈里取得表的首地址

MOV AX,[BP+6] ;取查表数据

TEST AL,80h ;以下程序段计算 AL 的绝对值

JNS next

NEG AL

next:

XOR AH,AH

MOV SI,AX

MOV AL,[BX+SI] ;查表

POP SI

POP BP

Page 265: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·261·

RET ;AL 为返回参数

subrot ENDP

END _main

【997】有一函数:

x(x<1) y= 2x-1 1≤x<10

3x-11 x≥10

写一程序,输入 x 值,输出 y 值。

算法思路:

本题可以用条件判断、分支的程序结构来编写程序。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{ int x=19,y;

if (x<1){

y=x;

}

else{

if (x<10){

y=2*x− 1;

}

else{

y=3*x− 11;

}

}

printf("%d\n",y);

}

汇编语言程序如下:

.model small

.data ;定义数据段

format1 DB '%d',10,0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

Page 266: IBM-PC 汇编语言程序设计试题解

·262· IBM-PC 汇编语言程序设计试题解

_start ENDP

_main PROC NEAR ;库函数初始化程序自动调用_main 过程

MOV AX,@data ;取数据段地址

MOV DS,AX

MOV SI,19 ;SI 是算法程序中的 x,DI 是算法程序中

的 y

CMP SI,1 ;首先 x 与 1比较

JGE @86 ;x>=1 则去@86

MOV DI,SI ;y=x

JMP @198

@86:

CMP SI,10 ;x与 10 比较

JGE @142 ;x>=10 则去@142

MOV AX,SI ;AX=x

SHL AX,1 ;AX=AX*2

DEC AX ;AX=AX− 1

JMP @170

@142:

MOV AX,SI ;AX=x

MOV DX,3

IMUL DX ;AX=AX*3

ADD AX,− 11 ;AX=AX− 11

@170:

MOV DI,AX ;y=AX

@198: ;以下程序段执行类似 printf("%d\n",y)

功能

PUSH DI ;y 值入栈

MOV AX,OFFSET format1

PUSH AX ;格式字符串入栈

CALL _printf ;在屏幕上打印数值的子程序

ADD SP,4 ;恢复栈指针,调用前入栈两次,空弹出

4 字节

;屏幕打印结束

RET

_main ENDP

END _start

【998】判断某年是否为闰年。

Page 267: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·263·

算法思路:

判断闰年的方法:符合下列条件之一即为闰年。

① 能被 4 整除,但不能被 100 整除;

② 能被 4 整除,但不能被 100 整除,但能被 400 整除。

本题可以用条件判断、分支的程序结构来编写程序。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序如下:

void main(void)

{

int year=1997,leap;

if (year%4==0)

{

if (year%100==0)

{

if (year%400==0) leap=1;

else leap=0;

}

else leap=1;

}

else leap=0;

printf("%d\n",leap);

}

汇编语言程序如下:

.model small

.data ;定义数据段

format1 DB '%d',10,0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC

MOV AX,@data ;取数据段地址

MOV DS,AX

MOV DI,1997 ;DI 是算法研究程序里的 year,SI 为算

法研究程序里的 leap

MOV AX,DI

Page 268: IBM-PC 汇编语言程序设计试题解

·264· IBM-PC 汇编语言程序设计试题解

MOV BX,4 ;首先做 year 除以 4 的运算

CWD

IDIV BX

OR DX,DX ;关心相除后的余数

JNE @198 ;余数不为 0(不能被 4 整除)则不是闰年

MOV AX,DI

MOV BX,100 ;做 year 除以 100 的运算

CWD

IDIV BX

OR DX,DX ;关心相除后的余数

JNE @198 ;余数不为 0(能被 4 整除,但不能被 100

整除)则是闰年

MOV AX,DI

MOV BX,400 ;做 year 除以 400 的运算

CWD

IDIV BX

OR DX,DX ;关心相除后的余数

JNE @198 ;余数不为 0(不能被 400整除)则不是闰年

MOV SI,1 ;设置闰年标记,leap=1

JMP @282

@198: XOR SI,SI ;清除闰年标记,leap=0

@282: ; 以 下 程 序 段 执 行 类 似

printf("%d\n",leap)

的功能

PUSH SI ;leap 值入栈

MOV AX,OFFSET format1

PUSH AX ;格式字符串入栈

CALL _printf ;在屏幕上打印数值的子程序

ADD SP,4 ;恢复栈指针,调用前入栈两次,空弹出

4 字节

;屏幕打印结束

RET

_main ENDP

END _start

【999】把 100~200 之间的不能被 3 整除的数输出。

算法思路:

使用一个简单的循环就可以解决这个问题。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

Page 269: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·265·

C 语言编写的算法研究程序如下:

void main(void)

{

int n;

for (n=100;n<=200;n++)

{

if (n%3==0)

{

continue;

}

printf("%d",n);

}

}

汇编语言程序如下:

.model small

.data ;定义数据段

format1 DB '%d',10,0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC

MOV AX,@data ;取数据段地址

MOV DS,AX

MOV SI,100 ;SI为算法研究程序中的 n,设置循环开始条件

JMP @170 ;首先去判断循环条件

@158:

MOV AX,SI

MOV BX,3

CWD

IDIV BX ;做除法,n是符号整数,所以要用符号除法

OR DX,DX ;关心余数是否为 0

JNE @114

JMP @142

@114: ;以下程序段执行类似 printf("%d\n",n)的功

Page 270: IBM-PC 汇编语言程序设计试题解

·266· IBM-PC 汇编语言程序设计试题解

PUSH SI

MOV AX,OFFSET format1

PUSH AX ;格式字符串入栈

CALL _printf ;在屏幕上打印数值的子程序

ADD SP,4 ;恢复栈指针,调用前入栈两次,空弹出 4

字节

;屏幕打印结束

@142: INC SI ;循环变量增加

@170: CMP SI,200 ;判断循环条件

JLE @158

RET

_main ENDP

END _start

【1000】猴子吃桃问题。猴子第一天摘下若干桃子,当时吃了一半,还不过瘾,又多吃

一个,第二天将剩下的吃了一半,又多吃一个,以后每天如此,第 N 天时只剩一个。求第一

天共摘多少桃子。N 直接在数据段初始化。

算法思路:

本题可以用循环结构来编写程序。循环内部利用递推关系 xk+1=(xk+1)*2进行计算。

C 语言编写的算法研究程序:

void main(void)

{

unsigned int day=11;

unsigned int x=1;

while(day>0)

{

x=(x+1)*2;

day− − ;

}

printf("Total is : %05d",x);

}

汇编语言程序如下:

.model small

.data

f1 DB 'Total is : ','$'

day DW 11

x DW 1

.code

DISP PROC NEAR

Page 271: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·267·

PUSH BP

MOV BP,SP

MOV AX,[BP+4] ;取要显示的数字

PUSH SI

MOV SI,0 ;设置循环初始

JMP @100 ;先去判断循环条件

@50:

MOV DX,0

MOV BX,10 ;以 10 进制形式显示

DIV BX

PUSH DX ;利用堆栈依次保存个位、十位....

INC SI ;循环变量+1

@100:

CMP SI,5 ;判断是否结束循环,共显示 5 位数字

JL @50

MOV SI,0 ;设置循环初始

JMP @200 ;先去判断循环条件

@150:

POP DX ;从堆栈中依次弹出...十位、个位

ADD DL,30H ;转换为 ASCII 码

MOV AH,2

PUSH SI ;防止 DOS 中断改变 SI

INT 21H ;调用 DOS 中断显示一个字符

POP SI ;恢复 SI

INC SI ;循环变量+1

@200:

CMP SI,5 ;判断是否结束循环,共显示 5 位数字

JL @150

POP SI

POP BP

RET

DISP ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

;下面程序段类似算法研究程序里的 while(day>0)

JMP @58 ;先去判断循环条件

Page 272: IBM-PC 汇编语言程序设计试题解

·268· IBM-PC 汇编语言程序设计试题解

@30:

MOV AX,x

INC AX

SHL AX,1 ;(ax)=(x+1)*2

MOV x,AX ;x=(x+1)*2

DEC day ;day− −

@58:

CMP day,0 ;判断是否结束 while 循环

JA @30

;下面程序段类似算法研究程序里的 printf("Total is : %05d",x);

MOV DX,OFFSET f1

MOV AH,9

INT 21h

PUSH x

CALL DISP

POP x

MOV AX,4c00h ;调用 DOS 中断,返回系统

INT 21h

_main ENDP

END _main

【1001】有 N 张牌和 N 个人,这 N 张牌排成一排并按顺序编号。第一个人把牌全部翻成

正面朝下;第二个人把序号为 2 的倍数的牌都翻过来;第三个人把所有序号是 3 的倍数的牌

都翻过来;……第 j 个人把序号为 i 的倍数的牌都翻过来;以此类推。当第 N 个人翻过后,

有哪几张牌是正面朝上的?设用 1表示正面朝上;0 表示正面朝下。

算法思路:

本题可以用循环结构来编写程序。

C 语言编写的算法研究程序如下:

#define N 10

void main(void)

{

unsigned int x[N+1];

unsigned int i,j;

for(i=1;i<N;i++)

{

x[i]=0;

}

for(i=2;i<N;i++)

{

Page 273: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·269·

for(j=i;j<N;j+=i)

{

x[j]=1− x[j];

}

}

for(i=1;i<N;i++)

{

printf("%d ",i[k]);

}

}

汇编语言程序如下:

N EQU 20

.model small

.data ;定义数据段

x DB (N+1) DUP(0)

;用 SI 代替算法研究程序里的 i

;用 BX 代替算法研究程序里的 j

.code

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

;下面程序段类似算法研究程序里的 for(i=2;i<N;i++)

MOV SI,2

JMP @310 ;首先去判断循环条件

@170:

;下面程序段类似算法研究程序里的 for(j=i;j<N;j+=i)

MOV BX,SI

JMP @254 ;首先去判断循环条件

@198:

;下面程序段类似算法研究程序里的 x[j]=1− x[j];

DEC x[BX]

NEG x[BX]

ADD BX,SI ;循环变量+i

@254:

CMP BX,N ;判断是否结束 j 循环

JB @198

INC SI ;循环变量+1

@310:

Page 274: IBM-PC 汇编语言程序设计试题解

·270· IBM-PC 汇编语言程序设计试题解

CMP SI,N ;判断是否结束 i 循环

JB @170

;下面程序段类似算法研究程序里的 for(i=1;i<N;i++)

MOV SI,1

JMP @422 ;首先去判断循环条件

@366:

;下面程序段类似算法研究程序里的 printf("%d ",x[i]);

MOV DL,x[SI]

ADD DL,'0' ;转换为 ASCII 字符

MOV AH,2

INT 21h

MOV DL,' ' ;打印一个空格

MOV AH,2

INT 21h

INC SI ;循环变量+1

@422:

CMP SI,N ;判断是否结束 i 循环

JB @366

MOV AX,4c00h ;调用 DOS 中断,返回系统

INT 21h

_main ENDP

END _main

【1002】今有一堆苹果,如果每次拿走 2 个,最后剩下 1 个;如果每次拿走 3 个,最后

剩下 2 个;如果每次拿走 5 个,最后剩下 4 个;如果每次拿走 6 个,最后剩下 5 个;只有当

每次拿走 7个时,才能拿完。问这堆苹果最少有多少个?

算法思路:

首先给苹果数 X 一个初值,使其满足除 2 余 1的条件,然后再用其他条件判断,看它是

否满足要求,若不满足则给 X 增加,直到找到符合要求的数字。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

unsigned int x;

x=3;

while(1)

{

if (x%2==1 && x%3==2 && x%5==4 && x%6==5 &&x%7==0)

break;

Page 275: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·271·

x++;

}

printf("%d\n",x);

}

汇编语言程序如下:

.model small

.data

f1 DB '%d',10,0

.code

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

MOV CX,3

;下面程序段类似算法研究程序里的 while(1)

@30:

;下面程序段类似算法研究程序里的 if (x%2==1 && x%3==2 && x%5==4 && x%6= =5

&& x%7= =0) break;

MOV AX,CX

AND AX,1 ;通过最低位可以判断奇数、偶数

CMP AX,1 ;x%2==1

JNE @170

MOV AX,CX

MOV BX,3

XOR DX,DX

DIV BX

CMP DX,2 ;x%3==2

JNE @170

MOV AX,CX

MOV BX,5

XOR DX,DX

DIV BX

CMP DX,4 ;x%5==4

Page 276: IBM-PC 汇编语言程序设计试题解

·272· IBM-PC 汇编语言程序设计试题解

JNE @170

MOV AX,CX

MOV BX,6

XOR DX,DX

DIV BX

CMP DX,5 ;x%6==5

JNE @170

MOV AX,CX

MOV BX,7

XOR DX,DX

DIV BX

OR DX,DX

JE @198 ;x%7==0

@170:

INC CX ;x++

JMP @30 ;while(1){}循环,没有判断是否结束循

环的步骤

@198:

;下面程序段类似算法研究程序里的 printf("%d\n",x);

PUSH CX

LEA AX,f1

PUSH AX

CALL _printf

POP AX

POP CX

RET

_main ENDP

END _start

【1003】在公元 5 世纪,我国一部数学著作《张邱建算经》里有一个著名的数学问题:

设公鸡每只价 5 元,母鸡每只价 3 元,小鸡 3 只价 1 元。今用 100 元钱买鸡 100只,问买公

鸡、母鸡、小鸡各多少只?在数学史上,这类问题就叫做“百鸡问题”。

算法思路:

“百鸡问题”是一次不定方程求正数解的问题,即公鸡、母鸡、小鸡必须是小于 100 的

正整数。在计算机程序中,我们可以用枚举的方法找出答案。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

Page 277: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·273·

unsigned int i,j,k;

for(i=1;i<=20;i++)

{

for(j=1;j<=33;j++)

{

k=100− i− j;

if (k%3!=0) continue;

if(i*5+j*3+k/3==100)

{

printf("%d %d %d\n",i,j,k);

}

}

}

}

汇编语言程序如下:

.model small

.data ;定义数据段

f1 db 'I=%02d J=%02d K=%02d',10,0

;用 si 代替算法研究程序里的 i

;用 di 代替算法研究程序里的 j

;用 cx 代替算法研究程序里的 k

.code

extrn _printf:near ;使用库函数_printf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_main PROC near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 for(i=1;i<=20;i++)

mov si,1

jmp @254 ;首先去判断循环条件

@58:

;下面程序段类似算法研究程序里的 for(j=1;j<=33;j++)

mov di,1

jmp @198 ;首先去判断循环条件

Page 278: IBM-PC 汇编语言程序设计试题解

·274· IBM-PC 汇编语言程序设计试题解

@86:

;下面程序段类似算法研究程序里的 k=100− i− j

mov cx,100

sub cx,si

sub cx,di

;下面程序段类似算法研究程序里的 if (k%3!=0) continue

mov ax,cx

mov bx,3

xor dx,dx

div bx

or dx,dx ;获得标志位

jne @170

;下面程序段类似算法研究程序里的 if(i*5+j*3+k/3==100)

mov ax,si

mov dx,5

imul dx ;(ax)=i*5

push ax

mov ax,di

mov dx,3

imul dx ;(ax)=j*3

pop dx

add dx,ax ;(dx)=i*5+j*3

push dx

mov ax,cx

mov bx,3

xor dx,dx

div bx ;(ax)=k/3

pop dx

add dx,ax ;(dx)=i*5+j*3+k/3

cmp dx,100

jne @170

;下面程序段类似算法研究程序里的 printf("%d %d %d\n",i,j,k)

push cx ;利用堆栈传递函数参数

push di

push si

mov ax,offset f1

push ax

call _printf

add sp,8 ;恢复堆栈

Page 279: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·275·

@170:

inc di ;循环变量+1

@198:

cmp di,33 ;判断是否结束 j 循环

jbe @86

inc si ;循环变量+1

@254:

cmp si,20 ;判断是否结束 i 循环

jbe @58

ret

_main endp

end _start

【1004】编密码。按以下规律编码:

字母 A 变为 E,a 变为 e,即变成其后的第 4 个字母,W 变为 A,X 变为 B,Y 变为 C,Z

变为 D,非字母不变。如“China!”变为“Glmre!”。

算法思路:

本题要使用循环方法从头到尾对要编密码的字符串中每个字符进行处理。在处理每个字

符时,要用条件判断的方法来决定该字符是否是字母等。

假设题目中要编密码的字符串符合 C 语言的标准,即以 ASCII 码为 0 的字符表示字符串

的结束。

C 语言编写的算法研究程序:

void main(void)

{

char c[]="China";

int n=0;

while (c[n]!= '\0')

{

if ((c[n]>= 'a' && c[n]<= 'z')||(c[n]>= 'A' && c[n]<=

'Z'))

{

c[n]+=4;

if (c[n]> 'Z' && c[n]<= 'Z'+4 || c[n]>

'z' )

{

c[n]− =26;

}

}

n++;

Page 280: IBM-PC 汇编语言程序设计试题解

·276· IBM-PC 汇编语言程序设计试题解

}

}

汇编语言程序如下:

.model small

.data ;定义数据段

c db 'China',0 ;要编密码的字符串,c 为数组首地址

.code ;定义代码段

_main PROC near

mov ax,@data ;取数据段地址

mov ds,ax

lea bx,c ;取字符串的首地址

xor si,si ;si 为循环变量,相当算法研究程序的 n

jmp @310 ;取判断循环条件

@158: cmp byte ptr[bx+si],'a' ;c[n]与'a'比较

jl @144

cmp byte ptr[bx+si],'z'

jle @170

@144: cmp byte ptr[bx+si],'A'

jl @282

cmp byte ptr[bx+si],'Z'

jg @282

@170: mov al,byte ptr[bx+si]

add al,4 ;al=al+4

mov byte ptr[bx+si],al ;保存到 c[n]

cmp byte ptr[bx+si],'Z'

jle @226

cmp byte ptr[bx+si],94 ;'Z'+4

jle @254

@226: cmp byte ptr[bx+si],'z'

jle @282

@254: mov al,byte ptr[bx+si]

add al,230 ;al=al− 26

mov byte ptr[bx+si],al

@282: inc si

@310: cmp byte ptr[bx+si],0

jne @158

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main ENDP

Page 281: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·277·

END _main

【1005】验证数论中的角谷猜想。角谷猜想为:对任何一个给定的正整数,若为奇数,

则乘 3 加 1;若为偶数,则除以 2,所得的结果重复以上步骤,经过有限步后,必得整数 1。

算法思路:

本题可以利用 while 循环结构,直到计算结果为 1,循环结束。在循环中判断计算结果

是奇数还是偶数,根据判断结果做相应的运算。

C 语言编写的算法研究程序:

unsigned int odd(unsigned int i)

{

printf("%05d",i);

i=i*3+1;

printf("*3+1=");

printf("%05d",i);

printf("\r\n");

return(i);

}

unsigned int even(unsigned int i)

{

printf("%05d",i);

i=i/2;

printf("/2=");

printf("%05d",i);

printf("\r\n");

return(i);

}

void main(void)

{

unsigned int i;

printf("Input integer data=");

scanf("%u",&i);

while(i!=1)

{

if (i%2==0) i=even(i);

else i=odd(i);

}

Page 282: IBM-PC 汇编语言程序设计试题解

·278· IBM-PC 汇编语言程序设计试题解

}

汇编语言程序如下:

.model small

.data

f2 db ' *3+1= ','$'

CRLF db 13,10,'$'

f6 db ' /2 = ','$'

f8 db 'Input integer data=','$'

f9 db '%u',0

i dw ?

s db 50,0 ;用 DOS 0AH功能从键盘读取数据,字符

串的头信息

str db 50 dup(0) ;从键盘读取的字符串,以回车符表示字

串的结束

.code

_val proc near ;字符串转换到数字的子程序

PUSH BP

MOV BP,SP

MOV AX,[BP+4] ;取要转换的字符串首地址

PUSH SI

mov si,ax

mov ax,0 ;结果=0

jmp @010

@005:

mov bx,10 ;十进制的输入方式

mul bx

mov bl,[si]

mov bh,0

sub bx,'0' ;ASCII 字符转化为数字

add ax,bx ;结果=结果*10+新数字

inc si

@010:

cmp byte ptr[si],13 ;判断是否结束

jne @005

;ax 是返回的数字

POP SI

POP BP

Page 283: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·279·

RET

_val endp

DISP PROC NEAR

PUSH BP

MOV BP,SP

MOV AX,[BP+4] ;取要显示的数字

PUSH SI

MOV SI,0 ;设置循环初始

JMP @100 ;先去判断循环条件

@50:

MOV DX,0

MOV BX,10 ;以十进制形式显示

DIV BX

PUSH DX ;利用堆栈依次保存个位、十位、....

INC SI ;循环变量+1

@100:

CMP SI,5 ;判断是否结束循环,共显示 5 位数字

JL @50

MOV SI,0 ;设置循环初始

JMP @200 ;先去判断循环条件

@150:

POP DX ;从堆栈中依次弹出...、十位、个位

ADD DL,30H ;转换为 ASCII 码

MOV AH,2

PUSH SI ;防止 DOS 中断改变 SI

INT 21H ;调用 DOS 中断显示一个字符

POP SI ;恢复 SI

INC SI ;循环变量+1

@200:

CMP SI,5 ;判断是否结束循环,共显示 5 位数字

JL @150

POP SI

POP BP

RET

DISP ENDP

_odd proc near

push bp

Page 284: IBM-PC 汇编语言程序设计试题解

·280· IBM-PC 汇编语言程序设计试题解

mov bp,sp

push si

mov si,[bp+4] ;取传递来的数字

push si

call DISP ;printf("%05d",i)

pop si

;下面程序段类似算法研究程序里的 i=i*3+1

mov ax,si

mov dx,3

mul dx

inc ax

mov si,ax

mov dx,offset f2 ;printf("*3+1=")

mov ah,9

int 21h

push si

call DISP ;printf("%05d",i);

pop si

mov dx,offset CRLF ;printf("\r\n")

mov ah,9

int 21h

mov ax,si ;return(i)

pop si

pop bp

ret

_odd endp

_even proc near

push bp

mov bp,sp

push si

mov si,[bp+4] ;取传递来的数字

push si

Page 285: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·281·

call DISP ;printf("%05d",i);

pop si

shr si,1 ;i=i/2

mov dx,offset f6 ;printf("/2=");

mov ah,9

int 21h

push si

call DISP ;printf("%05d",i);

pop si

mov dx,offset CRLF ;printf("\r\n")

mov ah,9

int 21h

mov ax,si ;return(i)

pop si

pop bp

ret

_even endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

mov dx,offset f8 ;printf("Input integer data=")

mov ah,9

int 21h

lea dx,s ;gets(s)

mov ah,0ah

int 21h

mov dx,offset CRLF ;printf("\r\n")

mov ah,9

int 21h

lea ax,str

Page 286: IBM-PC 汇编语言程序设计试题解

·282· IBM-PC 汇编语言程序设计试题解

push ax

call _val ;ax=val(str)

pop cx

mov i,ax

;下面程序段类似算法研究程序里的 while(i!=1)

jmp @170 ;先去判断循环条件

@58:

;下面程序段类似算法研究程序里的 if (i%2==0) i=even(i)

test i,1 ;如果数字比特 0 是 1,则数字是奇数

jne @114

push i

call _even

jmp @142

@114:

;下面程序段类似算法研究程序里的 else i=odd(i)

push i

call _odd

@142:

pop cx

mov i,ax

@170:

cmp i,1 ;判断是否结束循环,得到了 1 就算证明

角谷猜想

jne @58

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main endp

end _main

【1006】有 15 个数有序存放在一数组 a[15]中,针对一个数 number,要求用折半查找法找

出该数是数组中的第几个元素的值,如该数的值超范围,则打印“− 1”,不在数组中,则打印“0”。

算法思路:

半查找法的原理有很多书籍都有介绍,我们给出 C 语言的源程序供读者参考。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

#define N 15

Page 287: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·283·

int number=34,top=0;

int bottom=N− 1,mid,find=0;

int a[15]={1,3,4,5,6,8,12,23,34,44,45,56,57,58,68};

void main(void)

{

if ((number <a[0]) || (number >a[N− 1])) find=− 1;

while ((find==0) && (top<=bottom))

{

mid=(bottom+top)/2;

if (number==a[mid])

{

find=mid+1;

}

else

{

if (number<a[min]) bottom=mid− 1;

else top=mid+1;

}

}

printf("%d\n",find);

}

汇编语言程序如下:

N equ 15

.model small

.data ;定义数据段

a dw 1,3,4,5,6,8,12,23,34,44,45,56,57,58,68

number dw 34

top dw 0

bottom dw N− 1

mid dw ?

find dw 0

format1 db '%d',10,0

.code ;定义代码段

extrn _printf:near ;使用库函数_printf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

Page 288: IBM-PC 汇编语言程序设计试题解

·284· IBM-PC 汇编语言程序设计试题解

_main proc near

mov ax,@data ;取 data 段地址

mov ds,ax

mov di,number ;把要查找的数存到 di 中

cmp di,a[0] ;与最小值比较

jl @86

cmp di,a[28] ;与最大值比较

jle @114

@86: mov find,− 1 ;设置超范围标记

@114: jmp @282

@142:

mov ax,bottom

add ax,top

cwd ;考虑负数的四舍五入

sub ax,dx

sar ax,1 ;取中值

mov si,ax ;si 相当于算法研究程序里的 mid

mov bx,si

shl bx,1 ;为了查 WORD 类型的表所做的乘 2 处理

lea ax,a[0] ;取表的首地址

add bx,ax ;首地址与偏移相加

cmp word ptr[bx],di ;数组元素的值(中值)与要查找的值比较

jne @198

mov ax,si ;找到了

inc ax ;在屏幕上打印的数组下标要从 1 开始

mov find,ax ;数组下标存入 find

jmp @282

@198: mov bx,si ;没有找到

shl bx,1

lea ax,a[0]

add bx,ax

cmp word ptr[bx],di ;数组元素的值(中值)与要查找的值比较

jle @254

mov ax,si ;中值大于要查找的值

dec ax ;由于 bottom 点已经比较过了,所以下次

较时不再需要

mov bottom,ax ;移动 bottom

jmp @282

Page 289: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·285·

@254: mov ax,si ;中值小于要查找的值

inc ax ;由于 top 点已经比较过了,所以下次比较

时不再需要

mov top,ax ;移动 top

@282: cmp find,0 ;循环条件的判断

jne @338

mov ax,top

cmp ax,bottom

jle @142 ;如果 top、bottom 没有交换位置,则还要

继续查找

@338: ;下面程序段类似 printf("%d\n",find)的

功能

push find

mov ax,offset format1

push ax ;格式字符串入栈

call _printf ;在屏幕上打印数值的子程序

add sp,4 ;恢复栈指针,调用前入栈两次,空弹出 4

字节

;屏幕打印结束

ret

_main endp

END _start

【1007】中央电视台有一个娱乐性的节目,节目的名称是《幸运 52》。节目中有一个猜商

品价格的活动,具体做法是:主持人出示一件商品,由参加者猜这个商品的价格,主持人针

对参加者猜出的价格,仅告知“高”、“低”和“正确”。猜价格的过程可以反复进行,如果猜

对了,则参加者就赢得这个商品。当然,猜价格的时间是被限制的,参加者必须在规定的时

间内猜对,否则就算失败。假设商品的价格在 0~65535 元之间,请你编写一计算机猜价格的

程序,猜价格的次数越少越好。

算法思路:

本题可以用“折半查找算法”来解决。要查找的值就是商品的价格,查找的范围是 0~

65535。与“折半查找算法”略有不同的是:比较的过程不是由程序执行的,而是由参加者来

做,比较的结果也需要参加者来告知计算机。

我们提供的答案程序所采用的算法类似“折半查找算法”,可以称做逐次比较法。程序

运行时,首先在屏幕上显示一个表示商品价格的数字,参加者通过键盘告知程序这个数字是

“高”、“低”或“正确”,当然,要保证商品价格是固定不变的。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

unsigned int ArryToI(char *a)

Page 290: IBM-PC 汇编语言程序设计试题解

·286· IBM-PC 汇编语言程序设计试题解

{

unsigned char i;

unsigned int x;

for(i=0;i<16;i++)

{

x=x*2+(a[i]− '0');

}

return(x);

}

void main(void)

{

unsigned char a[16]="0000000000000000";

unsigned char i,c;

for (i=0;i<16;i++)

{

a[i]='1';

printf("\r\n%02d: %05u Up Low Yes?",i+1,

ArryToI(a));

c=getch();

if ((c=='u')||(c=='U')) a[i]='0';

if ((c=='y')||(c=='Y')) break;

}

}

汇编语言程序如下:

.model small

.data ;定义数据段

a db 16 dup('0')

f1 db 13,10,'%02d: %05u Up Low Yes?',0

i db ?

;用 cl 代替算法研究程序里的 c

.code

extrn _printf:near ;使用库函数_printf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

Page 291: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·287·

_ArryToI proc near

push bp

mov bp,sp

push si

;用 cl 代替算法研究程序里的 i

;用 si 代替算法研究程序里的 x

;下面程序段类似算法研究程序里的 for(i=0;i<16;i++)

mov cl,0

jmp @100 ;首先去判断循环条件

@50:

;下面程序段类似算法研究程序里的 x=x*2+(a[i]− '0')

mov al,cl

mov ah,0

mov bx,[bp+4] ;在堆栈中取出传递来的数组首地址

add bx,ax

mov al,[bx] ;(al)=a[i]

cbw

add ax,− '0' ;(ax)=a[i]− '0'

shl si,1 ;x=x*2

add si,ax ;x=x*2+(a[i]− '0')

inc cl ;循环变量+1

@100:

cmp cl,16 ;判断是否结束 i 循环

jb @50

;下面程序段类似算法研究程序里的 return(x)

mov ax,si ;利用 ax 传递函数返回值

pop si

pop bp

ret

_ArryToI endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 for (i=0;i<16;i++)

mov i,0

jmp @226 ;首先去判断循环条件

@58:

Page 292: IBM-PC 汇编语言程序设计试题解

·288· IBM-PC 汇编语言程序设计试题解

;下面程序段类似算法研究程序里的 a[i]='1'

mov bl,i

mov bh,0

mov a[bx],'1'

; 下面程序 段类似算法研究程序里的 printf("\r\n%02d: %05u Up Low

Yes?",i+1,mid(a))

lea ax,a

push ax

call _ArryToI ;(ax)=_maid(a)

pop cx

push ax ;利用堆栈将参数传递到函数

mov al,i

mov ah,0

inc ax ;i+1

push ax

mov ax,offset f1

push ax

call _printf

add sp,6 ;恢复堆栈

;下面程序段类似算法研究程序里的 c=getch()

mov ah,1 ;DOS 中断,键盘输入,返回在(al)中

int 21h

mov cl,al

;下面程序段类似算法研究程序里的 if ((c=='u')||(c=='U')) a[i]='0'

cmp cl,'u'

je @114

cmp cl,'U'

jne @142

@114:

mov bl,i

mov bh,0

mov a[bx],'0'

@142:

;下面程序段类似算法研究程序里的 if ((c=='y')||(c=='Y')) break

cmp cl,'y'

je @254

cmp cl,'Y'

je @254

Page 293: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·289·

inc i ;循环变量+1

@226:

cmp i,16 ;判断是否结束 i 循环

jb @58

@254:

ret

_main endp

end _start

【1008】从键盘输入 2 个整数,输出其最大公约数和最小公倍数。

算法思路:

利用“辗转相除法”

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

int a,b,num1,num2,temp;

printf("Input number1 (BCD) ####");

scanf("%d",&num1);

printf("Input number2 (BCD) ####");

scanf("%d",&num2);

if (num1>num2)

{

temp=num1;num1=num2;num2=temp;

}

a=num1;b=num2;

while (b!=0)

{

temp=a%b;

a=b;

b=temp;

}

b=num1*num2/a;

printf("max. :%d\n",a);

printf("min. :%d\n",b);

}

汇编语言程序如下:

.model small

.data

Page 294: IBM-PC 汇编语言程序设计试题解

·290· IBM-PC 汇编语言程序设计试题解

f1 db 'Input number1 (BCD) ####',0

f2 db '%d',0

f3 db 'Input number2 (BCD) ####',0

f4 db '%d',0

f5 db 'max. :%d',10,0

f6 db 'min. :%d',10,0

num1 dw ?

num2 dw ?

; 用 bx 代替算法研究程序里的 a

; 用 si 代替算法研究程序里的 b

; 用 cx 代替算法研究程序里的 temp

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("Input number1 (BCD) ####")

mov ax,offset f1

push ax

call _printf

pop cx

;下面程序段类似算法研究程序里的 scanf("%d",&num1)

lea ax,num1

push ax

mov ax,offset f2

push ax

call _scanf

pop cx

pop cx

;下面程序段类似算法研究程序里的 printf("Input number2 (BCD) ####")

mov ax,offset f3

push ax

Page 295: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·291·

call _printf

pop cx

;下面程序段类似算法研究程序里的 scanf("%d",&num2)

lea ax,num2

push ax

mov ax,offset f4

push ax

call near ptr _scanf

pop cx

pop cx

;下面程序段类似算法研究程序里的 if (num1>num2)

mov ax,num1

cmp ax,num2

jle @86

;下面程序段类似算法研究程序里的 temp=num1;num1=num2;num2=temp

mov cx,num1

mov ax,num2

mov num1,ax

mov num2,cx

@86:

;下面程序段类似算法研究程序里的 a=num1;b=num2

mov bx,num1

mov si,num2

;下面程序段类似算法研究程序里的 while (b!=0)

jmp @142 ;首先去判断循环条件

@114:

mov ax,bx ;算法研究程序里的 temp=a%b

cwd

idiv si

mov cx,dx

mov bx,si ;算法研究程序里的 a=b

mov si,cx ;算法研究程序里的 b=temp

@142: ;判断循环条件的程序段

or si,si

jne @114 ;循环条件满足则去@114

mov ax,num1 ;算法研究程序里的 b=num1*num2/a

imul num2

cwd

idiv bx

Page 296: IBM-PC 汇编语言程序设计试题解

·292· IBM-PC 汇编语言程序设计试题解

mov si,ax

;下面程序段类似算法研究程序里的 printf("max. :%d\n",a)

push bx

mov ax,offset f5

push ax

call _printf

pop cx

pop cx

;下面程序段类似算法研究程序里的 printf("min. :%d\n",b)

push si

mov ax,offset f6

push ax

call _printf

pop cx

pop cx

ret

_main endp

end _start

【1009】打印所有“水仙花数”。(“水仙花数”:三位数,各位数字的立方和为数字本身,

例如:153=13+5

3+3

3)

算法思路:

本题可以用循环程序筛选,在循环中判断。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

int i,j,k,n;

printf("The number is : ");

for (n=100;n<1000;n++)

{

i=(n/100) % 10;

j=(n/10) % 10;

k=(n/1) %10;

if ((i*i*i+j*j*j+k*k*k)==n) printf("%d ",n);

}

}

汇编语言程序如下:

.model small

Page 297: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·293·

.data

f1 db 'The number is : ',0

f2 db '%d ',0

; 用 di 代替 j

; 用 si 代替 n

; 用 cx 代替 i

; 用 bx 代替 k

.code

extrn _printf:near ;使用库函数_printf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("The number is : ")

mov ax,offset f1

push ax

call _printf

pop cx

;下面程序段类似算法研究程序里的 for (n=100;n<1000;n++)

mov si,100 ;n=100

jmp @142 ;先去判断循环条件

@58:

;下面程序段类似算法研究程序里的 i=(n/100) % 10

mov ax,si

mov bx,100

cwd

idiv bx

mov bx,10

cwd

idiv bx

mov cx,dx

;下面程序段类似算法研究程序里的 j=(n/10) % 10

mov ax,si

cwd

Page 298: IBM-PC 汇编语言程序设计试题解

·294· IBM-PC 汇编语言程序设计试题解

idiv bx

cwd

idiv bx

mov di,dx

;下面程序段类似算法研究程序里的 k=(n/1) %10

mov ax,si

cwd

idiv bx

mov bx,dx

;下面程序段类似算法研究程序里的 if ((i*i*i+j*j*j+k*k*k)==n)

mov ax,cx

imul cx

imul cx ;i*i*i

push ax ;利用堆栈保存 i*i*i

mov ax,di

imul di

imul di ;j*j*j

pop dx

add dx,ax

push dx ;利用堆栈保存 i*i*i+j*j*j

mov ax,bx

imul bx

imul bx ;k*k*k

pop dx

add dx,ax ;dx=i*i*i+j*j*j+k*k*k

cmp dx,si

jne @114 ;不是“水仙花数”则不打印

;下面程序段类似算法研究程序里的 printf("%d ",n)

push si

mov ax,offset f2

push ax

call _printf

pop cx

pop cx

@114:

inc si ;循环变量+1

@142:

cmp si,1000 ;判断是否结束循环

jl @58

Page 299: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·295·

ret

_main endp

end _start

【1010】从键盘输入一个数,判断其是否为素数,显示结果。

算法思路:

设要判断是否为素数的数字存在 number 变量里,如果从 2 到 number 的所有数都不能

整除该数,则为素数。程序可以由一个循环结构来实现。编写汇编语言程序时求开方较复杂,

我们用 number/2 代替 number ,这样做的代价是增加了循环次数。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

int is_prime(int number)

{

int flag=1,n;

for(n=2;n<number/2 && flag==1;n++)

{

if (number%n == 0) flag=0;

}

return(flag);

}

void main(void)

{

int number;

printf("Please input a (BCD) : ");

scanf("%d",&number);

if (is_prime(number)) printf("\n %d is prime.",number);

else printf("\n %d is not prime.",number);

}

汇编语言程序如下:

.model small

.data

f1 db 'Please input a (BCD) : ',0

f2 db '%d',0

f3 db 10,' %d is prime.',0

f4 db 10,' %d is not prime.',0

number dw ?

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

Page 300: IBM-PC 汇编语言程序设计试题解

·296· IBM-PC 汇编语言程序设计试题解

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

is_prime proc near

push bp

mov bp,sp

push si

mov si,word ptr [bp+4]

push bx

push cx

push dx

;用 bx 代替 n

;用 cx 代替 flag

;用 si 代替 number

mov cx,1 ;flag=1

;下面程序段类似算法研究程序里的 for(n=2;n<number/2 && flag==1;n++)

mov bx,2 ;设置循环变量初始值

jmp @142 ;先取判断循环条件

@58:

;下面程序段类似算法研究程序里的 if (number%n == 0) flag=0;

mov ax,si

cwd

idiv bx ;dx=number%n

or dx,dx

jne @115

xor cx,cx ;flag=0

@115:

inc bx ;循环变量+1

@142: ;循环结束条件的判断

mov ax,si

cwd

sub ax,dx

sar ax,1 ;number/2

cmp ax,bx

jle @198

cmp cx,1

Page 301: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·297·

je @58

@198:

;函数的返回值通过 ax 传递

mov ax,cx

pop dx

pop cx

pop bx

pop si

pop bp

ret

is_prime endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("Please input a (BCD) : ")

mov ax,offset f1

push ax

call _printf

pop cx

;下面程序段类似算法研究程序里的 scanf("%d",&number)

lea ax,number

push ax

mov ax,offset f2

push ax

call _scanf

pop cx

pop cx

;下面程序段类似算法研究程序里的 if (is_prime(number))

push number

call is_prime

pop cx

or ax,ax ;判断返回值

je @86

;下面程序段类似算法研究程序里的 printf("\n %d is prime.",number)

push number

mov ax,offset f3

push ax

call _printf

Page 302: IBM-PC 汇编语言程序设计试题解

·298· IBM-PC 汇编语言程序设计试题解

add sp,4

jmp @114

@86:

;下面程序段类似算法研究程序里的 printf("\n %d is not prime.",number)

push number

mov ax,offset f4

push ax

call _printf

pop cx

pop cx

@114:

ret

_main endp

end _start

【1011】求 10 到 200 之间的孪生素数对。孪生素数对指两值相差为 2 的一对素数,如 11

与 13;17 与 19;…

算法思路:

本题可以用循环程序筛选,在循环中判断,对符合要求的数字予以打印。

判断是否为素数的子程序与上题参考答案中的相同。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

int is_prime(int number)

{

int flag=1,n;

for(n=2;n<number/2 && flag==1;n++)

{

if (number%n == 0) flag=0;

}

return(flag);

}

void main(void)

{

unsigned int i;

for(i=3;i<=200− 2;i+=2)

{

if (is_prime(i)==1 && is_prime(i+2)==1)

printf("%03d %03d\

n",i,i+2);

Page 303: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·299·

}

}

汇编语言程序如下:

.model small

.data

f1 db '%03d %03d',10,0

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

is_prime proc near

push bp

mov bp,sp

push si

mov si,[bp+4] ;从堆栈里取出传递来的数据

push bx

push cx

push dx

;用 bx 代替算法研究程序里的 n

;用 cx 代替算法研究程序里的 flag

;用 si 代替算法研究程序里的 number

mov cx,1 ;flag=1

;下面程序段类似算法研究程序里的 for(n=2;n<number/2 && flag==1;n++)

mov bx,2 ;设置循环变量初始值

jmp @142 ;先取判断循环条件

@58:

;下面程序段类似算法研究程序里的 if (number%n == 0) flag=0

mov ax,si

cwd

idiv bx ;dx=number%n

or dx,dx

jne @115

xor cx,cx ;flag=0

@115:

Page 304: IBM-PC 汇编语言程序设计试题解

·300· IBM-PC 汇编语言程序设计试题解

inc bx ;循环变量+1

@142: ;循环结束条件的判断

mov ax,si

cwd

sub ax,dx

sar ax,1 ;number/2

cmp ax,bx

jle @198

cmp cx,1

je @58

@198:

;函数的返回值通过 ax 传递

mov ax,cx

pop dx

pop cx

pop bx

pop si

pop bp

ret

is_prime endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

; unsigned int i;

;下面程序段类似算法研究程序里的 for(i=3;i<=200− 2;i+=2)

mov si,3

jmp @700

@500:

;下面程序段类似算法研究程序里的 if (is_prime(i)==1 && is_prime(i+2)==1)

push si ;is_prime(i)==1

call is_prime

pop si

cmp ax,1

jne @600

mov ax,si ;is_prime(i+2)==1

add ax,2

push ax ;利用堆栈传递数据

call is_prime ;调用判断素数的函数

Page 305: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·301·

pop cx ;恢复堆栈

cmp ax,1

jne @600

;下面程序段类似算法研究程序里的 printf("%03d %03d\n",i,i+2)

mov ax,si

add ax,2

push ax ;利用堆栈传递数据

push si

mov ax,offset f1

push ax

call _printf

add sp,6 ;恢复堆栈

@600:

add si,2 ;循环变量+2

@700:

cmp si,198 ;判断是否结束 i 循环

jbe @500

ret

_main endp

end _start

【1012】如果一个数从左边和从右边读都是相同的数,就称它为回文数,例如 383。求出

1000 以内既是回文数又是素数的自然数。

算法思路:

利用两个 for 循环生成回文数(i*101+j*10),然后再判断该回文数是否为素数。

判断是否为素数的子程序与本章第 17 题参考答案中的相同。

C 语言编写的算法研究程序:

int is_prime(int number)

{

int flag=1,n;

for(n=2;n<number/2 && flag==1;n++)

{

if (number%n == 0) flag=0;

}

return(flag);

}

void main(void)

{

int i,j;

Page 306: IBM-PC 汇编语言程序设计试题解

·302· IBM-PC 汇编语言程序设计试题解

printf("\r\n");

for (i=1;i<10;i+=2)

{

for (j=0;j<=9;j++)

{

if (is_prime(i*101+j*10)==0)

continue;

else printf("%d\r\n",i*101+j*10);

}

}

}

汇编语言程序如下:

.model small

.data

;用 si 代替算法研究程序里的 i

;用 di 代替算法研究程序里的 j

CRLF db 13,10,'$'

.code

DISP PROC NEAR

PUSH BP

MOV BP,SP

MOV AX,[BP+4] ;取要显示的数字

PUSH SI

MOV SI,0 ;设置循环初始

JMP @100 ;先去判断循环条件

@50:

MOV DX,0

MOV BX,10 ;以 10 进制形式显示

DIV BX

PUSH DX ;利用堆栈依次保存个位、十位、....

INC SI ;循环变量+1

@100:

CMP SI,3 ;判断是否结束循环,共显示 3 位数字

JL @50

MOV SI,0 ;设置循环初始

JMP @200 ;先去判断循环条件

@150:

Page 307: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·303·

POP DX ;从堆栈中依次弹出...、十位、个位

ADD DL,30H ;转换为 ASCII 码

MOV AH,2

PUSH SI ;防止 DOS 中断改变 SI

INT 21H ;调用 DOS 中断显示一个字符

POP SI ;恢复 SI

INC SI ;循环变量+1

@200:

CMP SI,3 ;判断是否结束循环,共显示 3 位数字

JL @150

POP SI

POP BP

RET

DISP ENDP

is_prime proc near

push bp

mov bp,sp

push si

mov si,[bp+4] ;取要判断的数字

push bx

push cx

push dx

;用 bx 代替算法研究程序里的 n

;用 cx 代替算法研究程序里的 flag

;用 si 代替算法研究程序里的 number

mov cx,1 ;flag=1

;下面程序段类似算法研究程序里的 for(n=2;n<number/2 && flag==1;n++)

mov bx,2 ;设置循环变量初始值

jmp @360 ;先取判断循环条件

@300:

;下面程序段类似算法研究程序里的 if (number%n == 0) flag=0

mov ax,si

cwd

idiv bx ;dx=number%n

or dx,dx

jne @350

xor cx,cx ;flag=0

@350:

Page 308: IBM-PC 汇编语言程序设计试题解

·304· IBM-PC 汇编语言程序设计试题解

inc bx ;循环变量+1

@360: ;循环结束条件的判断

mov ax,si

cwd

sub ax,dx

sar ax,1 ;number/2

cmp ax,bx

jle @380

cmp cx,1

je @300

@380:

;函数的返回值通过 ax 传递

mov ax,cx

pop dx

pop cx

pop bx

pop si

pop bp

ret

is_prime endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

mov dx,offset CRLF ;printf("\r\n")

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 for (i=1;i<10;i+=2)

mov si,1

jmp @226

@58:

;下面程序段类似算法研究程序里的 for (j=0;j<=9;j++)

xor di,di ;j=0

jmp @170 ;先去判断循环条件

@86:

;下面程序段类似算法研究程序里的 if (is_prime(i*101+j*10)==0) continue

mov ax,si

mov dx,101

imul dx

Page 309: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·305·

push ax ;(ax)=i*101

mov ax,di

mov dx,10

imul dx ;(ax)=j*10

pop dx

add dx,ax ;(dx)=i*101+j*10

push dx ;利用堆栈传递参数

call is_prime

pop dx

or ax,ax ;(ax)是 is_prime 返回的值

je @142

;下面程序段类似算法研究程序里的 else printf("%d\r\n",i*101+j*10)

push dx

call DISP

pop dx

push si ;防止 DOS 中断改变 si,di

push di

mov dx,offset CRLF

mov ah,9

int 21h

pop di ;恢复 di,si

pop si

@142:

inc di ;j++

@170:

cmp di,9 ;判断是否结束 j 循环

jle @86

add si,2 ;i=i+2;

@226:

cmp si,10 ;判断是否结束 i 循环

jl @58

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main endp

end _main

【1013】打印出 1000 以内同时满足如下条件的数:

(1)个位数与十位数之和除以 10 所得的余数等于百位数字;

(2)该数为素数。

Page 310: IBM-PC 汇编语言程序设计试题解

·306· IBM-PC 汇编语言程序设计试题解

算法思路:

本题可以用循环程序筛选,在循环中判断。

判断素数的方法是:如果 number 不能被 2 到 number 的所有数整除,则 number 为素

数。子程序 is_prime 由一个循环结构来实现。编写汇编语言程序时求开方较复杂,我们用

number/2 代替 number ,这样做的代价是增加了循环次数。

C 语言编写的算法研究程序:

int is_prime(int number)

{

int flag=1,n;

for(n=2;n<number/2 && flag==1;n++)

{

if (number%n == 0) flag=0;

}

return(flag);

}

void main(void)

{

int a,b,c,i;

printf("\r\n");

for (i=3;i<1000;i++)

{

if (is_prime(i)==0) continue;

a=i/100;

b=(i/10)%10;

c=i%10;

if (((b+c)%10)==a) printf("%03d\r\n",i);

}

}

汇编语言程序如下:

.model small

.data

f1 dw 13,10,'$'

a dw ? ;算法研究程序里的 a

b dw ? ;算法研究程序里的 b

c dw ? ;算法研究程序里的 b

;用 si 代替算法研究程序里的 i

.code

Page 311: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·307·

is_prime proc near

push bp

mov bp,sp

push si

mov si,[bp+4] ;取要判断的数字

push bx

push cx

push dx

;用 bx 代替 n

;用 cx 代替 flag

;用 si 代替 number

mov cx,1 ;flag=1

;下面程序段类似算法研究程序里的 for(n=2;n<number/2 && flag==1;n++)

mov bx,2 ;设置循环变量初始值

jmp @142 ;先取判断循环条件

@58:

;下面程序段类似算法研究程序里的 if (number%n == 0) flag=0

mov ax,si

cwd

idiv bx ;dx=number%n

or dx,dx

jne @115

xor cx,cx ;flag=0

@115:

inc bx ;循环变量+1

@142: ;循环结束条件的判断

mov ax,si

cwd

sub ax,dx

sar ax,1 ;number/2

cmp ax,bx

jle @198

cmp cx,1

je @58

@198:

;函数的返回值通过 ax 传递

mov ax,cx

pop dx

Page 312: IBM-PC 汇编语言程序设计试题解

·308· IBM-PC 汇编语言程序设计试题解

pop cx

pop bx

pop si

pop bp

ret

is_prime endp

;在屏幕上以某指定进制形式显示整型数据的子程序

DISP PROC NEAR

PUSH BP

MOV BP,SP

MOV AX,[BP+8] ;取要显示的数字

MOV CX,[BP+6] ;取进制数

MOV DI,[BP+4] ;取显示位数

MOV SI,0 ;设置循环初始

JMP @100 ;先去判断循环条件

@50:

CWD

MOV BX,CX ;以 CX 进制形式显示

IDIV BX

PUSH DX ;利用堆栈依次保存个位、十位、....

INC SI ;循环变量+1

@100:

CMP SI,DI ;判断是否结束循环,共显示 5 位数字

JL @50

MOV SI,0 ;设置循环初始

JMP @200 ;先去判断循环条件

@150:

POP DX ;从堆栈中依次弹出...、十位、个位

CMP DL,9

JLE @180

ADD DL,'A'− 10 ;对大于 9 的数字做处理

JMP @190

@180: ADD DL,30H ;转换为 ASCII 码

@190: MOV AH,2

PUSH SI ;防止 DOS 中断改变 SI、DI

PUSH DI

INT 21H ;调用 DOS 中断显示一个字符

Page 313: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·309·

POP DI

POP SI ;恢复 SI、DI

INC SI ;循环变量+1

@200:

CMP SI,DI ;判断是否结束循环,共显示 DI 位数字

JL @150

POP BP

RET

DISP ENDP

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("\r\n")

mov dx,offset f1

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 for (i=3;i<1000;i++)

mov si,3 ;设置循环变量

jmp @4170 ;先去判断循环条件

@458:

;下面程序段类似算法研究程序里的 if (is_prime(i)==0) continue

push si ;利用堆栈传递参数

call is_prime

pop si ;恢复堆栈

or ax,ax

je @4142

;下面程序段类似算法研究程序里的 a=i/100

mov ax,si

mov bx,100

cwd

idiv bx

mov a,ax

;下面程序段类似算法研究程序里的 b=(i/10)%10

mov ax,si

mov bx,10

cwd

idiv bx

cwd

Page 314: IBM-PC 汇编语言程序设计试题解

·310· IBM-PC 汇编语言程序设计试题解

idiv bx

mov b,dx

;下面程序段类似算法研究程序里的 c=i%10

mov ax,si

cwd

idiv bx

mov c,dx

;下面程序段类似算法研究程序里的 if (((b+c)%10)==a) printf("%03d\r\n",i)

mov ax,b

add ax,c ;计算 b+c

cwd

idiv bx ;dx=(b+c)%10,ax=(b+c)/10

cmp dx,a

jne @4142

push si ;利用堆栈传递的是要显示的数字

mov ax,10

push ax ;利用堆栈传递参数,显示数字的数字进制数

mov ax,3 ;利用堆栈传递参数,显示数字的位数

push ax

call DISP ;调用显示程序

pop ax ;恢复堆栈

pop ax

pop si

;下面程序段类似算法研究程序里的 printf("\r\n")

mov dx,offset f1

mov ah,9

push si ;防止 DOS 中断改变 SI

int 21h

pop si ;恢复 SI

@4142:

inc si ;循环变量+1

@4170:

cmp si,1000 ;判断是否结束循环

jl @458

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main endp

end _main

Page 315: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·311·

【1014】验证哥德巴赫猜想:任意一个不小于 6的偶数,总可以表示为两个素数之和。

算法思路:

本题可以用循环程序筛选。若给定的偶数是 a,则逐个筛选小于 a 的素数(假设得到 b),

然后再判断 a-b 是否为素数,如果是则循环停止。

判断素数的方法是:如果 number 不能被 2 到 number 的所有数整除,则 number 为素

数。子程序 is_prime 由一个循环结构来实现。编写汇编语言程序时求开方较复杂,我们用

number/2 代替 number ,这样做的代价是增加了循环次数。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

int is_prime(int number)

{

int flag=1,n;

for(n=2;n<number/2 && flag==1;n++)

{

if (number%n == 0) flag=0;

}

return(flag);

}

void main(void)

{

unsigned int a,b,d;

printf("Input n = ");

scanf("%d",&a);

if ((a%2==1) || (a<6))

{

printf("Input error\r\n");

return;

}

for(b=3;b<=a/2;b+=2)

{

if (is_prime(b)==0) continue;

d=a− b;

if (is_prime(d)==0) continue;

printf("%u=%u+%u\r\n",a,b,d);

break;

}

}

汇编语言程序如下:

Page 316: IBM-PC 汇编语言程序设计试题解

·312· IBM-PC 汇编语言程序设计试题解

.model small

.data

f1 db 'Input n = ',0

f2 db '%d',0

f3 db 'Input error',13,10,0

f4 db '%u=%u+%u',13,10,0

a dw ?

;用 si 代替算法研究程序里的 b

;用 di 代替算法研究程序里的 d

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

is_prime proc near

push bp

mov bp,sp

push si

mov si,word ptr [bp+4]

push bx

push cx

push dx

;用 bx 代替算法研究程序里的 n

;用 cx 代替算法研究程序里的 flag

;用 si 代替算法研究程序里的 number

mov cx,1 ;flag=1

;下面程序段类似算法研究程序里的 for(n=2;n<number/2 && flag==1;n++)

mov bx,2 ;设置循环变量初始值

jmp @007 ;先取判断循环条件

@005:

;下面程序段类似算法研究程序里的 if (number%n == 0) flag=0

mov ax,si

cwd

idiv bx ;dx=number%n

or dx,dx

Page 317: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·313·

jne @006

xor cx,cx ;flag=0

@006:

inc bx ;循环变量+1

@007: ;循环结束条件的判断

mov ax,si

cwd

sub ax,dx

sar ax,1 ;number/2

cmp ax,bx

jle @008

cmp cx,1

je @005

@008:

;函数的返回值通过 ax 传递

mov ax,cx

pop dx

pop cx

pop bx

pop si

pop bp

ret

is_prime endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("Input n = ")

mov ax,offset f1

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%d",&a)

lea ax,a

push ax

mov ax,offset f2

push ax

call _scanf

pop ax

Page 318: IBM-PC 汇编语言程序设计试题解

·314· IBM-PC 汇编语言程序设计试题解

pop ax

;下面程序段类似算法研究程序里的 if ((a%2==1) || (a<6))

mov ax,a

test ax,1

jnz @86

cmp a,6

jae @114

@86:

;下面程序段类似算法研究程序里的 printf("Error\r\n")

mov ax,offset f3

push ax

call _printf

pop ax

jmp @282 ;return

@114:

;下面程序段类似算法研究程序里的 for(b=3;b<=a/2;b+=2)

mov si,3 ;设置循环初始

jmp @254 ;先去判断循环条件

@142:

;下面程序段类似算法研究程序里的 if (is_prime(b)==0) continue

push si

call is_prime

pop si

or ax,ax

je @226

mov di,a ;(di)=b

sub di,si ;d=a− b

;下面程序段类似算法研究程序里的 if (is_prime(d)==0) continue

push di

call is_prime

pop di

or ax,ax

je @226

;下面程序段类似算法研究程序里的 printf("%u=%u+%u\r\n",a,b,d)

push di

push si

push a

mov ax,offset f4

Page 319: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·315·

push ax

call _printf

add sp,8 ;用加堆栈指针的方式恢复堆栈

jmp @282 ;break

@226:

add si,2 ;循环变量+2

@254:

mov ax,a

shr ax,1 ;(ax)=a/2

cmp ax,si ;判断是否结束循环

jae @142

@282:

ret

_main endp

end _start

【1015】用循环程序在屏幕上显示 9-9 乘法表。

C 语言编写的算法研究程序:

void main(void)

{

char i,j;

printf(" ");

for (i=1;i<=9;i++)

{

printf(" %02d",i);

}

printf("\n");

for (i=1;i<=9;i++)

{

printf(" %02d",i);

for (j=1;j<=i;j++)

{

printf(" %02d",i*j);

}

printf("\n");

}

}

汇编语言程序如下:

Page 320: IBM-PC 汇编语言程序设计试题解

·316· IBM-PC 汇编语言程序设计试题解

.model small

.data

f1 db " ",'$' ;打印空格

f2 db 13,10,'$' ;打印回车换行

i db ? ;算法研究程序里的 i

j db ? ;算法研究程序里的 j

.code

print proc near ;打印数据的子程序

push bp

mov bp,sp

mov ax,word ptr [bp+4] ;取要打印的数据

push bx

push dx

mov bl,10

idiv bl ;数据除以 10,(al)=十位数,(ah)=个位

push ax ;利用堆栈保存十位数和个位数,因为 DOS

中断会改变 AX的值

mov dl,' '

mov ah,2

int 21h ;打印一个空格

mov dl,' '

mov ah,2

int 21h ;打印一个空格

pop ax ;提取堆栈保存十位数和个位数

push ax ;利用堆栈保存十位数和个位数

mov dl,al

add dl,'0' ;数字转换到 ASCII 码

mov ah,2

int 21h ;打印十位数

pop ax ;提取堆栈保存十位数和个位数

mov dl,ah

add dl,'0' ;数字转换到 ASCII 码

mov ah,2

int 21h ;打印个位数

pop dx

pop bx

pop bp

ret

Page 321: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·317·

print endp

_main proc near

mov ax,@data

mov ds,ax

;下面程序段类似算法研究程序里的 printf(" ")

mov dx,offset f1

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 for (i=1;i<=9;i++)

mov i,1

jmp @114 ;先去判断循环条件

@58:

;下面程序段类似算法研究程序里的 printf(" %02d",i)

mov al,i

cbw

push ax

call print

pop cx

inc i ;循环变量+1

@114:

cmp i,9 ;判断是否结束循环

jle @58

;下面程序段类似算法研究程序里的 printf("\n")

mov dx,offset f2

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 for (i=1;i<=9;i++)

mov i,1

jmp @338 ;先去判断循环条件

@170:

;下面程序段类似算法研究程序里的 printf(" %02d",i)

mov al,i

cbw

push ax

call print

pop cx

;下面程序段类似算法研究程序里的 for (j=1;j<=i;j++)

mov j,1

Page 322: IBM-PC 汇编语言程序设计试题解

·318· IBM-PC 汇编语言程序设计试题解

jmp @254 ;先去判断循环条件

@198:

;下面程序段类似算法研究程序里的 printf(" %02d",i*j)

mov al,i

cbw

push ax

mov al,j

cbw

mov dx,ax

pop ax

imul dx ;ax=i*j

push ax

call print ;屏幕打印

pop cx

inc j ;循环变量+1

@254:

mov al,j

cmp al,i ;判断是否结束循环

jle @198

;下面程序段类似算法研究程序里的 printf("\n")

mov dx,offset f2

mov ah,9

int 21h

inc i ;循环变量+1

@338:

cmp i,9 ;先去判断循环条件

jle @170

mov ax,4c00h ;利用 DOS 中断返回系统

int 21h

_main endp

end _main

【1016】用循环程序,在屏幕上显示一 ASCII 字符表。(从 20H~FFH)

C 语言编写的算法研究程序:

void main(void)

{

char i,j;

printf(" ");

for (i=0;i<=15;i++)

Page 323: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·319·

{

printf(" %02d",i);

}

printf("\n");

for (i=1;i<=15;i++)

{

printf(" %02d",i);

for (j=0;j<=15;j++)

{

printf(" %c",i*16+j);

}

printf("\n");

}

}

汇编语言程序如下:

.model small

.data

f1 db " ",'$' ;打印 4 个空格

f2 db 13,10,'$' ;打印回车换行

f3 db " ",'$' ;打印 3 个空格

i db ? ;算法研究程序里的 i

j db ? ;算法研究程序里的 j

.code

printc proc near ;打印数据的子程序

push bp

mov bp,sp

push dx

lea dx,f3

mov ah,9

int 21h ;打印 3 个空格

mov dx,word ptr [bp+4] ;取要打印的数据

mov ah,2

int 21h ;打印十位数

pop dx

pop bp

ret

printc endp

print proc near ;打印数据的子程序

Page 324: IBM-PC 汇编语言程序设计试题解

·320· IBM-PC 汇编语言程序设计试题解

push bp

mov bp,sp

mov ax,word ptr [bp+4] ;取要打印的数据

push bx

push dx

mov bl,10

idiv bl ;数据除以 10,(al)=十位数,(ah)=个位数

push ax ;利用堆栈保存十位数和个位数,因为 DOS

中断会改变 AX的值

mov dl,' '

mov ah,2

int 21h ;打印一个空格

mov dl,' '

mov ah,2

int 21h ;打印一个空格

pop ax ;提取堆栈保存十位数和个位数

push ax ;利用堆栈保存十位数和个位数

mov dl,al

add dl,'0' ;数字转换到 ASCII 码

mov ah,2

int 21h ;打印十位数

pop ax ;提取堆栈保存十位数和个位数

mov dl,ah

add dl,'0' ;数字转换到 ASCII 码

mov ah,2

int 21h ;打印个位数

pop dx

pop bx

pop bp

ret

print endp

_main proc near

mov ax,@data

mov ds,ax

;下面程序段类似算法研究程序里的 printf(" ")

mov dx,offset f1

mov ah,9

int 21h

Page 325: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·321·

;下面程序段类似算法研究程序里的 for (i=0;i<=15;i++)

mov i,0

jmp @114 ;先去判断循环条件

@58:

;下面程序段类似算法研究程序里的 printf(" %02d",i)

mov al,i

cbw

push ax

call print

pop ax

inc i ;循环变量+1

@114:

cmp i,15 ;判断是否结束循环

jle @58

;下面程序段类似算法研究程序里的 printf("\n")

mov dx,offset f2

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 for (i=1;i<=15;i++)

mov i,1

jmp @338 ;先去判断循环条件

@170:

;下面程序段类似算法研究程序里的 printf(" %02d",i)

mov al,i

cbw

push ax

call print

pop ax

;下面程序段类似算法研究程序里的 for (j=0;j<=15;j++)

mov j,0

jmp @254 ;先去判断循环条件

@198:

;下面程序段类似算法研究程序里的 printf(" %c",i*16+j)

mov al,i

cbw

mov cl,4

shl ax,cl ;通过左移实现乘 16 的运算,ax=ax*16

push ax

mov al,j

Page 326: IBM-PC 汇编语言程序设计试题解

·322· IBM-PC 汇编语言程序设计试题解

cbw

pop dx

add dx,ax ;i*16+j

push dx

call printc

pop dx

inc j ;循环变量+1

@254:

cmp j,15 ;判断是否结束循环

jle @198

;下面程序段类似算法研究程序里的 printf("\n")

mov dx,offset f2

mov ah,9

int 21h

inc i ;循环变量+1

@338:

cmp i,15 ;判断是否结束循环

jle @170

mov ax,4c00h ;利用 DOS 中断返回系统

int 21h

_main endp

end _main

【1017】求具有下列两个性质的最小自然数 x:

(1)x 的个位数是 m;

(2)如果将 x 的个位数字 m 移到其余各位数字之前,所组成的新数是 x 的 n 倍(n 的范

围是 1 到 m)。

算法思路:

这个自然数会很大,16 位或 32 位数都不足以表示,我们把数存在一个数组里,每个数

组元素表示该数的一个十进制位,然后按要求对数组的元素逐一进行计算。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

void main(void)

{

unsigned char a,b,c,i,n,m;

unsigned char s[100];

printf("\r\nInput larst number=");

scanf("%d",&m);

Page 327: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·323·

printf("\r\n");

for(n=1;n<=m;n++)

{

a=m;b=0;c=0;i=0;

while (c!=m)

{

s[i]=a;i++;

c=a*n+b;

b=c/10;

a=c%10;

}

printf("X%1d− − − ",n);

for (a=i;a>0;a− − )

printf("%1d",s[a− 1]);

printf("\r\n");

}

}

汇编语言程序如下:

.model small

.data

f1 db 13,10,'Input larst number=',0

f2 db '%d',0

f3 db 13,10,0

f4 db 'X%1d− − − ',0

f5 db '%1d',0

f6 db 13,10,0

a db ? ;算法研究程序里的 a

b db ? ;算法研究程序里的 b

;用 cl 代替 c

i db ? ;算法研究程序里的 i

n db ? ;算法研究程序里的 n

m db ? ;算法研究程序里的 m

s db 100 dup(?) ;算法研究程序里的 s[100]

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

Page 328: IBM-PC 汇编语言程序设计试题解

·324· IBM-PC 汇编语言程序设计试题解

jmp startx ;首先初始化库函数

_start endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("\r\nInput larst number=")

mov ax,offset f1

push ax ;利用堆栈传递参数

call _printf

pop ax ;恢复堆栈

;下面程序段类似算法研究程序里的 scanf("%d",&m)

lea ax,m

push ax

mov ax,offset f2

push ax

call _scanf

pop ax

pop ax

;下面程序段类似算法研究程序里的 printf("\r\n")

mov ax,offset f3

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 for(n=1;n<=m;n++)

mov n,1

jmp @310

@58:

mov al,m ;a=m

mov a,al

mov b,0 ;b=0

mov cl,0 ;c=0

mov i,0 ;i=0

;下面程序段类似算法研究程序里的 while (c!=m)

jmp @114 ;先去判断循环条件

@86:

;下面程序段类似算法研究程序里的 s[i]=a

mov bl,i

mov bh,0

Page 329: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·325·

mov dl,a

mov s[bx],dl ;s[i]=a

inc i ;i++

;下面程序段类似算法研究程序里的 c=a*n+b

mov al,a

mov ah,0

mov dl,n

mov dh,0

imul dx

add al,b

mov cl,al

;下面程序段类似算法研究程序里的 b=c/10

mov ah,0

mov bx,10

cwd

idiv bx

mov b,al

;下面程序段类似算法研究程序里的 a=c%10

mov al,cl

mov ah,0

cwd

idiv bx

mov a,dl

@114:

cmp cl,m

jne @86

;下面程序段类似算法研究程序里的 printf("X%1d− − − ",n)

mov al,n

mov ah,0

push ax

mov ax,offset f4

push ax

call _printf

pop ax

pop ax

;下面程序段类似算法研究程序里的 for(a=i;a>0;a− − )

mov al,i

mov a,al ;设置循环初始

jmp @226 ;先去判断循环条件

Page 330: IBM-PC 汇编语言程序设计试题解

·326· IBM-PC 汇编语言程序设计试题解

@170:

;下面程序段类似算法研究程序里的 printf("%1d",s[a− 1])

mov bl,a

dec bl

mov bh,0

mov al,s[bx] ;取数组元素 s[a− 1]

mov ah,0

push ax

mov ax,offset f5

push ax

call _printf

pop ax

pop ax

dec a ;循环变量− 1

@226:

cmp a,0 ;判断是否结束循环

ja @170

;下面程序段类似算法研究程序里的 printf("\r\n")

mov ax,offset f6

push ax

call _printf

pop ax

inc n ;循环变量+1

@310:

mov al,n

cmp al,m ;判断是否结束循环

ja @400

jmp @58

@400:

ret

_main endp

end _start

【1018】从键盘输入一个正整数,计算其平方根并输出。

算法思路:

计算平方根的方法有很多,包括多项式逼近、直接法和牛顿迭代法。其中牛顿迭代法具

有程序简单、收敛速度快、精度高等特点,在实际中得到广泛地应用。对于 XY = ,按牛

顿迭代法有:

Page 331: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·327·

+=+

KKK Y

XYY21

1

迭代的初始值为 Y0,它的取值与收敛速度有关。为了计算简单,可取 Y0=X/2。

为了程序编写方便,我们设 X 为 16bit 无符号整数,平方根只求其整数部分,即迭代过

程到|YK− YK+1|≤1 停止。

汇编语言程序如下:

.MODEL SMALL

.DATA

X DW ?

YK DW ?

YK1 DW ?

MSS1 DB 13,10

DB "This program calculate SQR(X)"

DB 13,10

DB "Please input HEX data XXXX : ","$"

MSS2 DB 13,10

DB "The root (BCD) is : ","$"

MSS3 DB 13,10,"$"

.CODE

START PROC NEAR

MOV AX,@DATA

MOV DS,AX ;取数据段地址

CALL INPUT ;从键盘输入数据

MOV X,AX

SHR AX,1 ;通过右移实现除以 2 的运算

MOV YK,AX ;设置迭代初始值

MAINDO: MOV AX,X

MOV DX,0

DIV YK ;计算 X/YK

ADD AX,YK ;AX=X/YK+YK

SHR AX,1 ;AX=(X/YK+YK)/2

MOV YK1,AX ;YK1=(X/YK+YK)/2

SUB AX,YK ;判断是否结束循环

JNC MAIN1

NEG AX ;负数取补运算,即取绝对值

MAIN1: CMP AX,1 ;判断是否达到迭代结束的条件

JBE EXITDO

MOV AX,YK1 ;为做下一次迭代做准备

Page 332: IBM-PC 汇编语言程序设计试题解

·328· IBM-PC 汇编语言程序设计试题解

MOV YK,AX

JMP MAINDO

EXITDO: CALL DISP ;显示计算结果

MOV AX,4C00H ;调用 DOS 功能返回系统

INT 21H

START ENDP

;数据输入子程序,输入要按要求进行

;输入四位 16 进制的数据

INPUT PROC NEAR

LEA DX,MSS1

MOV AH,9

INT 21H

MOV BX,0

NEWCHAR:MOV AH,1

INT 21H

SUB AL,48

JL EXIT

CMP AL,10

JL ADD_TO

SUB AL,7

CMP AL,10H

JL ADD_TO

SUB AL,20H

CMP AL,10H

JGE EXIT

ADD_TO: MOV CL,4

SHL BX,CL

MOV AH,0

ADD BX,AX

JMP NEWCHAR

EXIT: MOV AX,BX

RET

INPUT ENDP

;在屏幕上以十进制形式显示整型数据的子程序

;要显示的数据存在 YK1中

DISP PROC NEAR

LEA DX,MSS2

Page 333: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·329·

MOV AH,9

INT 21H ;调用 DOS 中断显示字符 MSS2

MOV AX,YK1

MOV SI,0 ;设置循环初始

JMP @100 ;先去判断循环条件

@50:

CWD

MOV BX,10 ;以 10 进制形式显示

IDIV BX

PUSH DX ;利用堆栈依次保存个位、十位、....

INC SI ;循环变量+1

@100:

CMP SI,5 ;判断是否结束循环,共显示 5 位数

JLE @50

MOV SI,0 ;设置循环初始

JMP @200 ;先去判断循环条件

@150:

POP BX ;从堆栈中依次弹出...、十位、个位

MOV DL,CS:DISP_TAB[BX];查表的方法实现数字到 ASCII

字符的转换

MOV AH,2

PUSH SI ;防止 DOS 中断改变 SI

INT 21H ;调用 DOS 中断显示一个字符

POP SI ;恢复 SI

INC SI ;循环变量+1

@200:

CMP SI,5 ;判断是否结束循环,共显示 5 位数

JLE @150

LEA DX,MSS3 ;调用 DOS 中断显示字符 MSS3

MOV AH,9

INT 21H

RET

DISP_TAB DB '01234567890ABCDEF'

DISP ENDP

END START

Page 334: IBM-PC 汇编语言程序设计试题解

·330· IBM-PC 汇编语言程序设计试题解

【1019】输入 a,b,c 三边长后,判断是否能构成三角形;如能构成三角形,就用海伦公

式求三角形的面积。

算法思路:

三角形的三个边长是有长度约束的,如果三个边中有一个边过长,则是不能构成三角形

的。计算三角形面积可以利用海伦公式。

设:三角形的三个边的边长为 a,b,c,令2

cbaq ++= ,则三角形面积为:

))()(( cqbqaqqS −−−=

为了计算方便,我们令 cbap ++= ,则三角形面积为:

)2)(2)(2(41 cpbpappS −−−=

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

unsigned int abs(int x)

{

if (x<0) x=− x;

return(x);

}

unsigned int sqrt(unsigned int x)

{

unsigned int yk,yk1;

yk1=x/2;yk=0;

while(abs(yk− yk1)>1)

{

yk=yk1;

yk1=(yk+x/yk)/2;

}

return(yk1);

}

void main(void)

{

unsigned int a,b,c,p,s;

printf("\r\nCalculate triangle area.\r\n");

printf("Input a=");scanf("%d",&a);

printf("Input b=");scanf("%d",&b);

printf("Input c=");scanf("%d",&c);

if (((a+b)>c) && (abs(a− b)<c))

Page 335: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·331·

{

p=(a+b+c);

s=sqrt(p*(p− a*2)*(p− b*2)*(p− c*2))/4;

printf("Area = %u\r\n",s);

}

else printf("Not triangle!\r\n\r\n");

}

汇编语言程序如下:

.model small

.data

f1 db 13,10,'Calculate triangle area.',13,10,0

f2 db 'Input a=',0

f3 db '%d',0

f4 db 'Input b=',0

f5 db '%d',0

f6 db 'Input c=',0

f7 db '%d',0

f8 db 'Area = %u',13,10,0

f9 db 'Not triangle!',13,10,0

a dw ?

b dw ?

c dw ?

s dw ?

p dw ?

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_abs proc near

push bp

mov bp,sp

mov dx,[bp+4] ;(dx)=x

or dx,dx ;if (x<0)

jge @10

Page 336: IBM-PC 汇编语言程序设计试题解

·332· IBM-PC 汇编语言程序设计试题解

neg dx ;x=− x

@10:

mov ax,dx

pop bp

ret

_abs endp

_sqrt proc near

;用 si 代替算法研究程序里的 yk1

;用 bx 代替算法研究程序里的 yk

;用 di 代替算法研究程序里的 x

push bp

mov bp,sp

push si

push di

mov di,[bp+4] ;(di)=x

mov si,di ;(si)=yk1

shr si,1 ;(si)=x/2

xor bx,bx ;(bx)=yk

;下面程序段类似算法研究程序里的 while(abs(yk− yk1)>1)

jmp @110 ;先去判断循环条件

@100:

mov bx,si ;yk=yk1

;下面程序段类似算法研究程序里的 yk1=(yk+x/yk)/2

mov ax,di

xor dx,dx

div bx ;(ax)=x/yk,(dx)=x%yk

mov si,bx

add si,ax ;(si)=(yk+x/yk)

shr si,1 ;(si)=(yk+x/yk)/2

@110:

mov ax,bx

sub ax,si

push ax

call _abs ;(ax)=abs(yk− yk1)

pop cx

cmp ax,1 ;判断是否结束循环

ja @100

mov ax,si ;return(yk1)

Page 337: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·333·

pop di

pop si

pop bp

ret

_sqrt endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("\r\nCalculate triangle

area.\r\n")

mov ax,offset f1

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 printf("Input a=")

mov ax,offset f2

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%d",&a)

lea ax,a

push ax

mov ax,offset f3

push ax

call _scanf

pop ax

pop ax

;下面程序段类似算法研究程序里的 printf("Input b=")

mov ax,offset f4

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%d",&b)

lea ax,b

push ax

mov ax,offset f5

push ax

Page 338: IBM-PC 汇编语言程序设计试题解

·334· IBM-PC 汇编语言程序设计试题解

call _scanf

pop ax

pop ax

;下面程序段类似算法研究程序里的 printf("Input c=")

mov ax,offset f6

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%d",&c)

lea ax,c

push ax

mov ax,offset f7

push ax

call _scanf

pop ax

pop ax

;下面程序段类似算法研究程序里的 if (((a+b)>c) && (abs(a− b)<c))

mov ax,a

add ax,b ;(ax)=a+b

cmp ax,c

jbe @114

mov ax,a

sub ax,b ;(ax)=a− b

push ax ;利用堆栈传递参数

call _abs

pop cx ;恢复堆栈

cmp ax,c ;(ax)为函数_abs 的返回值

jae @114

;下面程序段类似算法研究程序里的 p=(a+b+c)

mov cx,a

add cx,b

add cx,c ;(cx)=(a+b+c)

mov p,cx

;下面程序段类似算法研究程序里的 s=sqrt(p*(p− a*2)*(p− b*2)*(p− c*2))/4

mov ax,p

sub ax,a

sub ax,a ;(ax)=p− a*2

push ax

mov ax,p

Page 339: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·335·

sub ax,b

sub ax,b ;(ax)=p− b*2

push ax

mov ax,p

sub ax,c

sub ax,c ;(ax)=p− c*2

mul p ;(ax)=p*(p− c*2)

pop cx

mul cx ;(ax)=p*(p− c*2)*(p− b*2)

pop cx

mul cx ;(ax)=p*(p− c*2)*(p− b*2)*(p− a*2)

;下面程序段调用求开方的函数

push ax

call _sqrt ;(ax)=sqrt(p*(p− a*2)*(p− b*2)*(p−

c*2))

pop cx

mov cl,2

shr ax,cl ;(ax)=(ax)/4

mov s,ax ;s=sqrt(p*(p − a*2)*(p − b*2)*(p −

c*2))/4

;下面程序段类似算法研究程序里的 printf("Area = %u\r\n",s)

push s

mov ax,offset f8

push ax

call _printf

pop ax

pop s

jmp @142

@114:

;下面程序段类似算法研究程序里的 else printf("Not triangle!\r\n\r\n")

mov ax,offset f9

push ax

call near ptr _printf

pop ax

@142:

ret

_main endp

end _start

Page 340: IBM-PC 汇编语言程序设计试题解

·336· IBM-PC 汇编语言程序设计试题解

【1020】用键盘输入 4 位 16 进制数,将它转换为 2-15 进制显示出来。

算法思路:

数据存储在计算机内部是二进制的,但同样一个数可以用不同的进制方式来表示。本题

涉及进制转换的问题。我们利用一个循环结构,将输入的 4 位 16 进制数表示成 2 进制到 15

进制。为了减少篇幅,我们都用 16 个数字显示各转换结果,有兴趣的读者可以适当修改 DISP

子程序,使程序不再显示数字前面的无效 0。

汇编语言程序如下:

.model small

.data

MSS1 DB "Please input HEX data XXXX : ","$"

MSS2 DB 13,10,"$"

number DW ?

i DW ?

.code

DISP PROC NEAR

PUSH BP

MOV BP,SP

MOV AX,[BP+8] ;取要显示的数字

MOV CX,[BP+6] ;取进制数

MOV DI,[BP+4] ;取显示位数

MOV SI,0 ;设置循环初始

JMP @100 ;先去判断循环条件

@50:

MOV DX,0

MOV BX,CX ;以 CX 进制形式显示

IDIV BX

PUSH DX ;利用堆栈依次保存个位、十位、....

INC SI ;循环变量+1

@100:

CMP SI,DI ;判断是否结束循环,共显示 DI 位数字

JL @50

MOV SI,0 ;设置循环初始

JMP @200 ;先去判断循环条件

@150:

POP DX ;从堆栈中依次弹出...、十位、个位

CMP DL,9

JLE @180

ADD DL,'A'− 10 ;对大于 9 的数字做处理

Page 341: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·337·

JMP @190

@180: ADD DL,30H ;转换为 ASCII 码

@190: MOV AH,2

PUSH SI ;防止 DOS 中断改变 SI、DI

PUSH DI

INT 21H ;调用 DOS 中断显示一个字符

POP DI

POP SI ;恢复 SI、DI

INC SI ;循环变量+1

@200:

CMP SI,DI ;判断是否结束循环,共显示 DI 位数字

JL @150

POP BP

RET

DISP ENDP

;数据输入子程序,输入要按要求进行,输入过程不支持 BackSpace 按键

;输入 4 位 16 进制的数据

INPUT PROC NEAR

MOV BX,0

NEWCHAR:MOV AH,1

INT 21H

SUB AL,48

JL EXIT

CMP AL,10

JL ADD_TO

SUB AL,7

CMP AL,10H

JL ADD_TO

SUB AL,20H

CMP AL,10H

JGE EXIT

ADD_TO: MOV CL,4

SHL BX,CL

MOV AH,0

ADD BX,AX

JMP NEWCHAR

EXIT: MOV AX,BX

RET

Page 342: IBM-PC 汇编语言程序设计试题解

·338· IBM-PC 汇编语言程序设计试题解

INPUT ENDP

_main proc near

mov ax,@data ;取数据段地址

;下面程序段类似 printf("Please input HEX data XXXX : ")

mov ds,ax

lea dx,mss1

mov ah,9

int 21h

CALL INPUT ;从键盘输入数据

mov number,ax ;保存输入的数据

lea dx,mss2 ;打印回车、换行

mov ah,9

int 21h

;下面程序段类似 for (i=2;i<=15;i++)

mov i,2 ;设置循环变量

jmp @209 ;先去判断循环条件

@109:

push i ;利用堆栈传递的是要显示的进制数

mov ax,10

push ax ;利用堆栈传递参数,以 10 进制显示数字

mov ax,2

push ax ;利用堆栈传递参数,显示 2 位数字

call DISP ;调用显示程序,显示进制数

pop ax ;恢复堆栈

pop ax

pop ax

mov dl,' ' ;显示一个空格

mov ah,2

int 21h

push number ;利用堆栈传递的是要显示的数字

push i ;利用堆栈传递参数,以 i 进制显示数字

mov ax,16 ;利用堆栈传递参数,显示 16 位数字

push ax

call DISP ;调用显示程序

pop ax ;恢复堆栈

pop ax

pop ax

lea dx,mss2 ;打印回车、换行

Page 343: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·339·

mov ah,9

int 21h

inc i ;循环变量+1

@209:

cmp i,15 ;判断是否结束循环

jle @109

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main endp

end _main

【1021】从键盘输入一行字符,统计字母、空格、数字、其他字符的个数,并显示。

算法思路:

本题可以用循环程序筛选的方法,在键盘输入的字符串中逐个筛选、分类统计,直到字

符串结束。

C 语言编写的算法研究程序:

void main(void)

{

unsigned char c;

unsigned char s[255];

unsigned int i,letters=0,space=0,digit=0,other=0;

printf("Please input a line:\n");

gets(s);

i=0;

while (s[i]!= 0)

{

if ( (s[i]>='a' && s[i]<='z') ||

(s[i]>='A' && s[i]<='Z') ) letters++;

else if (s[i]==' ') space++;

else if (s[i]>='0' && s[i]<='9') digit++;

else other++;

i++;

}

printf("Letters = %d\n",letters);

printf("Space = %d\n",space);

printf("Digit = %d\n",digit);

printf("Other = %d\n",other);

}

汇编语言程序如下:

Page 344: IBM-PC 汇编语言程序设计试题解

·340· IBM-PC 汇编语言程序设计试题解

.model small

.data

c db ?

s db 255,0 ;用 DOS 0AH功能从键盘读取数据,字符

串的头信息

str db 255 dup(0) ;从键盘读取的字符串,以回车符表示字

1 串的结束

;用 si 代替算法研究程序里的 i

letters dw 0

space dw 0

digit dw 0

other dw 0

f1 db 'Please input a line:',13,10,'$'

f2 db 'Letters = ','$'

f3 db 'Space = ','$'

f4 db 'Digit = ','$'

f5 db 'Other = ','$'

CRLF db 13,10,'$'

.code

DISP PROC NEAR

PUSH BP

MOV BP,SP

MOV AX,[BP+4] ;取要显示的数字

PUSH SI

MOV SI,0 ;设置循环初始

JMP @100 ;先去判断循环条件

@50:

MOV DX,0

MOV BX,10 ;以 10 进制形式显示

DIV BX

PUSH DX ;利用堆栈依次保存个位、十位、....

INC SI ;循环变量+1

@100:

CMP SI,2 ;判断是否结束循环,共显示 2 位数字

JL @50

MOV SI,0 ;设置循环初始

JMP @200 ;先去判断循环条件

Page 345: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·341·

@150:

POP DX ;从堆栈中依次弹出...、十位、个位

ADD DL,30H ;转换为 ASCII 码

MOV AH,2

PUSH SI ;防止 DOS 中断改变 SI

INT 21H ;调用 DOS 中断显示一个字符

POP SI ;恢复 SI

INC SI ;循环变量+1

@200:

CMP SI,2 ;判断是否结束循环,共显示 2 位数字

JL @150

POP SI

POP BP

RET

DISP ENDP

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("Please input a line:\n")

mov dx,offset f1

mov ah,9

int 21h

lea dx,s ;gets(s)

mov ah,0ah

int 21h

mov dx,offset CRLF ;打印回车换行

mov ah,9

int 21h

xor si,si ;i=0

;下面程序段类似算法研究程序里的 while (s[i]!= 0)

jmp @394 ;先去判断循环条件

@58:

;下面程序段类似算法研究程序里的

;if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) letters++

cmp str[si],'a'

Page 346: IBM-PC 汇编语言程序设计试题解

·342· IBM-PC 汇编语言程序设计试题解

jb @114

cmp str[si],'z'

jbe @170

@114:

cmp str[si],'A'

jb @198

cmp str[si],'Z'

ja @198

@170:

inc letters

jmp @366

@198:

;下面程序段类似算法研究程序里的 else if (s[i]==' ') space++

cmp str[si],32

jne @254

inc space

jmp @366

@254:

;下面程序段类似算法研究程序里的 else if (s[i]>='0' && s[i]<='9') digit++

cmp str[si],'0'

jb @338

cmp str[si],'9'

ja @338

inc digit

jmp @366

@338:

;下面程序段类似算法研究程序里的 else other++

inc other

@366:

inc si ;循环变量+1

@394:

cmp str[si],13 ;判断是否结束 while 循环,回车字符表示

字符串的结束

jne @58

;下面程序段类似算法研究程序里的 printf("Letters = %d\n",letters)

lea dx,f2

mov ah,9

int 21h

push letters ;利用堆栈传递参数

Page 347: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·343·

call DISP

pop cx ;恢复堆栈

lea dx,CRLF

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 printf("Space = %d\n",space)

lea dx,f3

mov ah,9

int 21h

push space

call DISP

pop cx

lea dx,CRLF

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 printf("Digit = %d\n",digit)

lea dx,f4

mov ah,9

int 21h

push digit

call DISP

pop cx

lea dx,CRLF

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 printf("Other = %d\n",other)

lea dx,f5

mov ah,9

int 21h

push other

call DISP

pop cx

lea dx,CRLF

mov ah,9

int 21h

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main endp

Page 348: IBM-PC 汇编语言程序设计试题解

·344· IBM-PC 汇编语言程序设计试题解

end _main

【1022】从键盘输入一字符串,将其大写字母变为小写字母并显示,然后将所有小写字

母转换为大写再输出。

C 语言编写的算法研究程序:

void strlwr(unsigned char *str)

{

while(*str!=0)

{

if (*str>='A' && *str<='Z') *str+=('a'− 'A');

str++;

}

}

void strupr(unsigned char *str)

{

while(*str!=0)

{

if (*str>='a' && *str<='z') *str+=('A'− 'a');

str++;

}

}

void main(void)

{

char str1[100];

printf("Please type a string − press <ENTER>\n");

gets(str1);

strlwr(str1);

printf("Conerted string : %s\n",str1);

strupr(str1);

printf("Conerted string : %s\n",str1);

}

汇编语言程序如下:

.model small

.data ;定义数据段

f1 db 'Please type a string − press <ENTER>',13,10,'$'

f2 db 'Conerted string : ','$'

CRLF db 13,10,'$'

s1 db 200,0

str1 db 200 dup(0)

Page 349: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·345·

.code ;定义代码段

_puts proc near

push bp

mov bp,sp

push si

mov si,[bp+4] ;取字符串首地址

jmp @17

@15: mov dl,[si]

mov ah,2

int 21h

inc si

@17: cmp byte ptr [si],13 ;回车字符表示字符串结束

jne @15

pop si

pop bp

ret

_puts endp

_strlwr proc near

push bp

mov bp,sp

push si

mov si,[bp+4] ;取字符串首地址

;下面程序段类似算法研究程序里的 while(*str!=0)

jmp @1170

@158:

;下面程序段类似算法研究程序里的 if (*str>='A' && *str<='Z') *str+=('a'

− 'A')

cmp byte ptr [si],65

jb @1142

cmp byte ptr [si],90

ja @1142

mov al,[si]

add al,32

mov [si],al

@1142:

inc si ;类似算法研究程序里的 str++

@1170:

Page 350: IBM-PC 汇编语言程序设计试题解

·346· IBM-PC 汇编语言程序设计试题解

cmp byte ptr [si],13 ;回车字符表示字符串结束

jne @158

pop si

pop bp

ret

_strlwr endp

_strupr proc near

push bp

mov bp,sp

push si

mov si,[bp+4] ;取字符串首地址

;下面程序段类似算法研究程序里的 while(*str!=0)

jmp @2170

@2258:

;下面程序段类似算法研究程序里的 if (*str>='a' && *str<='z') *str+=('A'

− 'a')

cmp byte ptr [si],97

jb @2142

cmp byte ptr [si],122

ja @2142

mov al,[si]

add al,224

mov [si],al

@2142:

inc si ;类似算法研究程序里的 str++

@2170:

cmp byte ptr [si],13 ;回车字符表示字符串结束

jne @2258

pop si

pop bp

ret

_strupr endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("Please type a string − press

<ENTER>\n")

Page 351: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·347·

mov dx,offset f1

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 gets(str1)

lea dx,s1

mov ah,10

int 21h

mov dx,offset CRLF ;打印回车换行

mov ah,9

int 21h

lea ax,str1 ;调用 strlwr(str1)

push ax ;利用堆栈将 str1 的地址传递到子程序

call _strlwr

pop ax

;下面程序段类似算法研究程序里的 printf("Conerted string : %s\n",str1)

mov dx,offset f2

mov ah,9

int 21h

lea ax,str1

push ax ;利用堆栈将 str1 的地址传递到子程序

call _puts

pop ax

mov dx,offset CRLF ;打印回车换行

mov ah,9

int 21h

lea ax,str1 ;调用 strupr(str1)

push ax ;利用堆栈将 str1 的地址传递到子程序

call _strupr

pop cx

;下面程序段类似算法研究程序里的 printf("Conerted string : %s\n",str1)

mov dx,offset f2

mov ah,9

int 21h

lea ax,str1

push ax ;利用堆栈将 str1 的地址传递到子程序

call _puts

pop cx

mov dx,offset CRLF ;打印回车换行

mov ah,9

Page 352: IBM-PC 汇编语言程序设计试题解

·348· IBM-PC 汇编语言程序设计试题解

int 21h

mov ax,4c00h ;调用 DOS 中断返回系统

int 21h

_main endp

end _main

【 1023】检查长度为 n 的字符串序列 s=s1s2…sn 内是否包含给定的字符序列

p=p1p2…pm(1<m<n),即检查是否存在最小的 i 值,使得 si=p1,si+1=p2,…si+m-1=pm,如果存在这

样的 i 则返回其值,否则返回 0。

算法思路:

本题所要求编写的程序是:在一个字符串 s 中查找另一个字符串 p 首次出现的位置。

汇编语言程序如下:

.model small

.data ;定义数据段

s db 'abcdefghijklmnopqrstuvwxyz',0

p db 'stu',0

.code ;定义代码段

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

lea ax,p ;取 p 的首地址

push ax ;利用堆栈传递参数

lea ax,s ;取 s 的首地址

push ax

call _strstr ;(ax)为返回参数

add sp,4 ;恢复堆栈

cmp ax,0 ;判断有无匹配的串

je @100

sub ax,offset s ;由指针得到相对位置

inc ax

@100:

;下面程序段打印(ax)中的内容

mov dl,10

div dl

push ax

mov dl,al

add dl,'0' ;转换到 ASCII 字符

mov ah,2

Page 353: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·349·

int 21h ;打印十位数

pop ax

mov dl,ah

add dl,'0'

mov ah,2 ;打印个位数

int 21h

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main endp

;本函数在一个串 s1 中查找另一个串 s2 首次出现的位置

;如果找到匹配的串,则返回指向 s1中匹配串的指针,否则返回 0

;类似 C 语言函数:char *strstr(const char *s1,const char *s2)

_strstr proc near

push bp

mov bp,sp

push si

push di

mov bx,[bp+6] ;(bx)为 s2的首地址

mov al,[bx]

cbw ;Convrt byte to word

or ax,ax ;Zero ?

jnz @121 ;判断 s2 是否为空串

mov ax,[bp+4] ;(ax)为 s1的首地址

jmp @126

@121: ;s2 是不为空串的处理程序

push ds

pop es

cld ;Clear direction

mov di,[bp+4] ;(di)是 s1的首地址

mov bx,di

xor ax,ax ;Zero register

mov cx,0FFFFh

repne scasb ;Rep zf=0+cx >0 Scan es:[di] for al

not cx

xchg cx,dx

mov di,[bp+6] ;(di)是 s1的首地址

mov bp,di

Page 354: IBM-PC 汇编语言程序设计试题解

·350· IBM-PC 汇编语言程序设计试题解

xor ax,ax ;Zero register

mov cx,0FFFFh

repne scasb ;Rep zf=0+cx >0 Scan es:[di] for al

inc cx

not cx

@122:

mov si,bp

lodsb ;串[si]装载到(al)

xchg di,bx

xchg cx,dx

repne scasb ;Rep zf=0+cx >0 Scan es:[di] for al

mov bx,di

jnz @123 ;Jump if not zero

cmp cx,dx

jae @124 ;Jump if above or =

@123:

mov bx,1

jmp @125

@124:

xchg cx,dx

jcxz @125 ;Jump if cx=0

mov ax,cx

dec cx

repe cmpsb ;Rep zf=1+cx >0 Cmp [si] to es:[di]

mov cx,ax

jnz @122 ;Jump if not zero

@125:

mov ax,bx

dec ax ;(ax)为返回参数

@126:

pop di

pop si

pop bp

ret

_strstr endp

end _main

【1024】从键盘输入一字符串,按其反序存放并输出。

Page 355: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·351·

算法思路:

在高级语言中,有专门的函数实现字符串反序的功能。本书提供的程序答案使用了循环

结构实现字符串反序的功能,没有使用 8086 的串处理指令,目的是介绍循环结构。利用 8086

提供的串操作指令实现字符串反序的子程序请参考下题中的函数。

为了减少篇幅,字符串的输入、输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

unsigned int strlen(char *s)

{

unsigned int len;

len=0;

while(s[len]!=0)

{

len++;

}

return(len);

}

void strrev(char *s)

{

unsigned int i,len;

unsigned char temp;

len=strlen(s);

for(i=0;i<=len/2;i++)

{

temp=s[i];

s[i]=s[len− i− 1];

s[len− i− 1]=temp;

}

}

void main(void)

{

unsigned char str1[100];

printf("Please type a string − press <ENTER>\n");

gets(str1);

strrev(str1);

printf("Reversed string : %s\n",str1);

}

汇编语言程序如下:

.model small

.data

Page 356: IBM-PC 汇编语言程序设计试题解

·352· IBM-PC 汇编语言程序设计试题解

f1 db 'Please type a string − press <ENTER>',10,0

f2 db 'Reversed string : %s',10,0

str1 db 100 dup(0) ;算法研究程序里的 str1[100]

.code

extrn _printf:near ;使用库函数_printf

extrn _gets:near ;使用库函数_gets

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_strlen proc near ;计算字符串长度的函数

push bp

mov bp,sp

;用 dx 表示 len

xor dx,dx ;len=0

;下面程序段类似算法研究程序里的 while(s[len]!=0)

jmp @186 ;先去判断循环条件

@158:

inc dx ;len++

@186:

mov bx,[bp+4] ;取字符串首地址

add bx,dx

cmp byte ptr [bx],0 ;以 ASCII 值为 0 的字符表示字符串结束

jne @158

mov ax,dx ;利用 ax 传递函数的返回参数

pop bp

ret

_strlen endp

_strrev proc near ;计算字符逆序的子程序

push bp

mov bp,sp

push si

mov si,[bp+4] ;取字符串首地址

push si ;利用堆栈传递参数

call _strlen ;len=strlen(s)

Page 357: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·353·

pop si ;恢复堆栈

mov cx,ax ;cx=字符串长度

;下面程序段类似算法研究程序里的 for(i=0;i<=len/2;i++)

xor dx,dx ;用 dx 表示 i,i=0,设置循环变量初值

jmp @2114 ;先去判断循环条件

@258:

;下面程序段类似算法研究程序里的 temp=s[i],用 ah 表示 temp

mov bx,dx

mov ah,[bx+si]

;下面程序段类似算法研究程序里的 s[i]=s[len− i− 1]

mov bx,cx

sub bx,dx

dec bx

mov al,[bx+si]

mov bx,dx

mov [bx+si],al

;下面程序段类似算法研究程序里的 s[len− i− 1]=temp

mov bx,cx

sub bx,dx

dec bx

mov [bx+si],ah

inc dx

@2114:

mov ax,cx

shr ax,1 ;通过右移实现除以 2 的运算

cmp ax,dx ;判断是否结束循环

ja @258

pop si

pop bp

ret

_strrev endp

_main proc near ;_start 函数在初始化库程序后自动调用

_main

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("Please type a string − press

<ENTER>\n")

mov ax,offset f1

Page 358: IBM-PC 汇编语言程序设计试题解

·354· IBM-PC 汇编语言程序设计试题解

push ax

call near ptr _printf

pop ax

;下面程序段类似算法研究程序里的 gets(str1)

lea ax,str1

push ax

call _gets

pop ax

;下面程序段类似算法研究程序里的 strrev(str1)

lea ax,str1

push ax

call _strrev

pop ax

;下面程序段类似算法研究程序里的 printf("Reversed string : %s\n",str1)

lea ax,str1

push ax

mov ax,offset f2

push ax

call _printf

pop ax

pop ax

ret

_main endp

end _start

【1025】计算任意两个正整数相加的精确值(设它们的位数不超过 50)。

算法思路:

8086 提供 16 位+16 位的加法指令,当相加的数大于 16 位时,就不能直接使用加法指

令了。我们先将两个正整数以字符的形式存放在数组里,然后再逐次相加,加完的结果也以

字符的形式存在一个数组里。我们提供的程序答案使用了字符串反序的功能,目的是实现个

位对齐,因为从键盘输入数据时,个位数是最后一个输入的。实现字符串反序的子程序与上

题不同,它使用了 8086提供的串操作指令。

为了减少篇幅,字符串的键盘输入、屏幕输出功能直接调用了本书提供的函数库

(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

char a[100],b[100],c[100];

char k,crry;

Page 359: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·355·

for(k=0;k<100;k++)

{

a[k]=0; b[k]=0; c[k]=0;

}

printf("\r\nInput a =");

scanf("%s",a);

printf("Input b =");

scanf("%s",b);

strrev(a);

strrev(b);

crry=0;

for(k=0;k<99;k++)

{

if (a[k]==0) a[k]='0';

if (b[k]==0) b[k]='0';

c[k]=a[k]+b[k]− '0'+crry;

if (c[k]>'9')

{

c[k]− =10;

crry=1;

}

else crry=0;

}

c[99]=0;

for(k=98;k>0;k− − )

{

if ((c[k]=='0') && (c[k+1]==0)) c[k]=0;

}

strrev(c);

printf("a+b=%s\r\n",c);

}

汇编语言程序如下:

.model small

.data

a db 100 dup(0) ;算法研究程序里的 a[100]

b db 100 dup(0) ;算法研究程序里的 b[100]

c db 100 dup(0) ;算法研究程序里的 c[100]

k dw ? ;算法研究程序里的 k

Page 360: IBM-PC 汇编语言程序设计试题解

·356· IBM-PC 汇编语言程序设计试题解

crry db ? ;算法研究程序里的 crry

f1 db 13,10,'Input a =',0

f2 db '%s',0

f3 db 'Input b =',0

f4 db '%s',0

f5 db 'a+b=%s',13,10,0

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_strrev proc near

push bp

mov bp,sp

push si

push di

cld ;清除方向标记,使得字符串操作指令的

针自动增加

mov si,[bp+4] ;si=字符串首地址

;下面程序段计算字符串的长度,字符串以 0 字符表示结束

mov dx,si

mov di,si

push ds

pop es

mov al,0 ;al=结束字符

mov cx,0FFFFh

repne scasb ;Rep zf=0+cx >0 Scan es:[di] for

al,di++

cmp cx,0FFFEh ;对只有 1 个字符的字符串不做处理

je @123 ;Jump if equal

dec di ;di 指向结束字符

dec di ;di 指向最后一个有效字符

xchg si,di ;si 指向最后一个有效字符,di 指向第 1

Page 361: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·357·

字符

;下面程序段将字符串两头的字符逐个交换,直到中间位置

jmp @122 ;先去判断循环条件

@121:

mov al,[di]

xchg [si],al

stosb ;es:[di]=al,di++

dec si

@122:

cmp di,si ;判断是否结束循环

jb @121 ;Jump if below

@123:

xchg dx,ax ;ax 是倒序字符串的首地址

pop di

pop si

pop bp

ret

_strrev endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("\r\nInput a =")

mov ax,offset f1

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%s",a)

lea ax,a

push ax

mov ax,offset f2

push ax

call _scanf

pop ax

pop ax

;下面程序段类似算法研究程序里的 printf("Input b =")

mov ax,offset f3

push ax

Page 362: IBM-PC 汇编语言程序设计试题解

·358· IBM-PC 汇编语言程序设计试题解

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%s",b)

lea ax,b

push ax

mov ax,offset f4

push ax

call _scanf

pop ax

pop ax

lea ax,a

push ax

call _strrev ;调用 strrev(a)

pop ax

lea ax,b

push ax

call _strrev ;调用 strrev(b)

pop ax

mov crry,0 ;crry=0

;下面程序段类似算法研究程序里的 for(k=0;k<99;k++)

mov k,0 ;设置循环变量初值

jmp @1394 ;先去判断循环条件

@1170:

;下面程序段类似算法研究程序里的 if (a[k]==0) a[k]='0'

mov bx,k

cmp a[bx],0

jne @1226

mov a[bx],'0'

@1226:

;下面程序段类似算法研究程序里的 if (b[k]==0) b[k]='0'

mov bx,k

cmp b[bx],0

jne @1282

mov b[bx],'0'

@1282:

;下面程序段类似算法研究程序里的 c[k]=a[k]+b[k]− '0'+crry

Page 363: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·359·

mov bx,k

mov al,a[bx]

add al,b[bx] ;al=a[k]+b[k]

add al,208 ;al=a[k]+b[k]− '0'

add al,crry ;al=a[k]+b[k]− '0'+crry

mov c[bx],al

;下面程序段类似算法研究程序里的 if (c[k]>'9')

mov bx,k

cmp c[bx],'9'

jle @1338

;下面程序段类似算法研究程序里的 c[k]− =10

mov bx,k

mov al,c[bx]

add al,246 ;al=al− 10

mov c[bx],al

mov crry,1 ;crry=1

jmp @1366

@1338:

mov crry,0 ;crry=0

@1366:

inc k ;循环变量+1

@1394:

cmp k,99 ;判断是否结束循环

jl @1170

mov c[99],0 ;c[99]=0

;下面程序段类似算法研究程序里的 for(k=98;k>0;k− − )

mov k,98 ;设置循环变量初值

jmp @1814 ;先去判断循环条件

@1702:

;下面程序段类似算法研究程序里的 if ((c[k]=='0') && (c[k+1]==0)) c[k]=0

mov bx,k

cmp c[bx],'0' ;c[k]=='0'

jne @1786

cmp c[bx+1],0 ;c[k+1]==0

jne @1786

mov c[bx],0 ;c[k]=0

@1786:

dec k ;循环变量− 1

Page 364: IBM-PC 汇编语言程序设计试题解

·360· IBM-PC 汇编语言程序设计试题解

@1814:

cmp k,0 ;判断是否结束循环

jg @1702

lea ax,c

push ax

call _strrev ;调用 strrev(c)

pop ax

;下面程序段类似算法研究程序里的 printf("a+b=%s\r\n",c)

lea ax,c

push ax

mov ax,offset f5

push ax

call _printf

pop ax

pop ax

ret

_main endp

end _start

【1026】计算任意两个正整数相乘的精确值(设它们的位数不超过 50)。

算法思路:

8086 提供 16位乘 16 位等于 32 位的乘法指令,当乘数大于 16位时,就不能直接使用乘

法指令了。我们先将两个正整数以字符的形式存放在数组里,然后再逐次相乘,乘完的结果

也以字符的形式存在一个数组里。我们提供的程序答案使用了字符串反序的功能,目的是实

现个位对齐,因为从键盘输入数据时,个位数是最后一个输入的。实现字符串反序的子程序

与 31 题不同,它使用了 8086 提供的串操作指令。

为了减少篇幅,字符串的键盘输入、屏幕输出功能直接调用了本书提供的函数库

(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

unsigned char a[100],b[100],c[100];

char k,k1,k2,crry;

for(k=0;k<100;k++)

{

a[k]=0; b[k]=0; c[k]=0;

}

printf("\r\nInput a =");

scanf("%s",a);

Page 365: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·361·

printf("Input b =");

scanf("%s",b);

strrev(a);

strrev(b);

for(k=0;k<99;k++)

{

if (a[k]==0) a[k]='0';

if (b[k]==0) b[k]='0';

a[k]− ='0';

b[k]− ='0';

}

crry=0;

for(k1=0;k1<50;k1++)

{

for(k2=0;k2<50;k2++)

{

crry=a[k1]*b[k2];

c[k1+k2]+= crry;

c[k1+k2+1]+= (c[k1+k2]/10);

c[k1+k2]=c[k1+k2]%10;

}

}

for(k=0;k<99;k++)

{

c[k]+='0';

}

c[99]=0;

for(k=98;k>0;k− − )

{

if ((c[k]=='0') && (c[k+1]==0)) c[k]=0;

}

strrev(c);

printf("a*b=%s\r\n",c);

}

汇编语言程序如下:

.model small

.data

a db 100 dup(0) ;算法研究程序里的 a[100]

Page 366: IBM-PC 汇编语言程序设计试题解

·362· IBM-PC 汇编语言程序设计试题解

b db 100 dup(0) ;算法研究程序里的 b[100]

c db 100 dup(0) ;算法研究程序里的 c[100]

k dw ? ;算法研究程序里的 k

k1 dw ? ;算法研究程序里的 k1

k2 dw ? ;算法研究程序里的 k2

crry db ? ;算法研究程序里的 crry

f1 db 13,10,'Input a =',0

f2 db '%s',0

f3 db 'Input b =',0

f4 db '%s',0

f5 db 'a*b=%s',13,10,0

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_strrev proc near

push bp

mov bp,sp

push si

push di

cld ;清除方向标记,使得字符串操作指令的

针自动增加

mov si,[bp+4] ;si=字符串首地址

;下面程序段计算字符串的长度,字符串以 0 字符表示结束

mov dx,si

mov di,si

push ds

pop es

mov al,0 ;al=结束字符

mov cx,0FFFFh

repne scasb ;Rep zf=0+cx >0 Scan es:[di] for

Page 367: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·363·

al,di++

cmp cx,0FFFEh ;对只有 1 个字符的字符串不做处理

je @123 ;Jump if equal

dec di ;di 指向结束字符

dec di ;di 指向最后一个有效字符

xchg si,di ;si 指向最后一个有效字符,si 指向第 1

字符

;下面程序段将字符串两头的字符逐个交换,直到中间位置

jmp @122 ;先去判断循环条件

@121:

mov al,[di]

xchg [si],al

stosb ;es:[di]=al,di++

dec si

@122:

cmp di,si ;判断是否结束循环

jb @121 ;Jump if below

@123:

xchg dx,ax ;ax 是倒序字符串的首地址

pop di

pop si

pop bp

ret

_strrev endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("\r\nInput a =")

mov ax,offset f1

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%s",a)

lea ax,a

push ax

mov ax,offset f2

Page 368: IBM-PC 汇编语言程序设计试题解

·364· IBM-PC 汇编语言程序设计试题解

push ax

call _scanf

pop ax

pop ax

;下面程序段类似算法研究程序里的 printf("Input b =")

mov ax,offset f3

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%s",b)

lea ax,b

push ax

mov ax,offset f4

push ax

call _scanf

pop ax

pop ax

lea ax,a

push ax

call _strrev ;调用 strrev(a)

pop ax

lea ax,b

push ax

call _strrev ;调用 strrev(b)

pop ax

;下面程序段类似算法研究程序里的 for(k=0;k<99;k++)

mov k,0 ;设置循环变量初值

jmp @1338 ;先去判断循环条件

@1170:

;下面程序段类似算法研究程序里的 if (a[k]==0) a[k]='0'

mov bx,k

cmp a[bx],0

jne @1226

mov a[bx],'0'

@1226:

;下面程序段类似算法研究程序里的 if (b[k]==0) b[k]='0'

Page 369: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·365·

mov bx,k

cmp b[bx],0

jne @1282

mov b[bx],'0'

@1282:

;下面程序段类似算法研究程序里的 a[k]− ='0'

mov bx,k

mov al,a[bx]

add al,208 ;将 ASCII 字符转换为数字

mov a[bx],al

;下面程序段类似算法研究程序里的 b[k]− ='0'

mov bx,k

mov al,b[bx]

add al,208 ;将 ASCII 字符转换为数字

mov b[bx],al

inc k ;循环变量+1

@1338:

cmp k,99 ;判断是否结束循环

jl @1170

mov crry,0 ;crry=0

;下面程序段类似算法研究程序里的 for(k1=0;k1<50;k1++)

mov k1,0

jmp @1534

@1394:

;下面程序段类似算法研究程序里的 for(k2=0;k2<50;k2++)

mov k2,0 ;设置循环变量初值

jmp @1478 ;先去判断循环条件

@1422:

;下面程序段类似算法研究程序里的 crry=a[k1]*b[k2]

mov bx,k1

mov al,a[bx]

mov bx,k2

mov dl,b[bx]

mul dl

mov crry,al

;下面程序段类似算法研究程序里的 c[k1+k2]+= crry

Page 370: IBM-PC 汇编语言程序设计试题解

·366· IBM-PC 汇编语言程序设计试题解

mov bx,k1

add bx,k2

mov al,crry

add c[bx],al

;下面程序段类似算法研究程序里的 c[k1+k2+1]+= (c[k1+k2]/10)

mov bx,k1

add bx,k2 ;bx=k1+k2

mov al,c[bx]

mov ah,0

mov cl,10

div cl ;al=c[k1+k2]/10,ah=c[k1+k2]%10

add c[bx+1],al

;下面程序段类似算法研究程序里的 c[k1+k2]=c[k1+k2]%10

mov c[bx],ah

inc k2 ;循环变量+1

@1478:

cmp k2,50 ;判断是否结束循环

jl @1422

inc k1 ;循环变量+1

@1534:

cmp k1,50 ;判断是否结束循环

jl @1394

;下面程序段类似算法研究程序里的 for(k=0;k<99;k++)

mov k,0 ;设置循环变量初值

jmp @1646 ;先去判断循环条件

@1590:

;下面程序段类似算法研究程序里的 c[k]+='0'

mov bx,k

mov al,c[bx]

add al,'0' ;数字转换为 ASCII 字符

mov c[bx],al

inc k ;循环变量+1

@1646:

cmp k,99 ;判断是否结束循环

jl @1590

mov c[99],0 ;c[99]=0

;下面程序段类似算法研究程序里的 for(k=98;k>0;k− − )

Page 371: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·367·

mov k,98 ;设置循环变量初值

jmp @1814 ;先去判断循环条件

@1702:

;下面程序段类似算法研究程序里的 if ((c[k]=='0') && (c[k+1]==0)) c[k]=0

mov bx,k

cmp c[bx],'0' ;c[k]=='0'

jne @1786

cmp c[bx+1],0 ;c[k+1]==0)

jne @1786

mov c[bx],0 ;c[k]=0

@1786:

dec k ;循环变量− 1

@1814:

cmp k,0 ;判断是否结束循环

jg @1702

lea ax,c

push ax

call _strrev ;调用 strrev(c)

pop ax

;下面程序段类似算法研究程序里的 printf("a*b=%s\r\n",c)

lea ax,c

push ax

mov ax,offset f5

push ax

call _printf

pop ax

pop ax

ret

_main endp

end _start

【1027】计算并打印杨辉三角形,要求打印到第 N 行,N 由键盘输入。

算法思路:

杨辉三角形的计算并不复杂,我们提供的程序利用二维数组的方式进行计算,即先初始

化数组,再计算,最后屏幕打印。使用多维数组在高级语言里很常见,但汇编语言没有直接

支持多维数组的指令,多维数组需要自己建立,访问多维数组时要自己计算数组元素的地址,

然后才能访问。我们的程序中定义了一个 20×20的二维数组,数组的存放符合 C 语言的标准,

Page 372: IBM-PC 汇编语言程序设计试题解

·368· IBM-PC 汇编语言程序设计试题解

即第一维的下标变化最慢,最右边的下标变换最快。例如,数组元素存放的顺序为:

a[0][0],a[0][1],a[0][2],...,a[0][19],a[1][0],a[1][1],...

为了减少篇幅,数字 N 的键盘输入、屏幕输出功能直接调用了本书提供的函数库

(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

int i,j,a[20][20];

unsigned char N;

printf("\r\nInput N=");scanf("%d",&N);

if (N>19)

{

printf("N too larger!\r\n");

exit(1);

}

for (i=1;i<=N;i++)

{

a[i][1]=1;

a[i][i]=1;

}

for (i=3;i<=N;i++)

{

for (j=2;j<=i− 1;j++)

{

a[i][j]=a[i− 1][j− 1]+a[i− 1][j];

}

}

for (i=1;i<=N;i++)

{

for (j=1;j<=i;j++)

{

printf("%4d ",a[i][j]);

}

printf("\n");

}

}

Page 373: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·369·

汇编语言程序如下:

MAXARRY equ 20

.model small

.data

a dw MAXARRY dup( MAXARRY dup(0))

;定义 WORD型二维数组 a[20][20]

N dw ? ;算法研究程序里的 N

;用 si 代替算法研究程序里的 i

;用 di 代替算法研究程序里的 j

f1 db 13,10,'Input N=',0

f2 db '%d',0

f3 db 'N too larger!',13,10,0

f4 db '%4d ',0

f5 db 13,10,0

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("\r\nInput N=")

mov ax,offset f1

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%d",&N)

lea ax,N

push ax

mov ax,offset f2

push ax

call _scanf

Page 374: IBM-PC 汇编语言程序设计试题解

·370· IBM-PC 汇编语言程序设计试题解

pop ax

pop ax

;下面程序段类似算法研究程序里的 if (N>19)

cmp N,MAXARRY− 1

jbe @86

;下面程序段类似算法研究程序里的 printf("N too larger!\r\n")

mov ax,offset f3

push ax

call _printf

pop ax

ret ;exit

@86:

;下面程序段类似算法研究程序里的 for (i=1;i<=N;i++)

mov si,1

jmp @170 ;先去判断循环条件

@114:

;下面程序段类似算法研究程序里的 a[i][1]=1

mov ax,si

mov bx,MAXARRY*2 ;因为是 WORD型数组,每个元素占 2Byte

imul bx

mov bx,1

shl bx,1 ;乘以 2 的运算,目的是为了寻址

1WORD 型数组中的元素

add bx,ax ;(bx)=数组元素 a[i][1]相对数组首地

址的偏移

mov a[bx],1 ;a[i][1]=1

;下面程序段类似算法研究程序里的 a[i][i]=1

mov ax,si

mov bx,MAXARRY*2

imul bx

mov bx,si

shl bx,1

add bx,ax

mov a[bx],1

inc si ;循环变量+1

@170:

cmp si,N ;判断是否结束循环

jle @114

Page 375: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·371·

;下面程序段类似算法研究程序里的 for (i=3;i<=N;i++)

mov si,3

jmp @366 ;先去判断循环条件

@226:

;下面程序段类似算法研究程序里的 for (j=2;j<=i− 1;j++)

mov di,2

jmp @310 ;先去判断循环条件

@254:

;下面程序段类似算法研究程序里的 a[i][j]=a[i− 1][j− 1]+a[i− 1][j]

mov ax,si

dec ax

mov bx,MAXARRY*2

imul bx

mov bx,di

shl bx,1

add bx,ax

mov cx,a[bx] ;cx=a[i− 1][j]

mov ax,si

dec ax

mov bx,MAXARRY*2

imul bx

mov bx,di

dec bx

shl bx,1

add bx,ax

add cx,a[bx] ;cx=cx+a[i− 1][j− 1]

mov ax,si

mov bx,MAXARRY*2

imul bx

mov bx,di

shl bx,1

add bx,ax

mov a[bx],cx ;a[i][j]=cx

inc di ;循环变量+1

@310:

mov ax,si

Page 376: IBM-PC 汇编语言程序设计试题解

·372· IBM-PC 汇编语言程序设计试题解

dec ax

cmp di,ax ;判断是否结束循环

jle @254

inc si ;循环变量+1

@366:

cmp si,N ;判断是否结束循环

jle @226

;下面程序段类似算法研究程序里的 for (i=1;i<=N;i++)

mov si,1

jmp @590 ;先去判断 i循环条件

@422:

;下面程序段类似算法研究程序里的 for (j=1;j<=i;j++)

mov di,1

jmp @506 ;先去判断 j循环条件

@450:

;下面程序段类似算法研究程序里的 printf("%4d ",a[i][j])

mov ax,si

mov bx,MAXARRY*2

imul bx

mov bx,di

shl bx,1

add bx,ax

push a[bx] ;利用堆栈传递 a[i][j]

mov ax,offset f4

push ax

call _printf

pop ax

pop ax

inc di ;循环变量+1

@506:

cmp di,si ;判断是否结束 j 循环

jle @450

;下面程序段类似算法研究程序里的 printf("\n")

mov ax,offset f5

push ax

call _printf

pop ax

inc si ;循环变量+1

Page 377: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·373·

@590:

cmp si,N ;判断是否结束 i 循环

jle @422

ret

_main endp

end _start

【1028】计算并打印帕斯卡三角,要求打印到第 N 行,N 由键盘输入。

算法思路:

我们提供的程序利用二维数组的方式进行帕斯卡三角的计算,即先初始化数组,再计算,

最后屏幕打印。使用多维数组在高级语言里很常见,但汇编语言没有直接支持多维数组的指

令,多维数组需要自己建立,访问多维数组时要自己计算数组元素的地址,然后才能访问。

我们的程序中定义了一个 20×20 的二维数组,数组的存放符合 C 语言的标准,即第一维的下

标 变 化 最 慢 , 最 右 边 的 下 标 变 换 最 快 。 例 如 , 数 组 元 素 存 放 的 顺 序 为 :

a[0][0],a[0][1],a[0][2],...,a[0][19],a[1][0],a[1][1],...

为了减少篇幅,数字 N 的键盘输入、屏幕输出功能直接调用了本书提供的函数库

(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

int i,j,a[100][100];

unsigned char N;

printf("\r\nInput N=");scanf("%d",&N);

if (N>99)

{

printf("N too larger!\r\n");

return;

}

N++;

for (i=1;i<N;i++)

{

a[i][1]=1;

a[1][i]=1;

}

for (i=2;i<N;i++)

{

for (j=2;j<=N− i;j++)

Page 378: IBM-PC 汇编语言程序设计试题解

·374· IBM-PC 汇编语言程序设计试题解

{

a[i][j]=a[i][j− 1]+a[i− 1][j];

}

}

for (i=1;i<N;i++)

{

for (j=1;j<=N− i;j++)

{

printf("%4d ",a[i][j]);

}

printf("\n");

}

}

汇编语言程序如下:

MAXARRY equ 20

.model small

.data

a dw MAXARRY dup( MAXARRY dup(0))

N dw ?

;用 si 代替算法研究程序里的 i

;用 di 代替算法研究程序里的 j

f1 db 13,10,'Input N=',0

f2 db '%d',0

f3 db 'N too larger!',13,10,0

f4 db '%4d ',0

f5 db 13,10,0

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

Page 379: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·375·

;下面程序段类似算法研究程序里的 printf("\r\nInput N=")

mov ax,offset f1

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%d",&N)

lea ax,N

push ax

mov ax,offset f2

push ax

call _scanf

pop ax

pop ax

;下面程序段类似算法研究程序里的 if (N>19)

cmp N,MAXARRY− 1

jbe @86

;下面程序段类似算法研究程序里的 printf("N too larger!\r\n")

mov ax,offset f3

push ax

call _printf

pop ax

ret ;return

@86:

inc N ;N++

;下面程序段类似算法研究程序里的 for (i=1;i<N;i++)

mov si,1

jmp @170 ;先去判断循环条件

@114:

;下面程序段类似算法研究程序里的 a[i][1]=1

mov ax,si

mov bx,MAXARRY*2 ;因为是 WORD 型数组,每个元素占 2Byte

imul bx

mov bx,1

shl bx,1 ;乘以2的运算,目的是为了寻址WORD型数

组中的元素

add bx,ax ;(bx)=数组元素 a[i][1]相对数组首地址的偏

mov a[bx],1

;下面程序段类似算法研究程序里的 a[1][i]=1

Page 380: IBM-PC 汇编语言程序设计试题解

·376· IBM-PC 汇编语言程序设计试题解

mov ax,1

mov bx,MAXARRY*2

imul bx

mov bx,si

shl bx,1

add bx,ax

mov a[bx],1

inc si ;循环变量+1

@170:

cmp si,N ;判断是否结束循环

jl @114

;下面程序段类似算法研究程序里的 for (i=2;i<N;i++)

mov si,2

jmp @366 ;先去判断循环条件

@226:

;下面程序段类似算法研究程序里的 for (j=2;j<=N− i;j++)

mov di,2

jmp @310 ;先去判断循环条件

@254:

;下面程序段类似算法研究程序里的 a[i][j]=a[i][j− 1]+a[i− 1][j]

mov ax,si

dec ax

mov bx,MAXARRY*2

imul bx

mov bx,di

shl bx,1

add bx,ax

mov cx,a[bx] ;cx=a[i− 1][j]

mov ax,si

mov bx,MAXARRY*2

imul bx

mov bx,di

dec bx

shl bx,1

add bx,ax

add cx,a[bx] ;cx=cx+a[i][j− 1]

mov ax,si

Page 381: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·377·

mov bx,MAXARRY*2

imul bx

mov bx,di

shl bx,1

add bx,ax

mov a[bx],cx ;a[i][j]=cx

inc di ;循环变量+1

@310:

mov ax,N

sub ax,si ;计算 N− i

cmp di,ax ;判断是否结束循环

jle @254

inc si ;循环变量+1

@366:

cmp si,N ;判断是否结束循环

jl @226

;下面程序段类似算法研究程序里的 for (i=1;i<N;i++)

mov si,1

jmp @590 ;先去判断 i循环条件

@422:

;下面程序段类似算法研究程序里的 for (j=1;j<=N− i;j++)

mov di,1

jmp @506 ;先去判断 j循环条件

@450:

;下面程序段类似算法研究程序里的 printf("%4d ",a[i][j])

mov ax,si

mov bx,MAXARRY*2

imul bx

mov bx,di

shl bx,1

add bx,ax

push a[bx] ;利用堆栈传递 a[i][j]

mov ax,offset f4

push ax

call _printf

pop ax

pop ax

inc di ;循环变量+1

Page 382: IBM-PC 汇编语言程序设计试题解

·378· IBM-PC 汇编语言程序设计试题解

@506:

mov ax,N

sub ax,si ;计算 N− i

cmp di,ax ;判断是否结束 j 循环

jle @450

;下面程序段类似算法研究程序里的 printf("\n")

mov ax,offset f5

push ax

call _printf

pop ax

inc si ;循环变量+1

@590:

cmp si,N ;判断是否结束 i 循环

jl @422

ret

_main endp

end _start

【1029】输入一个奇数 Q,计算并输出 Q 阶幻方阵。

例如:

8 1 6

3 5 7

4 9 2

算法思路:

奇数阶的幻方可以用下面方法填写得到:

(1)将 1 放在第一行中间一列。

(2)从 2 开始直到 Q2为止各数依次按下列规则存放。

每一个数存放的行比前一个数的行数减 1,列数加 1;

如果上一个数的行数为 1,则本数的行数为 Q;

如果上一个数的列数为 Q,则本数的列数为 1,行数减 1;

如果按上述规律确定的位置上已经有数,或上一个数是第一行第 Q 列,则把本数放

在上数的下面。

我们提供的程序利用二维数组的方式填写幻方,先填写,后屏幕打印。使用多维数组在

高级语言里很常见,但汇编语言没有直接支持多维数组的指令,多维数组需要自己建立,访

问多维数组时要自己计算数组元素的地址,然后才能访问。我们的程序中定义了一个 31×31

的二维数组,数组的存放符合 C 语言的标准,即第一维的下标变化最慢,最右边的下标变换

最 快 。 例 如 , 数 组 元 素 存 放 的 顺 序 为 :

Page 383: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·379·

a[0][0],a[0][1],a[0][2],...,a[0][19],a[1][0],a[1][1],...

为了减少篇幅,数字 N 的键盘输入、屏幕输出功能直接调用了本书提供的函数库

(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

unsigned int a[31][31];

unsigned int q;

unsigned int n;

unsigned int i,j,k;

for(;;)

{

printf("Input Q=");scanf("%d",&q);

if ((q<3) ||(q%2==0)) continue;

break;

}

n=q*q;

i=1;

j=(q+1)/2;

for (k=1;k<=n;k++)

{

a[i][j]=k;

if ((k− k/q*q)!=0)

{

if (i==1) i=q;

else i− − ;

if (j==q) j=1;

else j++;

}

else

{

if (i==q) i=1;

else i++;

}

}

for (i=1;i<=q;i++)

{

for (j=1;j<=q;j++)

printf("%4d",a[i][j]);

Page 384: IBM-PC 汇编语言程序设计试题解

·380· IBM-PC 汇编语言程序设计试题解

printf("\r\n");

}

}

汇编语言程序如下:

MAXARRY equ 31

.model small

.data

a dw MAXARRY dup( MAXARRY dup(0))

n dw ?

q dw ?

;用 si 代替算法研究程序里的 i

;用 di 代替算法研究程序里的 j

;用 cx 代替算法研究程序里的 k

f1 db 'Input Q=',0

f2 db '%d',0

f3 db '%4d',0

CRLF db 13,10,0

.code

extrn _printf:near ;使用库函数_printf

extrn _scanf:near ;使用库函数_scanf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 for(;;)

@58:

;下面程序段类似算法研究程序里的 printf("Input Q=")

mov ax,offset f1

push ax

call _printf

pop ax

;下面程序段类似算法研究程序里的 scanf("%d",&q)

lea ax,q

Page 385: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·381·

push ax ;利用堆栈将 q 的地址传递到子程序

mov ax,offset f2

push ax

call _scanf

pop ax

pop ax

;下面程序段类似算法研究程序里的 if ((q<3) ||(q%2==0)) continue

cmp q,3

jb @58

test q,1 ;最低位为 1表示奇数

je @58

mov ax,q

imul q

mov n,ax ;n=q*q

mov si,1 ;i=1

mov di,q

inc di

shr di,1 ;j=(q+1)/2;

;下面程序段类似算法研究程序里的 for (k=1;k<=n;k++)

mov cx,1

jmp @450 ;先去判断循环条件

@142:

;下面程序段类似算法研究程序里的 a[i][j]=k

mov ax,si

mov bx,MAXARRY*2 ;因为是 WORD 型数组,每个元素占 2Byte

imul bx

mov bx,di

shl bx,1 ;乘以 2 的运算,目的是为了寻址 WORD 型

数组中的元素

add bx,ax ; (bx)=数组元素 a[i][j]相对数组首地址的偏

mov a[bx],cx

;下面程序段类似算法研究程序里的 if ((k− k/q*q)!=0)

mov ax,cx

xor dx,dx

div q ;(ax)=k/q

imul q ;(ax)=(ax)*q

mov dx,cx

Page 386: IBM-PC 汇编语言程序设计试题解

·382· IBM-PC 汇编语言程序设计试题解

sub dx,ax ;(dx)=k− k/q*q

or dx,dx ;影响标志位,用于判断 dx 是否为 0

je @338

;下面程序段类似算法研究程序里的 if (i==1) i=q

cmp si,1

jne @226

mov si,q

jmp @254

@226:

dec si ;else i− −

@254:

;下面程序段类似算法研究程序里的 if (j==q) j=1

cmp di,q

jne @310

mov di,1

jmp @422

@310:

inc di ;else j++

jmp @422

@338:

;下面程序段类似算法研究程序里的 if (i==q) i=1

cmp si,q

jne @394

mov si,1

jmp @422

@394:

inc si ;else i++

@422:

inc cx ;循环变量+1

@450:

cmp cx,n ;判断是否结束 k 循环

jbe @142

;下面程序段类似算法研究程序里的 for (i=1;i<=q;i++)

mov si,1

jmp @674 ;先去判断循环条件

@506:

;下面程序段类似算法研究程序里的 for (j=1;j<=q;j++)

mov di,1

jmp @590 ;先去判断循环条件

Page 387: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·383·

@534:

;下面程序段类似算法研究程序里的 printf("%4d",a[i][j])

mov ax,si

mov bx,MAXARRY*2

imul bx

mov bx,di

shl bx,1

add bx,ax

push a[bx] ;利用堆栈将 a[i][j]传递到子程序

mov ax,offset f3

push ax

call _printf

pop ax

pop ax

inc di ;循环变量+1

@590:

cmp di,q ;判断是否结束 j 循环

jbe @534

;下面程序段类似算法研究程序里的 printf("\r\n")

mov ax,offset CRLF

push ax

call _printf

pop ax

inc si ;循环变量+1

@674:

cmp si,q ;判断是否结束 i 循环

jbe @506

ret

_main endp

end _start

【1030】一个数如果恰好等于它的因子之和,这个数就称为“完数”,例如,6 的因子为

1,2,3,而 6=1+2+3,因此 6 是完数。编程找出 10000以内的所有完数。

算法思路:

本题可以用循环程序筛选的方法。筛选某数字时,先分解得到它的所有因子,保存在数

组例,然后将这些因子相加,如果符合完数的要求,则在屏幕上打印。

C 语言编写的算法研究程序:

void main(void)

{

Page 388: IBM-PC 汇编语言程序设计试题解

·384· IBM-PC 汇编语言程序设计试题解

unsigned int k[100];

unsigned int i,j,n,s;

for(j=2;j<10000;j++)

{

n=0;

s=j;

for(i=1;i<j;i++)

{

if (j%i==0)

{

s− =i;

k[n]=i;

n++;

}

}

n− − ;

if (s==0)

{

printf("%04d its factors are ",j);

for(i=0;i<=n;i++)

printf("%04d,",k[i]);

printf("\r\n");

}

}

}

汇编语言程序如下:

.model small

.data

f1 db ' its factors are ','$'

f2 db ',','$'

CRLF db 13,10,'$'

k dw 100 dup(0)

n dw ?

;用 si 代替算法研究程序里的 i

;用 di 代替算法研究程序里的 j

;用 cx 代替算法研究程序里的 s

.code

DISP PROC NEAR

Page 389: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·385·

PUSH BP

MOV BP,SP

MOV AX,[BP+4] ;取要显示的数字

PUSH SI

MOV SI,0 ;设置循环初始

JMP @100 ;先去判断循环条件

@50:

MOV DX,0

MOV BX,10 ;以 10 进制形式显示

DIV BX

PUSH DX ;利用堆栈依次保存个位、十位、....

INC SI ;循环变量+1

@100:

CMP SI,4 ;判断是否结束循环,共显示 4 位数字

JL @50

MOV SI,0 ;设置循环初始

JMP @200 ;先去判断循环条件

@150:

POP DX ;从堆栈中依次弹出...、十位、个位

ADD DL,30H ;转换为 ASCII 码

MOV AH,2

PUSH SI ;防止 DOS 中断改变 SI

INT 21H ;调用 DOS 中断显示一个字符

POP SI ;恢复 SI

INC SI ;循环变量+1

@200:

CMP SI,4 ;判断是否结束循环,共显示 4 位数字

JL @150

POP SI

POP BP

RET

DISP ENDP

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 for(j=2;j<10000;j++)

mov di,2 ;设置循环变量初始值

Page 390: IBM-PC 汇编语言程序设计试题解

·386· IBM-PC 汇编语言程序设计试题解

jmp @394 ;先去判断循环条件

@58:

mov n,0 ;n=0

mov cx,di ;s=j

;下面程序段类似算法研究程序里的 for(i=1;i<j;i++)

mov si,1 ;设置循环变量初始值

jmp @170 ;先去判断循环条件

@86:

;下面程序段类似算法研究程序里的 if (j%i==0)

mov ax,di

xor dx,dx

div si ;(dx)=j%i

or dx,dx ;获得标志位

jne @142

sub cx,si ;s=s− i

mov bx,n

shl bx,1 ;k是 WORD 型数组,一个数组元素占 2

字节

mov k[bx],si ;k[n]=i

inc n ;n++

@142:

inc si ;循环变量+1

@170:

cmp si,di ;判断是否结束 i 循环

jb @86

dec n ;n− −

;下面程序段类似算法研究程序里的 if (s==0)

or cx,cx ;获得标志位

jne @366

;下面程序段类似算法研究程序里的 printf("%04d its factors are ",j)

push di

call DISP

pop di

mov dx,offset f1

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 for(i=0;i<=n;i++)

xor si,si ;设置循环变量初始值

jmp @310 ;先去判断循环条件

Page 391: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·387·

@254:

;下面程序段类似算法研究程序里的 printf("%04d,",k[i])

mov bx,si

shl bx,1

push k[bx]

call DISP

pop cx

mov dx,offset f2

mov ah,9

int 21h

inc si ;循环变量+1

@310:

cmp si,n ;判断是否结束 i 循环

jbe @254

mov dx,offset CRLF

mov ah,9

int 21h

@366:

inc di ;循环变量+1

@394:

cmp di,10000 ;判断是否结束 j 循环

jl @58

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main endp

end _main

【1031】找出由数字 1~9中的任意三位数字组成的且满足下列条件的全部三位数:(1)

1~9 中的任意一个数字在这些三位数中只能出现一次;(2)这些三位数都必须是完全平方

数,即其平方根是整数。

算法思路:

(1)由 1~9组成的且没有相同数字的三位数必在 123~987之间,且有 3 个。

(2)再考虑到完全平方数的要求,这些三位数应在 169(132)~961(31

2)之间。因为 10

2,

112,12

2均不满足第 1 条要求,而 32

2=1024 不是三位数。其中 20

2和 30

2也不满足第 1 条的要

求。

(3)为了找出满足条件的三位数,先把第 169~961 之间的全部完全平方数找出来,然

后每次取出 3 个检查其 9 位数字是否有相同者,若均不相同,则这 3 个完全平方数就是要找

Page 392: IBM-PC 汇编语言程序设计试题解

·388· IBM-PC 汇编语言程序设计试题解

的数。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

void main(void)

{

unsigned int a[21],b[10];

unsigned int i,l,m,n,p,q;

printf("\r\n");

i=0;

for (p=13;p<=31;p++)

{

if (p%10 !=0)

{

i++;

a[i]=p*p;

}

}

for (l=1;l<=i− 2;l++)

{

b[1]=a[l]/100;

b[2]=(a[l]/10)%10;

b[3]=a[l]%10;

for (m=1;m<=i− 1;m++)

{

b[4]=a[m]/100;

b[5]=(a[m]/10)%10;

b[6]=a[m]%10;

for (n=1;n<=i;n++)

{

b[7]=a[n]/100;

b[8]=(a[n]/10)%10;

b[9]=a[n]%10;

for (p=1;p<=8;p++)

{

for (q=p+1;q<=9;q++)

{

if (b[p]==b[q]) goto a240;

}

}

Page 393: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·389·

printf("%3d %3d %3d\r\n",a[l],a[m],a[n]);

a240:

}

}

}

}

汇编语言程序如下:

.model small

.data

CRLF db 13,10,0

f1 db '%3d %3d %3d',13,10,0

a dw 21 dup(0)

b dw 10 dup(0)

i dw ?

q dw ?

n dw ?

;用 cx 代替算法研究程序里的 p

;用 si 代替算法研究程序里的 l

;用 di 代替算法研究程序里的 m

.code

extrn _printf:near ;使用库函数_printf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

;下面程序段类似算法研究程序里的 printf("\r\n")

mov ax,offset CRLF

push ax

call _printf

pop ax

mov i,0

;下面程序段类似算法研究程序里的 for (p=13;p<=31;p++)

Page 394: IBM-PC 汇编语言程序设计试题解

·390· IBM-PC 汇编语言程序设计试题解

mov cx,13

jmp @142 ;先去判断循环条件

@58:

;下面程序段类似算法研究程序里的 if (j%10 !=0)

mov ax,cx

mov bx,10

xor dx,dx

div bx

or dx,dx

je @114

inc i

;下面程序段类似算法研究程序里的 a[i]=j*j

mov ax,cx

imul cx

mov bx,i

shl bx,1

mov a[bx],ax

@114:

inc cx ;循环变量+1

@142:

cmp cx,31 ;判断是否结束 p 循环

jbe @58

;下面程序段类似算法研究程序里的 for (l=1;l<=i− 2;l++)

mov si,1

jmp @618 ;先去判断循环条件

@198:

;下面程序段类似算法研究程序里的 b[1]=a[l]/100

mov bx,si

shl bx,1

mov ax,a[bx]

mov bx,100

xor dx,dx

div bx

mov b[2],ax

;下面程序段类似算法研究程序里的 b[2]=(a[l]/10)%10

mov bx,si

shl bx,1

mov ax,a[bx]

Page 395: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·391·

mov bx,10

xor dx,dx

div bx

xor dx,dx

div bx

mov b[4],dx

;下面程序段类似算法研究程序里的 b[3]=a[l]%10

mov bx,si

shl bx,1

mov ax,a[bx]

mov bx,10

xor dx,dx

div bx

mov b[6],dx

;下面程序段类似算法研究程序里的 for (m=1;m<=i− 1;m++)

mov di,1

jmp @562 ;先去判断循环条件

@226:

;下面程序段类似算法研究程序里的 b[4]=a[m]/100

mov bx,di

shl bx,1

mov ax,a[bx]

mov bx,100

xor dx,dx

div bx

mov b[8],ax

;下面程序段类似算法研究程序里的 b[5]=(a[m]/10)%10

mov bx,di

shl bx,1

mov ax,a[bx]

mov bx,10

xor dx,dx

div bx

xor dx,dx

div bx

mov b[10],dx

;下面程序段类似算法研究程序里的 b[6]=a[m]%10

mov bx,di

shl bx,1

Page 396: IBM-PC 汇编语言程序设计试题解

·392· IBM-PC 汇编语言程序设计试题解

mov ax,a[bx]

mov bx,10

xor dx,dx

div bx

mov b[12],dx

;下面程序段类似算法研究程序里的 for (n=1;n<=i;n++)

mov n,1

jmp @506 ;先去判断循环条件

@254:

;下面程序段类似算法研究程序里的 b[7]=a[n]/100

mov bx,n

shl bx,1

mov ax,a[bx]

mov bx,100

xor dx,dx

div bx

mov b[14],ax

;下面程序段类似算法研究程序里的 b[8]=(a[n]/10)%10

mov bx,n

shl bx,1

mov ax,a[bx]

mov bx,10

xor dx,dx

div bx

xor dx,dx

div bx

mov b[16],dx

;下面程序段类似算法研究程序里的 b[9]=a[n]%10

mov bx,n

shl bx,1

mov ax,a[bx]

mov bx,10

xor dx,dx

div bx

mov b[18],dx

;下面程序段类似算法研究程序里的 for (p=1;p<=8;p++)

mov cx,1

jmp @422 ;先去判断循环条件

@282:

Page 397: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·393·

;下面程序段类似算法研究程序里的 for (q=p+1;q<=9;q++)

mov ax,cx

inc ax

mov q,ax

jmp @366 ;先去判断循环条件

@310:

;下面程序段类似算法研究程序里的 if (b[p]==b[q]) goto a240

mov bx,cx

shl bx,1

mov ax,b[bx]

mov bx,q

shl bx,1

cmp ax,b[bx]

je @478

inc q ;循环变量+1

@366:

cmp q,9 ;判断是否结束 q 循环

jbe @310

inc cx ;循环变量+1

@422:

cmp cx,8 ;判断是否结束 p 循环

jbe @282

; 下 面 程 序 段 类 似 算 法 研 究 程 序 里 的

printf("%3d %3d %3d\r\n",a[l],a[m],a[n])

mov bx,n

shl bx,1

push a[bx]

mov bx,di

shl bx,1

push a[bx]

mov bx,si

shl bx,1

push a[bx]

mov ax,offset f1

push ax

call _printf

add sp,8

@478:

inc n ;循环变量+1

Page 398: IBM-PC 汇编语言程序设计试题解

·394· IBM-PC 汇编语言程序设计试题解

@506:

mov ax,n

cmp ax,i ;判断是否结束 n 循环

ja @510

jmp @254

@510:

inc di ;循环变量+1

@562:

mov ax,i

dec ax

cmp ax,di ;判断是否结束 m 循环

jb @600

jmp @226

@600:

inc si ;循环变量+1

@618:

mov ax,i

sub ax,2

cmp ax,si ;判断是否结束 l 循环

jb @a240

jmp @198

@a240:

ret

_main endp

end _start

【1032】给出一百分制成绩,要求输出成绩等级“A”,“B”,“C”,“D”,“E”。90 分

以上为 A,80~89 分为 B,70~79 分为 C,60~69 分为 D,60分以下为 E。

算法思路:

这是一个利用多分支程序结构解决任务的题目。

C 语言编写的算法研究程序:

void main(void)

{

int score=89,temp;

char grade;

temp=score/10;

if (temp>9)

{

temp=9;

Page 399: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·395·

}

switch (temp)

{

case 9:grade='A';break;

case 8:grade='B';break;

case 7:grade='C';break;

case 6:grade='D';break;

case 5:

case 4:

case 3:

case 2:

case 1:

case 0:grade='E';break;

}

printf("%c",grade);

}

汇编语言程序如下:

.model small

.code ;定义代码段

_main proc near

mov si,89 ;si 是算法研究程序里的 score,di 是算

研究程序里的 temp

mov ax,si

mov bx,10 ;temp=score/10

cwd

idiv bx

cmp ax,9

jna @114

mov ax,9 ;当 temp>9时,强制 temp=9,避免超出程

序选择范围的情况

@114:

mov di,ax

mov bx,di

shl bx,1 ;为了查 WORD 类型表,要做乘 2 的运算

jmp word ptr cs:@C04[bx]

@198: mov cl,'A' ;cl 是算法研究程序里的 grade

jmp @338

@226: mov cl,'B'

Page 400: IBM-PC 汇编语言程序设计试题解

·396· IBM-PC 汇编语言程序设计试题解

jmp @338

@254: mov cl,'C'

jmp @338

@282: mov cl,'D'

jmp @338

@310: mov cl,'E'

jmp @338

@338: mov dl,cl ;调用 DOS 中断,显示一个字符

mov ah,02h

int 21h

mov ax,4c00h ;调用 DOS 中断,返回系统

int 21h

_main endp

@C04 label word ;多分支的跳转地址表

dw @310 ;BX=0 要跳转的地址

dw @310 ;BX=2 要跳转的地址

dw @310 ;BX=4 要跳转的地址

dw @310 ;...

dw @310

dw @310

dw @282

dw @254

dw @226

dw @198

end _main

【1033】编写一用箭头键控制光标移动的程序:箭头控制移动,ALT+箭头控制移动并画

线,CTRL+箭头控制移动并擦除。

算法思路:

本题程序的主要部分是一个 switch多分支结构,并涉及键盘读取、屏幕显示等 BIOS 中

断调用的技术。

C 语言编写的算法研究程序:

void main(void)

{

int key=0,x=1,y=1;

clrscr();

_setcursortype(_SOLIDCURSOR);

gotoxy(1,25);

printf("<ESC>: Exit Alt− Arrow: Paint Ctrl_Arrow: Earse KEY

Page 401: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·397·

CODE :");

gotoxy(x,y);

while (key != 27)

{

gotoxy(x,y);

key=keycode();

switch (key)

{

case ALT_UPARROW_KEY :putch(0xb1);if (y>1) y −

− ;break;

case ALT_LEFTARROW_KEY :putch(0xb1);if (x>1) x −

− ;break;

case ALT_RIGHTARROW_KEY :putch(0xb1);if (x<80)

x++;break;

case ALT_DOWNARROW_KEY :putch(0xb1);if (y<24)

y++;break;

case CTRL_UPARROW_KEY :putch(32);if (y>1) y −

− ;break;

case CTRL_LEFTARROW_KEY :putch(32);if (x>1) x −

− ;break;

case CTRL_RIGHTARROW_KEY:putch(32);if (x<80) x++;break;

case CTRL_DOWNARROW_KEY :putch(32);if (y<24)

y++;break;

case UPARROW_KEY :if (y>1) y− − ;break;

case LEFTARROW_KEY :if (x>1) x− − ;break;

case RIGHTARROW_KEY :if (x<80) x++;break;

case DOWNARROW_KEY :if (y<24) y++;break;

default:break;

}

gotoxy(67,25);

printf("%04XH %02d,%02d",key,x,y);

}

}

汇编语言程序如下:

.model small

.data ;定义数据段

f1 db '<ESC>: Exit Alt − Arrow: Paint Ctrl_Arrow: Earse KEY

CODE :','$'

f2 db '%04XH %02d,%02d',0

Page 402: IBM-PC 汇编语言程序设计试题解

·398· IBM-PC 汇编语言程序设计试题解

key dw 0

;用 si 代替算法研究程序里的 x

;用 di 代替算法研究程序里的 y

.code ;定义代码段

extrn _printf:near ;使用库函数_printf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

_clrscr proc near ;清除屏幕的子程序

mov bh,0 ;光标移动到 0 行 0 列

mov dx,0

mov ah,2

int 10h

mov al,' ' ;显示 2000个空格

mov ah,0ah

mov bh,0

mov cx,2000

int 10h

ret

_clrscr endp

_keycode proc near ;读键盘

mov ah,10h ;AT 键盘用 10h,83/84 键盘用 0h

int 16h

ret

_keycode endp

_putch proc near ;显示字符的子程序

push bp

mov bp,sp

mov ax,[bp+4] ;从堆栈里取出要显示的字符

mov ah,0eh

mov bh,0

int 10h

pop bp

Page 403: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·399·

ret

_putch endp

_gotoxy proc near ;移动光标的子程序

push bp

mov bp,sp

mov ax,[bp+4] ;从堆栈里取出列号

mov bx,[bp+6] ;从堆栈里取出行号

mov dh,bl

dec dh

mov dl,al

dec dl

mov bh,0

mov ah,2

int 10h

pop bp

ret

_gotoxy endp

_setcursortype proc near ;设置光标形式的子程序

mov cx,0fh

mov ah,1

int 10h

ret

_setcursortype endp

_main proc near ;库函数初始化程序自动调用_main 过程

mov ax,@data ;取数据段地址

mov ds,ax

mov si,1 ;x=1

mov di,1 ;y=1

call _clrscr ;调用 clrscr()

call _setcursortype ;调用_setcursortype(_SOLIDCURSOR)

;下面程序段类似算法研究程序里的 gotoxy(1,25)

mov ax,25

push ax

mov ax,1

push ax

Page 404: IBM-PC 汇编语言程序设计试题解

·400· IBM-PC 汇编语言程序设计试题解

call _gotoxy

pop cx

pop cx

;下面程序段类似算法研究程序里的 printf("<ESC>: Exit....

mov dx,offset f1

mov ah,9

int 21h

;下面程序段类似算法研究程序里的 gotoxy(x,y)

push di

push si

call _gotoxy

pop cx

pop cx

;下面程序段类似算法研究程序里的 while (key != 27)

jmp @926 ;首先去判断循环条件

@58:

;下面程序段类似算法研究程序里的 gotoxy(x,y)

push di

push si

call _gotoxy

pop cx

pop cx

;下面程序段类似算法研究程序里的 key=keycode()

call _keycode

mov key,ax

;下面程序段类似算法研究程序里的 switch (key)

;利用循环程序将键值 key 与键值表中的数据依次比较

;根据比较结果,查跳转表,然后执行跳转程序

mov cx,12

mov bx,0 ;(BX)为表指针

@100:

mov ax,key

and ax,0ff00h ;忽略键值的字符码

cmp ax,cs:KEY_NUMBER[bx]

je @200 ;在表中查到了相应的键值

add bx,2 ;表指针增加,指向下一个表元素

loop @100

jmp @900 ;去 default:

@200:

Page 405: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·401·

jmp cs:JMP_TABLE[bx]

@226:

;下面程序段类似算法研究程序里的 case ALT_UPARROW_KEY:putch(0xb1);if

(y>1) y− − ;break

mov ax,177

push ax

call _putch

pop cx

cmp di,1

jg @254

jmp @900

@254:

dec di

jmp @900

@282:

;下面程序段类似算法研究程序里的 case ALT_LEFTARROW_KEY:putch(0xb1);if

(x>1) x− − ;break

mov ax,177

push ax

call _putch

pop cx

cmp si,1

jg @290

jmp @900

@290:

dec si

jmp @900

@338:

;下面程序段类似算法研究程序里的 case ALT_RIGHTARROW_KEY:putch(0xb1);if

(x<80) x++;break

mov ax,177

push ax

call _putch

pop cx

cmp si,80

jl @390

jmp @900

@390:

inc si

Page 406: IBM-PC 汇编语言程序设计试题解

·402· IBM-PC 汇编语言程序设计试题解

jmp @900

@394:

;下面程序段类似算法研究程序里的 case ALT_DOWNARROW_KEY:putch(0xb1);if

(y<24) y++;break

mov ax,177

push ax

call _putch

pop cx

cmp di,24

jl @420

jmp @900

@420:

inc di

jmp @900

@450:

;下面程序段类似算法研究程序里的 case CTRL_UPARROW_KEY:putch(32);if (y>1)

y− − ;break

mov ax,32

push ax

call _putch

pop cx

cmp di,1

jg @480

jmp @900

@480:

dec di

jmp @900

@506:

;下面程序段类似算法研究程序里的 case CTRL_LEFTARROW_KEY:putch(32);if

(x>1) x− − ;break

mov ax,32

push ax

call _putch

pop cx

cmp si,1

jg @520

jmp @900

@520:

dec si

Page 407: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·403·

jmp @900

@562:

;下面程序段类似算法研究程序里的 case CTRL_RIGHTARROW_KEY:putch(32);if

(x<80) x++;break

mov ax,32

push ax

call _putch

pop cx

cmp si,80

jl @580

jmp @900

@580:

inc si

jmp @900

@618:

;下面程序段类似算法研究程序里的 case CTRL_DOWNARROW_KEY:putch(32);if

(y<24) y++;break

mov ax,32

push ax

call _putch

pop cx

cmp di,24

jl @650

jmp @900

@650:

inc di

jmp @900

@674:

;下面程序段类似算法研究程序里的 case UPARROW_KEY:if (y>1) y− − ;break

cmp di,1

jg @700

jmp @900

@700:

dec di

jmp @900

@730:

;下面程序段类似算法研究程序里的 case LEFTARROW_KEY:if (x>1) x− − ;break

cmp si,1

jg @740

Page 408: IBM-PC 汇编语言程序设计试题解

·404· IBM-PC 汇编语言程序设计试题解

jmp @900

@740:

dec si

jmp @900

@758:

dec si

jmp @900

@786:

;下面程序段类似算法研究程序里的 case RIGHTARROW_KEY:if (x<80) x++;break

cmp si,80

jl @810

jmp @900

@810:

inc si

jmp @900

@842:

;下面程序段类似算法研究程序里的 case DOWNARROW_KEY:if (y<24) y++;break

cmp di,24

jge @900

@870:

inc di

@900: ; 本 标 号 类 似 算 法 研 究 程 序 里 的

default:break

;下面程序段类似算法研究程序里的 gotoxy(67,25)

mov ax,25

push ax

mov ax,67

push ax

call _gotoxy

pop cx

pop cx

;下面程序段类似算法研究程序里的 printf("%04XH %02d,%02d",key,x,y)

push di

push si

push key

mov ax,offset f2

push ax

call _printf

add sp,8

Page 409: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·405·

@926:

mov ax,key

and ax,0ffh ;忽略键值的扫描码

cmp ax,27 ;判断是否结束 while 循环

je @1000

jmp @58

@1000:

ret

_main endp

KEY_NUMBER label word

CTRL_UPARROW_KEY dw 8d00h

CTRL_DOWNARROW_KEY dw 9100h

ALT_UPARROW_KEY dw 9800h

ALT_LEFTARROW_KEY dw 9b00h

ALT_RIGHTARROW_KEY dw 9d00h

ALT_DOWNARROW_KEY dw 0a000h

UPARROW_KEY dw 4800h

LEFTARROW_KEY dw 4b00h

RIGHTARROW_KEY dw 4d00h

DOWNARROW_KEY dw 5000h

CTRL_LEFTARROW_KEY dw 7300h

CTRL_RIGHTARROW_KEY dw 7400h

JMP_TABLE label word

dw @450

dw @618

dw @226

dw @282

dw @338

dw @394

dw @674

dw @730

dw @786

dw @842

dw @506

dw @562

end _start

Page 410: IBM-PC 汇编语言程序设计试题解

·406· IBM-PC 汇编语言程序设计试题解

【1034】用子程序递归的方法实现 N!的计算,N 在数据段初始化。

算法思路:

求 N!可以用递推的算法,即从 1 开始,乘 2,乘 3,...,一直到 N。本题要求用递归的

方法,即:

N!=N×(N-1)!,而(N-1)!=(N-1)×(N-2)!,...,直到 1!=1,0!=1。递归公式

如下:

> − ×

= =

1 N 1 N N

1 0 N 1 N

)! (

, !

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

int fac(int n)

{

int f;

if (n==0 || n==1) f=1;

else f=fac(n− 1)*n;

return(f);

}

void main(void)

{

int y,n=5;

y=fac(n);

printf("%d\n",y);

}

汇编语言程序如下:

.model small

.data ;定义数据段

f1 db '%05d',10,0

n dw 5

y dw ?

.code ;定义代码段

extrn _printf:near ;使用库函数_printf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

Page 411: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·407·

_fac proc near

push bp

mov bp,sp

push si ;si 代替算法研究程序里的 n

push di ;di 代替算法研究程序里的 f

mov si,[bp+4] ;从堆栈中取出 n

;以下程序段类似算法研究程序里的 if (n==0 || n==1) f=1

or si,si ;n==0

je @86

cmp si,1 ;n==1

jne @114

@86: mov di,1 ;f=1

jmp @142

@114:

mov ax,si

dec ax

push ax

call _fac

imul si

mov di,ax

@142:

mov ax,di ;利用(ax)传递函数返回值

pop di

pop si

pop bp

ret 2 ;空弹出方法,恢复堆栈

_fac endp

_main proc near ;库函数初始化程序自动调用_main 过程

mov ax,@data ;取数据段地址

mov ds,ax

push n

call _fac

mov y,ax

;以下程序段类似算法研究程序里的 printf("%d\n",y)

push y

mov ax,offset f1

push ax

call _printf

Page 412: IBM-PC 汇编语言程序设计试题解

·408· IBM-PC 汇编语言程序设计试题解

add sp,4 ;空弹出方法,恢复堆栈

ret

_main endp

end _start

【1035】在内存中驻留一程序,每秒钟响声一次,类似钟表。(提示:用中断 1CH)

本题要求编写一驻留内存的中断服务程序。编写驻留内存的中断服务程序要注意以下几点:

(1)注意保护被程序使用的寄存器,如答案 ring 程序中的 push AX 指令。

(2)如果允许中断嵌套,则应及时使用 STI 指令开中断。

(3)中断程序要尽量短小。中断程序的执行时间也要尽可能地短。如答案中设置发声和关

闭发声是在两次中断中完成的,而不是在一次中断发生时,先发声,再延时,然后关闭声音。

(4)驻留内存的中断服务程序主要任务,是给原中断服务程序添加新的功能,或替换原

中断服务程序。给原中断服务程序添加新的功能时,要注意原有的程序不能被遗弃,即在发

生中断时,新程序要执行,原有的程序也应该执行,答案中 jmp cs:old_1c 指令为此设置。

cseg segment para 'code'

assume cs:cseg

ring proc far

push ax

sti ;开中断,允许中断嵌套

inc cs:count ;计数器+1

cmp cs:count,10 ;count=10 时,执行开启发声的程序

je ring_on

cmp cs:count,18 ;count=18 时,执行关闭发声的程序

jge ring_off

jmp exit

ring_off:

mov cs:count,0 ;计数器满 18 后表示时间已经达到 1 秒,

数器清 0

in al,61h ;控制 8255芯片的端口,关闭发声

and al,11111100b

out 61h,al

jmp exit

ring_on:

in al,61h ;控制 8255芯片的端口,开启发声

or al,3

out 61h,al

exit:

pop ax

Page 413: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·409·

jmp cs:old_1c ;执行内存中原 1CH 的中断程序

ring endp

count db 0 ;保存 1CH 中断次数的计数器

old_1c dd ? ;保存原 1CH中断的入口地址

len equ $− ring ;用于计算驻留程序长度

timer equ 40h ;8253 芯片的端口地址

main proc far

mov ax,351ch ;取原 1CH 中断的入口地址

int 21h

mov word ptr cs:old_1c,bx

mov word ptr cs:old_1c[2],es

mov dx,seg ring ;设置新 1CH中断的入口地址

mov ds,dx

mov dx,offset ring

mov ax,251ch

int 21h

;下面程序段设置 8253 芯片的通道 2,目的是设置发声的频率

cli

mov al,10110110b ;通道 2,方式 3,先 lsb后 msb

out timer+3,al

mov ax,533h

out timer+2,al

mov al,ah

out timer+2,al

sti

;驻留并退出

mov dx,(len+15)/16+10h

mov ax,3100h

int 21h

main endp

cseg ends

end main

【1036】编写无符号双字除以无符号双字的程序,无符号双字的除数与被除数直接在数

据段初始化。

算法思路:

8086 没有双字的除法指令,做双字的除法运算可模仿手工竖式除法运算的方法,与通常

手工除法的差别是执行二进制运算。与手工除法的道理一样,做双字(32 位)的除法运算需要

Page 414: IBM-PC 汇编语言程序设计试题解

·410· IBM-PC 汇编语言程序设计试题解

做 32 次比较、减法等运算,每次运算可以得到商的 1 个 bit。我们提供的参考答案没有考虑

除数为 0 的情况。参考答案稍加修改,可以实现有符号双字的除法运算。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

汇编语言程序如下:

.model small

.data ;定义数据段

xh dw 8765h ;被除数的高字

xl dw 4321h ;被除数的低字

yh dw 1234h ;除数的高字

yl dw 5678h ;除数的低字

zh dw ? ;商的高字

zl dw ? ;商的低字

f1 db "%lu",10,0

.code

extrn _printf:near ;使用库函数_printf

public _main

extrn startx:near ;库函数初始化程序入口

_start proc near

jmp startx ;首先初始化库函数

_start endp

ul_DIV proc near

push bp

push si

push di

mov bp,sp

mov ax,[bp+08h] ;被除数低字

mov dx,[bp+0Ah] ;被除数高字

mov bx,[bp+0Ch] ;除数低字

mov cx,[bp+0Eh] ;除数高字

;以下程序段计算(di,si,dx,ax)/(cx,bx)=(dx,ax)

mov bp,cx

mov cx,20h ;设置循环次数

xor di,di ;Zero register

xor si,si ;Zero register

ul_div36: ;以下程序段(di,si,dx,ax)左移1位

shl ax,1 ;Shift w/zeros fill

rcl dx,1 ;Rotate thru carry

Page 415: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·411·

rcl si,1 ;Rotate thru carry

rcl di,1 ;Rotate thru carry

cmp di,bp

jb ul_div38 ;高字不够减的情况

ja ul_div37 ;高字够减的情况

cmp si,bx ;高字相等的情况,比较低字

jb ul_div38 ;低字不够减的情况

ul_div37: ;够减的情况

sub si,bx ;被除数− 除数

sbb di,bp

inc ax ;商+1

ul_div38: ;不够减的情况

loop ul_div36 ;Loop if cx > 0

pop di

pop si

pop bp

ret 8 ;恢复堆栈,(DX,AX)是函数的返回值

ul_DIV endp

_main proc near

mov ax,@data ;取数据段地址

mov ds,ax

push yh ;利用堆栈传递参数

push yl

push xh

push xl

call ul_DIV

mov zh,dx ;结果保存到 z

mov zl,ax

;以下程序段类似 printf("%lu",z)

push zh

push zl

mov ax,offset f1

push ax

call _printf

add sp,6

ret

_main endp

end _start

Page 416: IBM-PC 汇编语言程序设计试题解

·412· IBM-PC 汇编语言程序设计试题解

【1037】笼子里有鸡和兔共 50 只,只知道鸡和兔的腿共有 160 只,求鸡和兔各多少只?

算法思路:

这是数学上有名的“鸡兔同笼”问题。我们可以用变量 i表示鸡的只数,变量 j表示兔

的只数,则当鸡有 i 只,兔有 i 只时必须满足 i×2+j×4=160。用双重循环来求解。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib.lib)。

C 语言编写的算法研究程序:

#include <stdio.h>

void main(void)

{

unsigned char i,j;

for(i=1;i<=50;i++)

for(j=1;j<=50− i;j++)

if ((i*2+j*4==160) && (i+j==50))

{

printf("%d %d\n",i,j);

}

}

汇编语言程序如下:

.model small

.data

FORMAT DB '%d %d',10,0

I DB 0

J DB 0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

;下面程序段类似算法研究程序里的 for(i=1;i<=50;i++)

MOV I,1

JMP SHORT @254

@58:

Page 417: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·413·

;下面程序段类似算法研究程序里的 for(j=1;j<=50− i;j++)

MOV J,1

JMP SHORT @198

@86:

;下面程序段类似算法研究程序里的 if ((i*2+j*4==160) && (i+j==50))

MOV AL,I

MOV AH,0

SHL AX,1

MOV DL,J

MOV DH,0

MOV CL,2

SHL DX,CL

ADD AX,DX

CMP AX,160

JNE SHORT @170

MOV AL,I

MOV AH,0

MOV DL,J

MOV DH,0

ADD AX,DX

CMP AX,50

JNE SHORT @170

;下面程序段类似算法研究程序里的 printf("%d %d\n",i,j);

MOV AL,J

MOV AH,0

PUSH AX

MOV AL,I

MOV AH,0

PUSH AX

MOV AX,OFFSET FORMAT

PUSH AX

CALL NEAR PTR _printf

ADD SP,6

@170:

INC J

@198:

MOV AL,J

MOV AH,0

MOV DL,I

Page 418: IBM-PC 汇编语言程序设计试题解

·414· IBM-PC 汇编语言程序设计试题解

MOV DH,0

MOV BX,50

SUB BX,DX

CMP AX,BX

JLE SHORT @86

INC I

@254:

CMP I,50

JBE SHORT @58

RET

_main ENDP

END _start

【1038】请设计一个程序,让计算机找出 40 个自然数来,使得其中任意两个数之差均不

相等。

算法思路:

首先,开辟一个数组 a,准备存放这 40 个数,再开辟一个数组 cha,用来存放两个数的

差。寻找某一个满足条件的自然数的过程如下:

(1)把 1 和 2 放进数组 a中;

(2)把 1 放进数组 cha中;

(3)当寻找下一个自然数时,要把这个自然数与数组 a 中的每一个数相减,再判断所得

的差是否在数组 cha 中;

(4)如果所得的差不在数组 cha 中,说明又找到一个满足条件的自然数。把这个自然数

放进数组 a 中,同时把这个自然数与数组 a 中原有的每一个自然数的差记录在数组 cha 中。

如果所得的差与数组 cha 中的某一个数重复,说明这个自然数不符合条件,继续寻找下一个

自然数,重复步骤(3),直到找到 40 个自然数为止。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

#include <stdio.h>

#define N 40

void main(void)

{

unsigned int a[N+1]={0,1,2};

unsigned char cha[3000]={1,1},find=0;

unsigned int k,x=2,y=2;

for(k=2;k<3000;k++)

cha[k]=0;

while(x<N)

{

y++;find=0;

Page 419: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·415·

for(k=1;k<=x;k++)

{

if (cha[y − a[k]]==1)

{

find=1;break;

}

}

if (find==0)

{

x++;a[x] = y;

for(k=1;k<=x− 1;k++)

{

cha[y− a[k]] = 1;

}

}

}

for(k=1;k<=N;k+=4)

printf("%6d %6d %6d %6d\n",a[k],a[k+1],a[k+2],a[k+3]);

}

汇编语言程序如下:

END _start

N EQU 40

.model small

.data

FIND DB 0

FORMAT DB '%6d %6d %6d %6d',10,0

A DW 0,1,2,N DUP(0)

CHA DB 1,1,3000 DUP(0)

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

Page 420: IBM-PC 汇编语言程序设计试题解

·416· IBM-PC 汇编语言程序设计试题解

MOV CX,2 ;CX 是算法研究程序里的 x

MOV DI,2 ;DI 是算法研究程序里的 Y

;下面程序段类似算法研究程序里的 while(x<N)

JMP SHORT @450

@170:

INC DI ;y++

MOV FIND,0 ;find=0

;下面程序段类似算法研究程序里的 for(k=1;k<=x;k++)

MOV SI,1

JMP SHORT @282

@198:

;下面程序段类似算法研究程序里的 if (cha[y− a[k]]==1)

MOV BX,SI

SHL BX,1

MOV AX,DI

SUB AX,A[BX]

MOV BX,AX

CMP CHA[BX],1

JNE SHORT @254

MOV FIND,1 ;find=1

JMP SHORT @310 ;break

@254:

INC SI

@282:

CMP SI,CX

JBE SHORT @198

@310:

;下面程序段类似算法研究程序里的 if (find==0)

CMP FIND,0

JNE SHORT @450

INC CX ;x++

MOV BX,CX ;a[x]=y

SHL BX,1

MOV A[BX],DI

;下面程序段类似算法研究程序里的 for(k=1;k<=x− 1;k++)

MOV SI,1

JMP SHORT @422

@366:

;下面程序段类似算法研究程序里的 cha[y− a[k]]=1

Page 421: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·417·

MOV BX,SI

SHL BX,1

MOV AX,DI

SUB AX,A[BX]

MOV BX,AX

MOV CHA[BX],1

INC SI

@422:

MOV AX,CX

DEC AX

CMP AX,SI

JAE SHORT @366

@450:

CMP CX,40

JB SHORT @170

;下面程序段类似算法研究程序里的 for(k=1;k<=N;k+=4)

MOV SI,1

JMP SHORT @562

@506:

; 下 面 程 序 段 类 似 算 法 研 究 程 序 里 的

printf("%6d %6d %6d %6d\n",a[k],a[k+1],a[k+2],a[k+3])

MOV BX,SI

ADD BX,3

SHL BX,1

PUSH A[BX]

MOV BX,SI

ADD BX,2

SHL BX,1

PUSH A[BX]

MOV BX,SI

INC BX

SHL BX,1

PUSH A[BX]

MOV BX,SI

SHL BX,1

PUSH A[BX]

MOV AX,OFFSET FORMAT

PUSH AX

CALL NEAR PTR _printf

Page 422: IBM-PC 汇编语言程序设计试题解

·418· IBM-PC 汇编语言程序设计试题解

ADD SP,10

ADD SI,4

@562:

CMP SI,40

JBE SHORT @506

RET

_main ENDP

END _start

【1039】求 13 的 13 次方的最后三位数。

算法思路:

解本题最直接的方法是:将 13 累乘 13 次方截取最后三位即可。但是由于计算机所能表

示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,题目仅要求最

后三位的值,完全没有必要求 13 的 13 次方的完整结果。研究乘法的规律发现:乘积的最后

三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。利用这一规律,可

以大大简化程序。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

#include<stdio.h>

void main()

{

unsigned int i,x,y,last=1; /*变量 last 保存求 X 的 Y 次方过程中的

分乘积的后三位*/

printf("Input X and Y(X**Y):");

scanf("%d**%d",&x,&y);

for(i=1;i<=y;i++) /*X 自乘 Y 次*/

last=last*x%1000 ;/*将 last乘 X后对 1000取模,即求

积的后

三位*/

printf("The last 3 digits of %d**%d is:%d\n",x,y,last%1000);

}

汇编语言程序如下:

.model small

.data

f1 DB 'Input X and Y(X**Y):',0

f2 DB '%d**%d',0

f3 DB 'The last 3 digits of %d**%d is:%d',10,0

x DW 0

Page 423: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·419·

y DW 0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

EXTRN _scanf:NEAR ;使用库函数_scanf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

MOV SI,1 ;SI 是算法研究程序里的 last

;下面程序段类似算法研究程序里的 printf("Input X and Y(X**Y):")

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 scanf("%d**%d",&x,&y)

LEA AX,y

PUSH AX

LEA AX,x

PUSH AX

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _scanf

ADD SP,6

;下面程序段类似算法研究程序里的 for(i=1;i<=y;i++)

MOV CX,1 ;CX 是算法研究程序里的 i

JMP SHORT @114

@58:

;下面程序段类似算法研究程序里的 last=last*x%1000

MOV AX,SI

IMUL x

MOV BX,1000

XOR DX,DX

DIV BX

MOV SI,DX

Page 424: IBM-PC 汇编语言程序设计试题解

·420· IBM-PC 汇编语言程序设计试题解

INC CX

@114:

CMP CX,y

JBE SHORT @58

;下面程序段类似算法研究程序里的 printf("The last 3 ...

MOV AX,SI

MOV BX,1000

XOR DX,DX

DIV BX

PUSH DX

PUSH y

PUSH x

MOV AX,OFFSET f3

PUSH AX

CALL NEAR PTR _printf

ADD SP,8

RET

_main ENDP

END _start

【1040】一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一

个三位数,且这两个三位数的数码正好相反,求这个三位数。

算法思路:

根据题意可知,七进制和九进制表示的这个自然数的每一位一定小于 7,可设其七进制

数形式为“kji”(i,j,k 的取值分别为 1~6),然后设其九进制表示形式为“ijk”。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

#include<stdio.h>

void main()

{

int i,j,k;

for(i=1;i<7;i++)

for(j=0;j<7;j++)

for(k=1;k<7;k++)

if(i*9*9+j*9+k==i+j*7+k*7*7)

{

printf("The special number with 3 digits is:");

printf("%d%d%d(7)=%d%d%d(9)=%d(10)\n",k,j,i,i,j,k,

Page 425: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·421·

i*9*9+

j*9+k);

}

}

汇编语言程序如下:

.model small

.data

f1 DB 'The special number with 3 digits is:',0

f2 DB '%d%d%d(7)=%d%d%d(9)=%d(10)',10,0

k DW 0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

;下面程序段类似算法研究程序里的 for(i=1;i<7;i++)

MOV SI,1 ;SI 是算法研究程序里的 i

JMP @310

@58:

;下面程序段类似算法研究程序里的 for(j=0;j<7;j++)

XOR DI,DI ;DI 是算法研究程序里的 j

JMP SHORT @254

@86:

;下面程序段类似算法研究程序里的 for(k=1;k<7;k++)

MOV k,1

JMP SHORT @198

@114:

;下面程序段类似算法研究程序里的 if(i*9*9+j*9+k==i+j*7+k*7*7)

MOV AX,SI

MOV DX,81

IMUL DX

PUSH AX

MOV AX,DI

Page 426: IBM-PC 汇编语言程序设计试题解

·422· IBM-PC 汇编语言程序设计试题解

MOV DX,9

IMUL DX

POP DX

ADD DX,AX

ADD DX,k

MOV AX,DI

MOV BX,7

PUSH DX

IMUL BX

MOV DX,SI

ADD DX,AX

MOV AX,k

MOV BX,49

PUSH DX

IMUL BX

POP DX

ADD DX,AX

POP AX

CMP AX,DX

JNE SHORT @170

;下面程序段类似算法研究程序里的 printf("The special number with 3 digits

is:")

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 printf("%d%d%d(7)=%d%d%d(9)=%d(10)\

n",k,j,i,i,j,k,i*9*9+j*9+k)

MOV AX,SI

MOV DX,81

IMUL DX

PUSH AX

MOV AX,DI

MOV DX,9

IMUL DX

POP DX

ADD DX,AX

ADD DX,k

PUSH DX

Page 427: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·423·

PUSH k

PUSH DI

PUSH SI

PUSH SI

PUSH DI

PUSH k

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _printf

ADD SP,16

@170:

INC k

@198:

CMP k,7

JL SHORT @114

INC DI

@254:

CMP DI,7

JGE @1000

JMP @86

@1000:

INC SI

@310:

CMP SI,7

JGE @1001

JMP @58

@1001:

RET

_main ENDP

END _start

【1041】求具有 abcd=(ab+cd)2性质的 4 位数。3025 这个数具有一种独特的性质:将它

平分为二段,即 30 和 25,使之相加后求平方,即(30+25)2,恰好等于 3025 本身。请求出具

有这样性质的全部 4 位数。

算法思路:

具有这种性质的 4 位数没有分布规律,可以采用穷举法,对所有 4 位数进行判断,从而

筛选出符合这种性质的 4 位数。具体算法实现,可任取一个 4 位数,将其截为两部分,前两

位为 a,后两位为 b,然后套用公式计算并判断。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

Page 428: IBM-PC 汇编语言程序设计试题解

·424· IBM-PC 汇编语言程序设计试题解

C 语言编写的算法研究程序:

#include<stdio.h>

void main()

{

int n,a,b;

printf("There are following number with 4 digits satisfied condition\n");

for(n=1000;n<10000;n++) /*4 位数 N 的取值范围 1000~9999*/

{

a=n/100; /*截取 N 的前两位数存于 a*/

b=n%100; /*截取 N 的后两位存于 b*/

if((a+b)*(a+b)==n) /*判断 N是否为符合题目所规定的性质的

4 位数*/

printf("%d ",n);

}

}

汇编语言程序如下:

.model small

.data

f1 DB 'There are following number with 4 digits satisfied

condition',10,0

f2 DB '%d ',0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

;下面程序段类似算法研究程序里的 printf("There are following number with

4 digits satisfied condition\n")

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 for(n=1000;n<10000;n)

Page 429: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·425·

MOV SI,1000 ;SI 是算法研究程序里的 n

JMP SHORT @142

@58:

;下面程序段类似算法研究程序里的 a=n/100

MOV AX,SI

MOV BX,100

CWD

IDIV BX

MOV CX,AX ;CX 是算法研究程序里的 a

;下面程序段类似算法研究程序里的 b=n%100

MOV AX,SI

CWD

IDIV BX

MOV BX,DX ;BX 是算法研究程序里的 b

;下面程序段类似算法研究程序里的 if((a+b)*(a+b)==n)

MOV AX,CX

ADD AX,BX

MOV DX,CX

ADD DX,BX

IMUL DX

CMP AX,SI

JNE SHORT @114

;下面程序段类似算法研究程序里的 printf("%d ",n)

PUSH SI

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

@114:

INC SI

@142:

CMP SI,10000

JL SHORT @58

RET

_main ENDP

END _start

【1042】波瓦松酒的分酒趣题。法国著名数学家波瓦松在青年时代研究过一个有趣的数

Page 430: IBM-PC 汇编语言程序设计试题解

·426· IBM-PC 汇编语言程序设计试题解

学问题:某人有 12 品脱的啤酒一瓶,想从中倒出 6 品脱,但他没有 6品脱的容器,仅有一个

8 品脱和 5 品脱的容器,怎样倒才能将啤酒分为两个 6 品脱呢?

算法思路:

将 12 品脱酒 8 品脱和 5 品脱的空瓶平分,可以抽象为解不定方程:

8x-5y=6

其意义是从 12 品脱的瓶中向 8 品脱的瓶中倒 x 次,并且将 5品脱瓶中的酒向 12 品脱的

瓶中倒 y 次,最后在 12品脱的瓶中剩余 6 品脱的酒。

用 a,b,c 代表 12 品脱、8 品脱和 5 品脱的瓶子,求出不定方程的整数解,按照不定方程

的意义则倒酒的方法为:

a− >b− >c− >a

x y

倒酒的规则如下:

(1)按 a->b->c->a 的顺序;

(2)b 倒空后才能从 a 中取;

(3)c 装满后才能向 a 中倒。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

#include<stdio.h>

void getti(int a,int y,int z);

int i; /*最后需要分出的重量*/

void main()

{

int a,y,z;

printf("input Full a Empty b c Get i:");

/*a 满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量

*/

scanf("%d%d%d%d",&a,&y,&z,&i);

getti(a,y,z); /*按 a − > y − > z − > a 的操作步骤*/

getti(a,z,y); /*按 a − > z − > y − > a 的步骤*/

}

void getti(int a,int y,int z) /*a:满瓶的容量 y:第一个空瓶的容量 z:第二个

空瓶的容量*/

{

int b=0,c=0; /* b:第一瓶实际的重量 c:第二瓶实际的重量*/

printf(" a%d b%d c%d\n %4d %4d %4d\n",a,y,z,a,b,c);

while(a!=i||b!=i&&c!=i) /*当满瓶!=i 或另两瓶都!=i*/

{

if(!b)

{ a-=y; b=y;} /*如果第一瓶为空,则将满瓶倒入第一瓶中*/

Page 431: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·427·

else if(c==z)

{ a+=z; c=0;} /*如果第二瓶满,则将第二瓶倒入满瓶中*/

else if(b>z-c) /*如果第一瓶的重量>第二瓶的剩余空间*/

{ b-=(z-c);c=z;} /*则将装满第二瓶,第一瓶中保留剩余部分*/

else{ c+=b; b=0;} /*否则,将第一瓶全部倒入第二瓶中*/

printf(" %4d %4d %4d\n",a,b,c);

}

}

汇编语言程序如下:

.model small

.data

f1 DB 'input Full a Empty b c Get i:',0

f2 DB '%d%d%d%d',0

f3 DB ' a%d b%d c%d',10,' %4d %4d %4d',10,0

f4 DB ' %4d %4d %4d',10,0

i DW 0

z DW 0

y DW 0

a DW 0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

EXTRN _scanf:NEAR ;使用库函数_scanf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

;下面程序段类似算法研究程序里的 printf("input Full a Empty b c Get i:")

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 scanf("%d%d%d%d",&a,&y,&z,&i)

MOV AX,OFFSET i

PUSH AX

Page 432: IBM-PC 汇编语言程序设计试题解

·428· IBM-PC 汇编语言程序设计试题解

LEA AX,z

PUSH AX

LEA AX,y

PUSH AX

LEA AX,a

PUSH AX

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _scanf

ADD SP,10

;下面程序段类似算法研究程序里的 getti(a,y,z)

PUSH z

PUSH y

PUSH a

CALL NEAR PTR _getti

ADD SP,6

;下面程序段类似算法研究程序里的 getti(a,z,y)

PUSH y

PUSH z

PUSH a

CALL NEAR PTR _getti

ADD SP,6

RET

_main ENDP

_getti PROC NEAR

PUSH BP

MOV BP,SP

PUSH SI

PUSH DI

XOR SI,SI ;SI 是算法研究程序里的 b,b=0

XOR DI,DI ;DI 是算法研究程序里的 c,c=0

; 下 面 程 序 段 类 似 算 法 研 究 程 序 里 的 printf(" a%d b%d

c%d\n %4d %4d %4d\n",a,y,z,a,b,c)

PUSH DI

PUSH SI

PUSH WORD PTR [BP+4]

PUSH WORD PTR [BP+8]

PUSH WORD PTR [BP+6]

PUSH WORD PTR [BP+4]

Page 433: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·429·

MOV AX,OFFSET f3

PUSH AX

CALL NEAR PTR _printf

ADD SP,14

;下面程序段类似算法研究程序里的 while(a!=i||b!=i&&c!=i)

JMP SHORT @282

@58:

;下面程序段类似算法研究程序里的 if(!b)

OR SI,SI

JNE SHORT @114

MOV AX,[BP+6] ;a− =y

SUB [BP+4],AX

MOV SI,[BP+6] ;b=y

JMP SHORT @254

@114:

;下面程序段类似算法研究程序里的 else if(c==z)

CMP DI,[BP+8]

JNE SHORT @170

;下面程序段类似算法研究程序里的{ a+=z; c=0;}

MOV AX,[BP+8]

ADD [BP+4],AX

XOR DI,DI

JMP SHORT @254

@170:

;下面程序段类似算法研究程序里的 else if(b>z− c)

MOV AX,[BP+8]

SUB AX,DI

CMP AX,SI

JGE SHORT @226

;下面程序段类似算法研究程序里的{ b− =(z− c);c=z;}

MOV AX,[BP+8]

SUB AX,DI

SUB SI,AX

MOV DI,[BP+8]

JMP SHORT @254

@226:

;下面程序段类似算法研究程序里的 else{ c+=b; b=0;}

ADD DI,SI

XOR SI,SI

Page 434: IBM-PC 汇编语言程序设计试题解

·430· IBM-PC 汇编语言程序设计试题解

@254:

;下面程序段类似算法研究程序里的 printf(" %4d %4d %4d\n",a,b,c)

PUSH DI

PUSH SI

PUSH WORD PTR [BP+4]

MOV AX,OFFSET f4

PUSH AX

CALL NEAR PTR _printf

ADD SP,8

@282:

MOV AX,[BP+4]

CMP AX,i

JNE SHORT @58

CMP SI,i

JE SHORT @366

CMP DI,i

JNE SHORT @58

@366:

POP DI

POP SI

POP BP

RET

_getti ENDP

END _start

【1043】将大于 0 小于 1000 的阿拉伯数字转换为罗马数字。

算法思路:

下表中给出了阿拉伯数字与罗马数字的对应关系,题中的数字转换实际上就是查表翻

译。即将整数的百、十、个位依次从整数中分解出来,查找表中相应的行后输出对应的字符。

1 2 3 4 5 6 7 8 9

I II III IV V VI VII VIII IX

10 20 30 40 50 60 70 80 90

X XX XXX XL L LX LXX LXXX XCC

100 200 300 400 500 600 700 800 900

C CC CCC CD D DC DCC DCCC CM

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

#include<stdio.h>

void main()

Page 435: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·431·

{static char

*a[][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",

"","X","XX","XXX","XL","L","LX","LXX","LXXX","XCC",

"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"

}; /*建立对照表*/

int n,t,i,m;

printf("Please enter number:");

scanf("%d",&n); /*输入整数*/

printf("%d=",n);

for(m=0,i=1000;m<3;m++,i/=10)

{

t=(n%i)/(i/10); /*从高位向低位依次取各位的

数字*/

printf("%s",a[2-m][t]); /*通过对照表翻译输出

*/

}

printf("\n");

}

汇编语言程序如下:

.model small

.data

f1 DB 'Please enter number:',0

f2 DB '%d',0

f3 DB '%d=',0

f4 DB '%s',0

f5 DB 10,0

n DW 0

t DW 0

a0 DB 0

a1 DB 'I',0

a2 DB 'II',0

a3 DB 'III',0

a4 DB 'IV',0

a5 DB 'V',0

a6 DB 'VI',0

a7 DB 'VII',0

a8 DB 'VIII',0

a9 DB 'IX',0

b0 DB 0

Page 436: IBM-PC 汇编语言程序设计试题解

·432· IBM-PC 汇编语言程序设计试题解

b1 DB 'X',0

b2 DB 'XX',0

b3 DB 'XXX',0

b4 DB 'XL',0

b5 DB 'L',0

b6 DB 'LX',0

b7 DB 'LXX',0

b8 DB 'LXXX',0

b9 DB 'XCC',0

c0 DB 0

c1 DB 'C',0

c2 DB 'CC',0

c3 DB 'CCC',0

c4 DB 'CD',0

c5 DB 'D',0

c6 DB 'DC',0

c7 DB 'DCC',0

c8 DB 'DCCC',0

c9 DB 'CM',0

a DW a0,a1,a2,a3,a4,a5,a6,a7,a8,a9

DW b0,b1,b2,b3,b4,b5,b6,b7,b8,b9

DW c0,c1,c2,c3,c4,c5,c6,c7,c8,c9

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

EXTRN _scanf:NEAR ;使用库函数_scanf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

;下面程序段类似算法研究程序里的 printf("Please enter number:")

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

Page 437: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·433·

;下面程序段类似算法研究程序里的 scanf("%d",&n)

LEA AX,n

PUSH AX

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _scanf

POP CX

POP CX

;下面程序段类似算法研究程序里的 printf("%d=",n)

PUSH n

MOV AX,OFFSET f3

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

;下面程序段类似算法研究程序里的 for(m=0,i=1000;m<3;m++,i/=10)

XOR DI,DI ;DI 是算法研究程序里的 m

MOV SI,1000 ;SI 是算法研究程序里的 i

JMP SHORT @114

@58:

;下面程序段类似算法研究程序里的 t=(n%i)/(i/10)

MOV AX,n

CWD

IDIV SI

PUSH DX

MOV AX,SI

MOV BX,10

CWD

IDIV BX

MOV BX,AX

POP AX

CWD

IDIV BX

MOV t,AX

;下面程序段类似算法研究程序里的 printf("%s",a[2− m][t])

MOV AX,2

SUB AX,DI

MOV DX,20

IMUL DX

Page 438: IBM-PC 汇编语言程序设计试题解

·434· IBM-PC 汇编语言程序设计试题解

MOV DX,t

SHL DX,1

ADD AX,DX

MOV BX,AX

PUSH a[BX]

LEA AX,f4

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

INC DI

MOV BX,10

MOV AX,SI

CWD

IDIV BX

MOV SI,AX

@114:

CMP DI,3

JL SHORT @58

;下面程序段类似算法研究程序里的 printf("\n")

MOV AX,OFFSET f5

PUSH AX

CALL NEAR PTR _printf

POP CX

RET

_main ENDP

END _start_

【1044】计算分数的精确值。使用数组精确计算 M/N(0<M<N<=100)的值。如果 M/N

是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数位的

序号)。

算法思路:

由于计算机字长的限制,常规的浮点运算都有精度限制,为了得到高精度的计算结果,

就必须自行设计实现方法。

为了实现高精度的计算,可将商存放在一维数组中,数组的每个元素存放一位十进制数,

即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中....,依次类推。这样

就可以使用数组表示一个高精度的计算结果。

进行除法运算时可以模拟人的手工操作,即每次求出商的第一位后,将余数乘以 10,再

计算商的下一位,重复以上过程,当某次计算后的余数为 0 时,表示 M/N 为有限不循环小数,

Page 439: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·435·

当某次计算后的余数与前面的某个余数相同时,则 M/N 为无限循环小数,从该余数第一次出

现之后所求得的各位数就是小数的循环节。

程序具体实现时,采用了数组和其他一些技巧来保存除法运算所得到的余数和商的各位数。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

#include<stdio.h>

int remainder[101],quotient[101]; /*remainder: 存 放 除 法 的 余 数 ;

quotient:依次存

放商的每一位*/

void main()

{int m,n,i,j;

printf("Please input a fraction(m/n)(<0<m<n<=100):");

scanf("%d/%d",&m,&n); /*输入被除数和除数*/

printf("%d/%d it's accuracy value is:0.",m,n);

for(i=1;i<=100;i++) /*i: 商的位数*/

{

remainder[m]=i; /*m:除的余数 remainder[m]:该余数对应的商的位

数*/

m*=10; /*余数扩大 10 位*/

quotient[i]=m/n; /*商*/

m=m%n; /*求余数*/

if(m==0) /*余数为 0 则表示是有限小数*/

{

for(j=1;j<=1;j++) printf("%d",quotient[j]); /*输出商*/

break; /*退出循环*/

}

if(remainder[m]!=0) /*若该余数对应的位在前面已经出现过*/

{

for(j=1;j<=i;j++) printf("%d",quotient[j]); /*则输出循

环小数*/

printf("\n\tand it is a infinite cyclic fraction

from %d\n",remainder[m]);

printf("\tdigit to %d digit after decimal point.\n",i); /*输出

循环节的位置*/

break; /*退出*/

}

}

}

汇编语言程序如下:

Page 440: IBM-PC 汇编语言程序设计试题解

·436· IBM-PC 汇编语言程序设计试题解

.model small

.data

f1 DB 'Please input a fraction(m/n)(0<m<n<=100):',0

f2 DB '%d/%d',0

f3 DB '%d/%d it',39,'s accuracy value is:0.',0

f4 DB '%d',0

f5 DB 10,9,'and it is a infinite cyclic fraction

from %d',10,0

f6 DB 9,'digit to %d digit after decimal point.',10,0

quotient DW 101 DUP(0)

remainder DW 101 DUP(0)

m DW 0

n DW 0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

EXTRN _scanf:NEAR ;使用库函数_scanf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

; 下 面 程 序 段 类 似 算 法 研 究 程 序 里 的 printf("Please input a

fraction(m/n)(<0<m<n<=100):")

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 scanf("%d/%d",&m,&n)

LEA AX,n

PUSH AX

LEA AX,m

PUSH AX

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _scanf

Page 441: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·437·

ADD SP,6

;下面程序段类似算法研究程序里的 printf("%d/%d it's accuracy value

is:0.",m,n)

PUSH n

PUSH m

LEA AX,f3

PUSH AX

CALL NEAR PTR _printf

ADD SP,6

;下面程序段类似算法研究程序里的 for(i=1;i<=100;i++)

MOV DI,1 ;DI 是算法研究程序里的 i

JMP @422

@58:

;下面程序段类似算法研究程序里的 remainder[m]=i

MOV BX,m

SHL BX,1

MOV remainder[BX],DI

;下面程序段类似算法研究程序里的 m*=10

MOV DX,10

MOV AX,m

IMUL DX

MOV m,AX

;下面程序段类似算法研究程序里的 quotient[i]=m/n

MOV AX,m

CWD

IDIV n

MOV BX,DI

SHL BX,1

MOV quotient[BX],AX

;下面程序段类似算法研究程序里的 m=m%n

MOV AX,m

CWD

IDIV n

MOV m,DX

;下面程序段类似算法研究程序里的 if(m==0)

CMP m,0

JNE SHORT @226

; 下 面 程 序 段 类 似 算 法 研 究 程 序 里 的 for(j=1;j<=1;j++)

printf("%d",quotient[j])

Page 442: IBM-PC 汇编语言程序设计试题解

·438· IBM-PC 汇编语言程序设计试题解

MOV SI,1 ;SI 是算法研究程序里的 j

JMP SHORT @170

@114:

MOV BX,SI

SHL BX,1

PUSH quotient[BX]

MOV AX,OFFSET f4

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

INC SI

@170:

CMP SI,1

JLE SHORT @114

JMP SHORT @450 ;break

@226:

;下面程序段类似算法研究程序里的 if(remainder[m]!=0)

MOV BX,m

SHL BX,1

CMP remainder[BX],0

JE SHORT @394

; 下 面 程 序 段 类 似 算 法 研 究 程 序 里 的 for(j=1;j<=i;j++)

printf("%d",quotient[j])

MOV SI,1

JMP SHORT @338

@282:

MOV BX,SI

SHL BX,1

PUSH quotient[BX]

MOV AX,OFFSET f4

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

INC SI

@338:

CMP SI,DI

JLE SHORT @282

Page 443: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·439·

;下面程序段类似算法研究程序里的 printf("\n\tand it is a ...

MOV BX,m

SHL BX,1

PUSH remainder[BX]

MOV AX,OFFSET f5

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

;下面程序段类似算法研究程序里的 printf("\tdigit to %d digit ...

PUSH DI

MOV AX,OFFSET f6

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

JMP SHORT @450 ;break

@394:

INC DI

@422:

CMP DI,100

JG @450

JMP @58

@450:

RET

_main ENDP

END _start

【1045】求 3000 以内的全部亲密数。如果整数 A 的全部因子(包括 1,不包括 A 本身)

之和等于 B;且整数 B 的全部因子(包括 1,不包括 B 本身)之和等于 A,则将整数 A和 B 称

为亲密数。

算法思路:

按照亲密数定义,要判断数 a 是否有亲密数,只要计算出 a 的全部因子的累加和为 b,

再计算 b 的全部因子的累加和为 n,若 n 等于 a则可判定 a和 b 是亲密数。

计算数 a 的各因子的算法:

用 a 依次对 i(i=1~a/2)进行模运算,若模运算结果等于 0,则 i 为 a的一个因子;

否则 i 就不是 a 的因子。

为了减少篇幅,屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

Page 444: IBM-PC 汇编语言程序设计试题解

·440· IBM-PC 汇编语言程序设计试题解

#include<stdio.h>

void main()

{int a,i,b,n;

printf("There are following friendly--numbers pair smaller than

3000:\n");

for(a=1;a<3000;a++) /*穷举 1000以内的全部整数*/

{

for(b=0,i=1;i<=a/2;i++) /*计算数 a 的各因子,各因子之和存放

于 b*/

if(!(a%i))b+=i; /*计算b的各因子,各因子之和存于n*/

for(n=0,i=1;i<=b/2;i++)

if(!(b%i))n+=i;

if(n==a&&a<b)

printf("%4D..%4d ",a,b); /*若 n=a,则 a和 b是一对亲密数,输

出*/

}

}

汇编语言程序如下:

.model small

.data

f1 DB ' There are following friendly--numbers pair smaller than

3000:',10,0

f2 DB '%4D..%4d ',0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

;下面程序段类似算法研究程序里的 printf("There are following...

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

Page 445: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·441·

;下面程序段类似算法研究程序里的 for(a=1;a<3000;a++)

MOV SI,1 ;SI 是算法研究程序里的 a

JMP SHORT @450

@58:

;下面程序段类似算法研究程序里的 for(b=0,i=1;i<=a/2;i++)

XOR CX,CX ;CX 是算法研究程序里的 b

MOV BX,1 ;BX 是算法研究程序里的 i

JMP SHORT @170

@86:

;下面程序段类似算法研究程序里的 if(!(a%i))b+=i

MOV AX,SI

CWD

IDIV BX

OR DX,DX

JNE SHORT @142

ADD CX,BX

@142:

INC BX

@170:

MOV AX,SI

CWD

SUB AX,DX

SAR AX,1

CMP AX,BX

JGE SHORT @86

;下面程序段类似算法研究程序里的 for(n=0,i=1;i<=b/2;i++)

XOR DI,DI ;DI 是算法研究程序里的 n

MOV BX,1

JMP SHORT @310

@226:

;下面程序段类似算法研究程序里的 if(!(b%i))n+=i

MOV AX,CX

CWD

IDIV BX

OR DX,DX

JNE SHORT @282

ADD DI,BX

@282:

INC BX

Page 446: IBM-PC 汇编语言程序设计试题解

·442· IBM-PC 汇编语言程序设计试题解

@310:

MOV AX,CX

CWD

SUB AX,DX

SAR AX,1

CMP AX,BX

JGE SHORT @226

;下面程序段类似算法研究程序里的 if(n==a&&a<b)

CMP DI,SI

JNE SHORT @422

CMP SI,CX

JGE SHORT @422

;下面程序段类似算法研究程序里的 printf("%4D..%4d ",a,b)

PUSH CX

PUSH SI

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _printf

ADD SP,6

@422:

INC SI

@450:

CMP SI,3000

JL SHORT @58

RET

_main ENDP

END _start

【1046】现有 21 根火柴,两人轮流取,每人每次可以取走 1~4 根,不可多取,也不能

不取,谁取最后一根火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;

计算机一方为“常胜将军”。

算法思路:

在计算机后走的情况下,要想使计算机成为“常胜将军”,必须找出取法的关键。根据

本题的要求加以总结出,后走一方取子的数量与对方刚才一步取子的数量之和等于 5,就可

以保证最后一个子是留给先取子的那个人的。

据此分析进行算法设计就是很简单的工作,编程实现也十分容易。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

#include<stdio.h>

Page 447: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·443·

void main()

{int a=21,i;

printf("Game begin:\n");

while(a>0){

do{

printf("How many stick do you wish to take(1~%d)?",a>4?4:a);

scanf("%d",&i);

}while(i>4||i<1||i>a); /*接收正在确的输入

*/

if(a-i>0) printf(" %d stick left in the pile.\n",a-i);

if((a-i)<=0){

printf(" You have taken the last stick.\n");

printf(" * * * You lose! \nGame Over.\n"); /*输出取胜标记*/

break;

}

else

printf(" Compute take %d stick.\n",5-i); /*输出计算机取的

子数*/

a-=5;

printf(" %d stick left in the pile.\n",a);

}

}

汇编语言程序如下:

.model small

.data

f1 DB 'Game begin:',10,0

f2 DB 'How many stick do you wish to take(1~%d)?',0

f3 DB '%d',0

f4 DB ' %d stick left in the pile.',10,0

f5 DB ' You have taken the last stick.',10,0

f6 DB ' * * * You lose! ',10,'Game Over.',10,0

f7 DB ' Compute take %d stick.',10,0

f8 DB ' %d stick left in the pile.',10,0

i DW 0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

EXTRN _scanf:NEAR ;使用库函数_scanf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

Page 448: IBM-PC 汇编语言程序设计试题解

·444· IBM-PC 汇编语言程序设计试题解

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

MOV SI,21 ;SI 是算法研究程序里的 a

;下面程序段类似算法研究程序里的 printf("Game begin:\n")

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 while(a>0){do{

JMP @422

@58:

;下面程序段类似算法研究程序里的 printf("How many stick do you...

CMP SI,4

JLE SHORT @114

MOV AX,4

JMP SHORT @142

@114:

MOV AX,SI

@142:

PUSH AX

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

;下面程序段类似算法研究程序里的 scanf("%d",&i)

LEA AX,i

PUSH AX

MOV AX,OFFSET f3

PUSH AX

CALL NEAR PTR _scanf

POP CX

POP CX

;下面程序段类似算法研究程序里的 while(i>4||i<1||i>a)

CMP i,4

Page 449: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·445·

JG SHORT @58

CMP i,1

JL SHORT @58

CMP i,SI

JG SHORT @58

;下面程序段类似算法研究程序里的 if(a− i>0) printf(" %d stick left in the

pile.\n",a− i)

MOV AX,SI

SUB AX,i

JLE SHORT @310

MOV AX,SI

SUB AX,i

PUSH AX

MOV AX,OFFSET f4

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

@310:

;下面程序段类似算法研究程序里的 if((a− i)<=0)

MOV AX,SI

SUB AX,i

JG SHORT @366

;下面程序段类似算法研究程序里的 printf(" You have taken the last

stick.\n")

MOV AX,OFFSET f7

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 printf(" * * * You lose! \nGame Over.\n")

MOV AX,OFFSET f6

PUSH AX

CALL NEAR PTR _printf

POP CX

JMP SHORT @450 ;break

@366:

;下面程序段类似算法研究程序里的 else printf(" Compute take %d stick.\n",5

− i)

MOV AX,5

Page 450: IBM-PC 汇编语言程序设计试题解

·446· IBM-PC 汇编语言程序设计试题解

SUB AX,i

PUSH AX

MOV AX,OFFSET f7

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

SUB SI,5 ;a− =5

;下面程序段类似算法研究程序里的 printf(" %d stick left in the pile.\n",a)

PUSH SI

MOV AX,OFFSET f8

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

@422:

OR SI,SI

JLE @450

JMP @58

@450:

RET

_main ENDP

END _start

【1047】输入 m 和 n(20≥m≥n>0)求出满足以下方程的正整数数列 i1,i2,...,in,使

得:i1+i1+...+in=m,且 i1≥i2...≥in。例如,当 n=4,m=8 时,将得到如下 5 个数列:

5 1 1 1;4 2 1 1;3 3 1 1;3 2 2 1;2 2 2 2

算法思路:

可将原题抽象为:将 m分解为 n 个整数,且 n个整数的和为 m,i1≥i2≥... ≥in。分解

整数的方法很多,由于题目中有"i1≥i2≥..... ≥in",提示我们可先确定最右边 in元素的值

为 1,然后按照条件使前一个元素的值一定大于等于当前元素的值,不断地向前推就可以解

决问题。下面的程序允许用户选定 m 和 n,输出满足条件的所有数列。

为了减少篇幅,键盘输入、屏幕输出功能直接调用了本书提供的函数库(mylib. lib)。

C 语言编写的算法研究程序:

#include<stdio.h>

#define NUM 10 /*允许分解的最大元素数量*/

int i[NUM]; /*记录分解出的数值的数组*/

void main()

{int sum,n,total,k,flag,count=0;

Page 451: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·447·

printf("Please enter requried terms(<=10):");

scanf("%d",&n);

printf(" their sum:");

scanf("%d",&total);

sum=0; /*当前从后向前 k 个元素的和*/

k=n; /*从后向前正在处理的元素下标*/

i[n]=1; /*将最后一个元素的值置为 1 作为初始值*/

printf("There are following possible series:\n");

while(1)

{

if(sum+i[k]<total) /*若后 k 位的和小于指定的 total*/

if(k<=1) /*若正要处理的是第一个元素*/

{ i[1]=total-sum;flag=1;} /*则计算第一个元素的并置标记

*/

else{

sum+=i[k--];

i[k]=i[k+1]; /*置第 k 位的值后 k-1*/

continue; /*继续向前处理其他元素*/

}

else if(sum+i[k]>total||k!=1) /*若和已超过 total 或不是第一个元

素*/

{ sum-=i[++k]; flag=0;} /*k 向后回退一个元素*/

else flag=1; /*sum+i[k]=total&&k=1 则设置 flag标记*/

if(flag)

{

printf("[%d]:",++count);

for(flag=1;flag<=n;++flag)

printf("%d ",i[flag]);

printf("\n");

}

if(++k>n) /*k 向后回退一个元素后判断是否已退出最后一个元素

*/

break;

sum-=i[k];

i[k]++; /*试验下一个分解*/

}

}

汇编语言程序如下:

.model small

Page 452: IBM-PC 汇编语言程序设计试题解

·448· IBM-PC 汇编语言程序设计试题解

.data

f1 DB 'Please enter requried terms(<=10):',0

f2 DB '%d',0

f3 DB ' their sum:',0

f4 DB 'There are following possible series:',10,0

f5 DB '[%2d]:',0

f6 DB 10,0

f7 DB '%d ',0

i DW 20 DUP (?)

flag DW 0

count DW 0

total DW 0

n DW 0

.code ;定义代码段

EXTRN _printf:NEAR ;使用库函数_printf

EXTRN _scanf:NEAR ;使用库函数_scanf

PUBLIC _main

EXTRN startx:NEAR ;库函数初始化程序入口

_start PROC NEAR

JMP startx ;首先初始化库函数

_start ENDP

_main PROC NEAR

MOV AX,@data ;取数据段地址

MOV DS,AX

; 下 面 程 序 段 类 似 算 法 研 究 程 序 里 的 printf("Please enter requried

terms(<=10):")

MOV AX,OFFSET f1

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 scanf("%d",&n)

LEA AX,n

PUSH AX

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _scanf

POP CX

POP CX

Page 453: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·449·

;下面程序段类似算法研究程序里的 printf(" their sum:")

MOV AX,OFFSET f3

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 scanf("%d",&total)

LEA AX,total

PUSH AX

MOV AX,OFFSET f2

PUSH AX

CALL NEAR PTR _scanf

POP CX

POP CX

XOR DI,DI ;DI 是算法研究程序里的 sum,sum=0

MOV SI,n ;SI 是算法研究程序里的 k,k=n

;下面程序段类似算法研究程序里的 i[n]=1

MOV BX,n

SHL BX,1

MOV i[BX],1

;下面程序段类似算法研究程序里的 printf("There are following possible

series:\n")

MOV AX,OFFSET f4

PUSH AX

CALL NEAR PTR _printf

POP CX

;下面程序段类似算法研究程序里的 while(1)

@58:

;下面程序段类似算法研究程序里的 if(sum+i[k]<total)

MOV BX,SI

SHL BX,1

MOV AX,DI

ADD AX,i[BX]

CMP AX,total

JGE SHORT @170

;下面程序段类似算法研究程序里的 if(k<=1)

CMP SI,1

JG SHORT @142

;下面程序段类似算法研究程序里的{i[1]=total− sum;flag=1;}

MOV AX,total

Page 454: IBM-PC 汇编语言程序设计试题解

·450· IBM-PC 汇编语言程序设计试题解

SUB AX,DI

MOV i+2,AX

JMP SHORT @254

@142:

;下面程序段类似算法研究程序里的 else{sum+=i[k− − ]}

MOV BX,SI

SHL BX,1

ADD DI,i[BX]

DEC SI

;下面程序段类似算法研究程序里的 i[k]=i[k+1]

MOV BX,SI

SHL BX,1

MOV AX,i[BX+2]

MOV BX,SI

SHL BX,1

MOV i[BX],AX

JMP SHORT @58 ;continue

@170:

;下面程序段类似算法研究程序里的 else if(sum+i[k]>total||k!=1)

MOV BX,SI

SHL BX,1

MOV AX,DI

ADD AX,i[BX]

CMP AX,total

JG SHORT @226

CMP SI,1

JE SHORT @254

@226:

;下面程序段类似算法研究程序里的{ sum− =i[++k]; flag=0;}

INC SI

MOV BX,SI

SHL BX,1

SUB DI,i[BX]

MOV flag,0

JMP SHORT @282

@254:

;下面程序段类似算法研究程序里的 else flag=1

MOV flag,1

@282:

Page 455: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·451·

;下面程序段类似算法研究程序里的 if(flag)

CMP flag,0

JE SHORT @450

;下面程序段类似算法研究程序里的 printf("[%d]:",++count)

INC count

MOV AX,count

PUSH AX

MOV AX,OFFSET f5

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

;下面程序段类似算法研究程序里的 for(flag=1;flag<=n;++flag)

MOV flag,1

JMP SHORT @394

@338:

;下面程序段类似算法研究程序里的 printf("%d ",i[flag])

MOV BX,flag

SHL BX,1

PUSH i[BX]

MOV AX,OFFSET f7

PUSH AX

CALL NEAR PTR _printf

POP CX

POP CX

INC flag

@394:

MOV AX,flag

CMP AX,n

JLE SHORT @338

;下面程序段类似算法研究程序里的 printf("\n")

MOV AX,OFFSET f6

PUSH AX

CALL NEAR PTR _printf

POP CX

@450:

;下面程序段类似算法研究程序里的 if(++k>n)

INC SI

MOV AX,SI

Page 456: IBM-PC 汇编语言程序设计试题解

·452· IBM-PC 汇编语言程序设计试题解

CMP AX,n

JG SHORT @506 ;break;

;下面程序段类似算法研究程序里的 sum− =i[k]

MOV BX,SI

SHL BX,1

SUB DI,i[BX]

;下面程序段类似算法研究程序里的 i[k]++

MOV BX,SI

SHL BX,1

INC i[BX]

JMP @58

@506:

RET

_main ENDP

END _start

Page 457: IBM-PC 汇编语言程序设计试题解

第 6 章 编 程 题 ·453·

参 考 文 献

1.沈美明,温冬婵.IBM-PC汇编语言程序设计.北京:清华大学出版社,1991

2.冯博琴,刘跃虎等.新编计算机等级考试练习题及模拟考试题(1 级、2 级、3 级).西安:西安交

通大学出版社,1998

3.温冬婵,沈美明.IBM-PC汇编语言程序设计例题习题集.北京:清华大学出版社,1991

4.丁玄功.汇编语言程序设计.北京:中国审计出版社,2001

5.全国计算机等级考试命题研究组.三级 A类应试题典,珠海:珠海出版社,2000

6.朱慧真.汇编语言教程.北京:国防工业出版社,1988

7.林正皓.使用汇编语言入门与编程技巧.北京:海洋出版社,1994

8.匡松,林万昌等.全国计算机等级考试(三级 A类)模拟试题与解答.西安:西安电子科技大学出

版社,1998

9.张钟恩.IBM-PC/XT、长城 0520微型机实用程序设计.北京:中国计量出版社,1987

10.熊桂喜.IBM-PC汇编语言程序设计.北京:科学出版社,1998

11.[美]James W.McCord著、张素琴等译.Borland C++程序员参考手册,北京:清华大学出版社,1995

12.教育部考试中心.上机考试习题集(三级)汇编语言程序设计,南开大学出版社,2002

13.阚江明,胡又农.国际奥林匹克大赛试题解析——信息学,奥林匹克出版社,2001