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