请编制程序,将内存中连续存放着的10个无符号16位二进制数,采用近似计算法求此10个数的近似平方根。方法为:令某个数X依次减去1,3,5,7,9……等奇数,一直减到差值刚刚小于等于0为止。计算出所做的减法的次数Y,即为该数的近似平方根。把得到结果并依次存放

admin2009-02-15  26

问题 请编制程序,将内存中连续存放着的10个无符号16位二进制数,采用近似计算法求此10个数的近似平方根。方法为:令某个数X依次减去1,3,5,7,9……等奇数,一直减到差值刚刚小于等于0为止。计算出所做的减法的次数Y,即为该数的近似平方根。把得到结果并依次存放到内存当中。
   例如:内存中:0010H,0100H,0200H……
   近似方根:0004H,0010H,0016H……
   部分程序已经在PROG1中给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入,存放在SOURCE开始的内存单元中,转换结果存放在RESULT开始的内存单元中,并由过程SAVE保存到文件OUTPUT1.DAT文件中。
   对BEGIN和END之间已经给出的源程序填空,使其完整,填空处已经用横线标出,每个空白一般只需填一条指令或指令的一部分;考生也可填入功能相当的多条指令,或删去 BEGIN和END之间原有的代码自行编制程序完成相应的要求。
   对程序必须进行汇编并与IO.OBJ连接产生可执行文件,最终运行程序产生结果(无结果和结果不正确均不得分)。
   部分源程序如下:
   EXTRN LOAD:FAR,SAVE:FAR
            N    EQU   10
                          
   STACK    SEGMENT      
            DB   128   DUP(?)
   STACK    ENDS

   DATA     SEGMENT
   SOURCE   DW N DUP(?)
   RESULT   DW N DUP(0)
   NAMED    DB  ’INPUT1. DAT’,
   NAME1    DB  ’OUTPUT1. DAT’,
   DATA     ENDS

   CODE     SEGMENT
            ASSUME CS: CODE, DS : DATA,SS : STACK

   START    PROC    FAR
            PUSH    DS
            XOR     AX,   AX
            PUSH    AX
            MOV     AX,   DATA
            MOV     DS;   AX
            LEA     DX,   SOURCE
            LEA     SI,   NAMFO
            MOV     CX,   N * 2
            CALL    LOAD
            **********BEGIN**************
            LEA     DI,   RESULT
            LEA     SI,   SOURCE
            MOV     CX,   N
                                    
   LOOP0:   MOV     AX,   [SI]
                                    
            MOV     BX,   0
                           
   LOOP1:   (1)               
            SUB      AX,  BX
            (2) ,   STORE0
            (3)
   IMP      LOOP1               
                       
   STOREO:  INC BX      
            (4)
            MOV     [DI],  BX
            INC     DI
            (5)
            INC     SI
            (6) ,
   LOOP     LOOP0           
            ***************END*************
                           
            LEA     DX,    RESULT
            LEA     SI,    NAME1
            MOV     CX,    N * 2
            CALL    SAVE
            RET
   START    ENDP
   CODE     ENDS
            END     START
   相关知识:
   ●循环程序设计
   利用重复控制指令可以实现重复操作,能简化程序、节约存储空间。循环程序分为三部分:初始化部分为循环做准备;循环控制部分判断循环条件是否满足,是否继续循环操作;循环体部分完成要循环操作的具体工作。对于复杂问题,单重循环程序往往不能满足要求,循环中常常还需要有其他循环程序。值得注意的是内层循环和外层循环之间应有各自的控制条件,当从外层循环进入到内层循环时,内层循环的初始条件应该重新设置。
   (1)五条件循环指令
   格式:LOOP DST
   该指令的功能是,程序执行到此处,CX的内容减1,若CX的内容不为0,则转到目标地址处继续执行指令,否则执行该指令的下一条指令。
   (2)条件循环指令
   (I)格式:LOOPZ/LOOPE  DST
   该指令执行后,如果零标志位为1,且CX内容减1后不等于0,则转移到目标地址处继续执行指令,否则执行循环指令后的一条指令,即零标志位为0或CX内容为0时退出循环。
   (ii)格式:LOOPNZ/LOOPNE  DST
   该指令执行时,CX内容减1,然后根据零标志位和CX内容决定是否循环。若零标志位为1,或CX内容为0时退出循环,否则零标志位等0且CX内容不等于0,则转移到转移指令的目标地址处继续执行。
   编程思路:
   第一步:分析程序要求的功能。
   本程序需要完成以下功能:
   (1)从数据文件INPUT1.DAT中读取10个16位无符号整数存放在SOURCE开始的内存单元中。
   (2)将SOURCE开始的10个字单元中的无符号整数,利用减奇数的方法求近似方根,并将结果存放在RESULT开始的内存单元中。
   (3)将方根结果存放在OUTPUT1.DAT中。
   第二步:用相应的汇编程序来实现其功能。
   (1)数据的读取和存入文件的实现,题目中已经给出。
   (2)对于一个数的方根近似求解,题目中叙述了具体的实现方法,VCB依次减1,3,5……直至差小于等于0,求差次数即为方根。
   通过阅读题目中的汇编源代码,我们可以看出,将内存中的数读入AX,然后循环减 BX中的内容。这样我们可判断出减数1,3,5……是存放在BX中的,BX的初始值为1,每执行完一次减操作,BX的内容就应该加2。我们始终没有发现哪一个寄存器是用来计数进行减操作次数的,可实际上BX的内容与减操作的次数是有关的,减操作的次数为((BX)+1)/2。观察出这些特征后,我们就可容易填出空格处的答案了。

选项

答案(1) INC BX (2) JNA (3) INC BX (4) SUR BX, 1 (5) INC DI (6) INC SI

解析
转载请注明原文地址:https://jikaoti.com/ti/PPV7FFFM
0

最新回复(0)