请编制程序,其功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。假设数组元素均为正数。 例如,将02H插入下面的数组中: 01H,03H,04H,05H… 结果为 01H,02H,03H,04H,05H…

admin2010-12-14  76

问题 请编制程序,其功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。假设数组元素均为正数。
   例如,将02H插入下面的数组中:
   01H,03H,04H,05H…
   结果为  01H,02H,03H,04H,05H…
   部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
   请填空BEGIN和END之间已经给出的一段源程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),考生也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
   试题程序:
   

选项

答案(1)AL (2)DL (3)SI (4)[BX+SI+1] (5)REP

解析 此程序要实现的功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。
   此程序是用直接插入法将关键字插入到一个数组中,插入前数组的长度为9,插入关键字后,数组长度为10。关键要理解:是将关键字和数组的最后一个数开始比较,然后再与倒数第二个、倒数第三个……逐个比较,直到找到了合适的插入位置为止。
   程序的数据段中定义了五个字节型变量:变量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中的内容做比较,若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大于等于第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"。
转载请注明原文地址:https://kaotiyun.com/show/JdgZ777K
0

最新回复(0)