1、三级 PC技术机试-169 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:内存中连续存放着 20个无符号字节数序列,请将它们排成升序(从小到大)。例如:内存中有 01H,04H,02H(假设后 17个字节均大与 04H)结果为 01H,02H,04H(后跟 17个字节,按从小到大的顺序排列)部分程序已给出,其中原始数据由过程 LOAD从文件 INPUT1.DAT中读入 SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,由过程 SAVE保存到文件 OUTPUT1.DAT中。请填空 BEGIN和 END
2、之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN和 END之间原有的代码并白行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:(分数:100.00)_三级 PC技术机试-169 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:内存中连续存放着 20个无符号字节数序列,请将它们排成升序(从小到大)。例如:内存中有 01H,04H,02H(
3、假设后 17个字节均大与 04H)结果为 01H,02H,04H(后跟 17个字节,按从小到大的顺序排列)部分程序已给出,其中原始数据由过程 LOAD从文件 INPUT1.DAT中读入 SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,由过程 SAVE保存到文件 OUTPUT1.DAT中。请填空 BEGIN和 END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN和 END之间原有的代码并白行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若
4、发现整个程序中存在错误之处,请加以修改。试题程序:(分数:100.00)_正确答案:(1)INC DI(2)NEXT0(3)N-1(4)SB(5)NEXT3(6)AL(7)NEXT2(8)BX(9)NEXT1)解析:解析此程序是用冒泡排序法实现一个含 20个无符号数的序列的升序排序的功能。冒泡排序方法为:将第一个数据与相邻的数进行比较,若次序不对,两数交换位置。依次类推,直至第 N-1个数和第 N个数进行过比较为止。上述过程称为第一趟冒泡排序。第一趟冒泡排序经过 N-1次比较后,最大的数已经到了数组尾,第二趟仅需比较 N-2次比较就够了,一共比较 N-1趟就完成了排序。这样共有两重循环:CX
5、是内循环次数,而 BX是外循环次数。程序的堆栈段定义了一个 128字节的堆栈区堆栈段下面是数据段数据段中定义了四个字节型变量:原始数据区 SOURCE、结果数据区 RESULT、原始数据文件名 NAME0、结果数据文件名 NAMEI。数据段下面是代码段,告诉汇编程序,代码段。数据段和堆栈段分别属于段寄存器 CS、DS,SS。先将原始数据的偏移地址装入到 SI中,结果数据存放的偏移地址装入到 DI中。CX 赋初值为 N,用于控制循环处理的次数。NEXT0段,将 SI中内容送 AL,再将 AL存入到 DI中。然后 SI地址加 1,DI 地址加 1。所以第(1)空填写“INC DI“。继续取数据 A
6、L,存数据,从入口处 NEXT0循环。所以第(2)空填写“NEXT0“。CLD 指令是将方向标志 DF清 0,在数据操作时,实现地址指针自动增量。第(3)空是给 BX赋初值 N-1。因为外循环需要比较N-1趟。NEXT1段,将结果数据地址装入到 SI中,BC 赋值给 CX。NEXT2段,是开始做一趟内的比较。第(4)空是考查 LODSB指令,是将 SI作为地址指针中的数据装入到 AI中,同时修改 SI,SI 地址加 1,指向下一个元素。将 AL与下一元素SI做比较,若SI大于等于 AL,则转向 NEXT3;否则,将 AL与SI交换。第(5)、(6)空分别填写“NEXT3“,“AL“。AL 与SI交换后,再将送SI-1)中。NEXT3段,当完成一趟内的相邻两个数的比较后,从 NEXT2入口处循环,在该趟内,将 AL继续与其他数的比较。所以第(7)空填写“NEXT2“。每次完成一趟比较,BX 应减 1,若 BX不为 0,则继续进行外循环,进行第二趟比较,循环入口处是 NEXT1。所以第(8)空和第(9)空分别填写“BX“,“NEXT1“。