1、三级 PC 技术机试-165 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。假设数组元素均为正数。例如,将 02H 插入下面的数组中:01H,03H,04H,05H结果为 01H,02H,03H,04H,05H部分程序已经给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中,转换结果要求从 RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。请填空 BEGIN 和 E
2、ND 之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),考生也可以填入功能相当的多条指令,或删去BEGIN 和 END 之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:(分数:100.00)_三级 PC 技术机试-165 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:在递增的有序字节数组中插入一个正整数,并按指定
3、的数组个数存入内存区中。假设数组元素均为正数。例如,将 02H 插入下面的数组中:01H,03H,04H,05H结果为 01H,02H,03H,04H,05H部分程序已经给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中,转换结果要求从 RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。请填空 BEGIN 和 END 之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),考生也可以填入功能相当的多条指令,或删去BEGIN 和 END 之间原
4、有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:(分数:100.00)_正确答案:(1)AL(2)DL(3)SI(4)BX+SI+1(5)REP)解析:解析此程序要实现的功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。此程序是用直接插入法将关键字插入到一个数组中,插入前数组的长度为 9,插入关键字后,数组长度为10。关键要理解:是将关键字和数组的最后一个数开始比较,然后再与倒数第二个、倒数第三个逐个比较,直到找到了合适的插入位置为止。程
5、序的数据段中定义了五个字节型变量:变量 MIN、原始数据区 SOURCE、结果数据区 RESULT、原始数据文件名 NAME0、结果数据文件名 NAME1。数据段下面是堆栈段,定义了一个 256 个字节的堆栈区。最后是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器 CS、DS、SS。假设要插入的数是 X即 2。先将原始数据的偏移地址装入到 BX 中,SI 赋值为 N-2 即日,将偏移地址 BX 加上 SI,则得到偏移地址 BX为 8,接着将 SI 赋值为 0,将要插入的数 X 送 AX。LP 段,先将 AL 即 X 与数组的最后一个数(第 9 个数)即 BX+SI 中的内容做比较
6、,若 AL 大于等于第 9 个数,则转向 1NS 处执行;否则,AL 小于最后第 9 个数,则将第 9 个数即 BX+SI 中的内容赋给 DL,再将 DL 存入到数组的最后一个位置即第 10 个数存放的地址中,它的偏移地址为 BX+SI+I,这样数组中原第 9 个数就存入到了数组的第十个位置了,成为该数组的最后一个数。然后,将 SI 减 1,无条件转向 LP 处执行,继续将 AL 与原数组的倒数第二个数即偏移地址为 BX+SI-1 内容中的数相比较,比较后,再做不同的处理。从上面的分析来看,第(1)空填写“AL“,第(2)空填写“DL“,第(3)空填写“SI“。INS 段,是当 AL 大于等于
7、第 9 个数时,则将 AL 即要插入的数 X 存入到数组的第十个位置上。如果 AL 不是与第 9 个数比较,而是与中间的某一个数如第六个数相比,AL 大于第六个数,则将要插入的数 AL 存放到数组的第七个位置上。其他情况依次类推。所以第(4)空填写“BX+SI+1“。接着,用 CLD 指令将方向标志 DF 清 0,在存储数组中的数据时,实现地址指针自动增量。将原始数据的偏移地址装入到 SI 中,结果数据存放的偏移地址装入到 DI 中。CX 赋值为 N,用于控制存储数组中数据的次数。再用 REP MOVSB 指令将 SI 指定的存储单元中的内容即数组中的 10 个数据装入到 DI 指定的内存中。一共操作 10 次,就将 10 个数据都存储完毕了。所以第(5)空填写“REP“。