1.试编一程序,把地址偏移量从100H单元开始的256个单元分别写入00H,01H,02H,03H,…,FFH数据。
解
源程序如下:
2.统计上题写入的数据块中0元素、正元素、负元素的个数,并分别把统计结果送入上述数据块之后的3个单元中。
解
3.用DOS功能调用显示上面两题中数据块各单元(包括统计结果)的内容。为了显示清晰明了,要求每行显示16个数据,两个数据之间用空格分开。
解
把上述两题结合起来加上本题要求,综合编程如下:
4.把地址偏移量从STRGl单元开始的128个单元的内容传送到地址偏移量从STRG2开始的单元中。
解
5.寄存器SI作地址指针,自SI所指的内存单元开始连续存放3个无符号数(以字为单位),编一程序求它们的和,并将结果存放在这3个数之后的单元中。
解
6.读下面的程序段,问在什么情况下本段程序的执行结果是AH=0?
解
当标志寄存器的ZF=0时,执行结果AH=0。
解
8.数据定义语句如下:
自FIRST单元开始存放的是一个4字节的十六进制数(低位字节在前),要求:
①编一段程序将这个数左移两位后存放到自SECOND开始的单元中(注意保留移出部分);
②编一段程序将这个数右移两位后存放到自THIRD开始的单元中(注意保留移出部分);
③编一段程序将这个数求补后存放到自FORTH开始的单元中。
解
9.在指令语句“AND AX,OPD1 AND OPD2”中,OPD1和OPD2是两个已赋值的变量,问两个AND操作分别在什么时间进行?有什么区别?
解
前面的AND是指令,在程序运行时执行;后面的AND是运算符,在汇编的时候由汇编程序计算,表达式计算结果出现在执行程序中。两者的区别在于,前者是指令,程序运行时执行,后者是运算符,汇编时计算。
10.如下指令或程序是否有错?若有错,请指出错在哪里。
解
①“MOV K1,AX”错。因为K1为立即数,它不能作为目的操作数。
②这两条指令都是错的。第一条立即数不能直接送给段寄存器;第二条两个操作数不能同时为内存操作数。
③“MOV IMP,AX”错。两操作数类型不匹配,IMP是一字节内存单元,而AX寄存器中为16位数据。
④“CMP A1,A2”错。两个操作数A1与A2不能同时为内存操作数。
⑤“MOV[BX],1000”错。两操作数类型不匹配,[BX]只定义了一字节单元,而1000是16位数据。
11.8086汇编语言程序中段的类型有几种,各段如何定义?在段定义语句中,定位类型、组合类型、类别各起什么作用,各有什么含义?
解
在8086汇编语言中,段的类型有3种,即代码段、堆栈段、数据段(附加数据段可归属于数据段)。各段可用段定义语句(SEGMENT与ENDS)和段名赋给段寄存器语句(ASSUME)来定义。在段定义语句中,定位类型表示此段的起始边界要求,可允许4种段的起始边界,即PAGE、PARA、WORD和BYTE。它们分别表示段的起始值以页、节、字、字节为边界,若此项省略,则默认值为PARA。组合类型用来告诉连接程序本段与其他段的关系,分别为NONE、PUBLIC、COMMON、AT表达式、STACK和MEMORY。每一种组合类型的含义请参看有关书籍。
类别是连接程序(LINK)需要的。它可以是任何合法的名称,必须用单引号括起来,连接程序只使同类别的段发生关联,典型类别如′CODE′、′STACK′。
12.使用DOS功能调用0AH,从键盘输入40个字符的字符串并将其送入一输入缓冲区。在按下Enter键后,显示这些字符。
解
说明
本题把数据区放在代码段中,没有单独定义数据段,并且用“ORG 100H”语句把程序起始地址的偏移量放在从100H开始的单元,用JMP BEGIN指令跳过数据区,这样可以把经汇编、连接后的执行程序(·EXE)用EXE2BIN软件生成.COM文件。
13.某软件共可接收10个键盘命令(分别为A,B,C,…,J),完成这10个命令的程序分别为过程P0,P1,…,P9。编一程序从键盘接收命令,并转到相应的过程去执行。要求用两种方法:
①用比较、转移指令实现;
②用跳转表实现。
解
①用比较、转移指令实现:
②用跳转表实现:
讨论
实现该题的功能用两种方法都可以,显然,用跳转表实现要简单快捷得多。所以遇到多分支程序结构时采用跳转表比用条件转移指令更方便。
14.内存自BUFF开始的单元缓冲区连续放着512个学生的英文分数,编程序统计其中90~100分、60~89分、60分以下者各有多少人,并把结果连续存放到自RESULT开始的单元中。
解
15.设有一数据块,共有100字节,试找出数据块中最大者,并把它送至MAX单元中。
解
16.有两个双字长的无符号数,分别存放在自BUFFl和BUFF2开始的数据区中。试编一程序,要求:
①对两数相加;(www.daowen.com)
②对两数相减;
③对两数相乘。
分别将结果存放在自BUFF3开始的数据区中。用多模块分别编写,然后汇编连接成一个文件。
解
用4个模块MODA、MODB、MODC、MODD分别编写,主模块为MODA,MODB、MODC、MODD为从模块。这4个模块分别存为4个文件,用MASM将它们分别汇编为4个.OBJ文件MODA.OBJ、MODB.OBJ、MODC.OBJ、MODD.OBJ,然后用LINK把这4个.OBJ文件连接成一个可执行文件。
MODA.ASM主模块如下:
MODB.ASM模块如下:
17.已知各寄存器和内存单元的状态,如表4.1和表4.2所示,阅读下面的程序段,将中间结果填入右边的空格,最后结果填入表4.3与表4.4中。
表4.1 8086 CPU
表4.2 RAM内容
表4.3 8086 CPU
表4.4 RAM内容
解
最后结果如表4.5和表4.6所示。
表4.5 8086 CPU
表4.6 RAM内容
18.在内存以BLOCK为首地址的数据区中,有10个双字节无符号二进制整数。试编写求其平均值的程序,并将结果存入数据块之后。
解
19.在偏移量为FIRST和TWO的内存单元中,分别有两个双字节带符号数X和Y。试编一程序,若X<Y则清除中断标志,否则就把方向标志置位。
解
20.编一程序,接收用户键入的年、月、日,并自动计算显示的这个日期对应星期几,要求有输入提示、输入错误检查及错误提示功能。
提示:计算星期几的公式为
S=(X-1)×365+[(X-1)/4]-[(X-1)/100]+[(X-1)/400]+C
解
21.编一程序,把键入的十六进制数转换成十进制数并在屏幕上显示出来。键入的最大数为FFFFH,若键入的不是十六进制数,则显示出错提示。
解
22.编一程序,至少用5种不同的属性在屏幕上显示字符串″HOW ARE YOU,WELCOME YOU!″,当键入任意键后,清除屏幕并返回DOS。
解
本题用简化的段定义,小圆点(.)后跟段名,遇到下一个小圆点意味着此段结束,下一段开始。题中用到的BIOS调用INT 10H(显示器驱动程序)及INT 16H请参看本书对应的教材《微机原理与接口技术(第3版)》。
程序后加了较详细的注释,共用8种不同的属性在屏幕上显示字符串。当敲ESC键时退出程序,返回系统。
23.编写程序,从键盘输入一字符串,将其中所有小写字母转换为大写字母,其余字符不变,将结果在屏幕上输出。
解
24.编写一程序,在屏幕上显示当天的日期与当时的时间,显示时、分、秒并能够刷新,像电子表那样,显示格式如下:
解
本题利用DOS功能调用读取系统的日期(2AH)与时间(2CH),因为读出的日期与时间都是用二进制数表示的,所以要在屏幕上显示,必须把读取的二进制数转换成ASCII码。因此,本题的编程思路是读取系统的日期与时间,把读取的二进制数转换成对应的ASCII码,然后在屏幕上显示出来。题目要求显示当天的日期,所以对日期不进行刷新,只对读取的时间进行刷新。只要秒数改变,屏幕就要刷新,程序采用每秒刷新一次的方式。因为要按题目的格式显示,所以数据区用10个存储单元(包括分隔符-)暂存转换后的年、月、日,用8个存储单元(包括分隔符:)暂存转换后的时、分、秒,还用了7个单元暂存读取的年、月、日和时、分、秒,以便于转换。程序中把经常重复出现的程序段定义了一个宏指令ZCUN并跟有两个形参X、Y。程序的最后用DOS功能调用的功能号0BH,当按下任一键时程序即可退出。
25.由于程序较长,略。
26.由于程序较长,略。
27.由于程序较长,略。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。