编制一个程序,其功能为:内存中以8位无符号数形式连续存放着10个数据,这数据来自于一个自动抄表系统记录的10个用户某月天然气的使用量(立方米),天然气费计算公式如下(其中,X表示天然气用量,Y表示应该天然气费): a)Y=X×80 X≤8

admin2010-09-01  48

问题 编制一个程序,其功能为:内存中以8位无符号数形式连续存放着10个数据,这数据来自于一个自动抄表系统记录的10个用户某月天然气的使用量(立方米),天然气费计算公式如下(其中,X表示天然气用量,Y表示应该天然气费):
   a)Y=X×80    X≤8
   b)Y=8×80+(X-8)×120    X>8
   计算每个用户需要交的天然气费,结果用字表示,并将结果存入指定单元。
   例如:
   用天然气量为:05H,07H,12H……
   则天然气费为:0190H,0348H,0780H……
   部分程序已经给出,其中原始数据由过程LOAD从文件INPUT.DAT中读入以SOURCE开始的内存单元中。运算结果要求从RESULT开始的内存单元存放,由过程SAVE保存到文件OUTPUT.DAT中。
   请填空BEGIN和END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令也行,考生也可以删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
   对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
   [试题程序]
             TRN    AD:FAR,SAVE:FAR
   N         EQU    0
   DSEG      EGMENT
   SOURCE    DB     DUP(?)
   RESULT    DW     DUP(0)
   NAME0     DB     INPUT.DAT’,0
   NAME1     DB     OUTPUT.DAT’,0
   DSEG      NDS
   SSEG      EGMENT TACK
             B      56  DUP(?)
   SSEG      NDS
   CSEG      EGMENT
             SSUME  CS:CSEG,DS:DSEG,SS:SSEG
   START     ROC    AR
             USH    S
             OR     AX,AX
             USH    AX
             OV     AX,DSEG
             OV     DS,AX
             EA     DX,SOURCE
             EA     SI,NAME0
             OV     CX,N
             ALL    OAD
   ;    *********  BEGIN  ********
             EA     SI,SOURCE
             EA     DI,RESULT
             LD
             OV     CX,N
             OV     DL,80
             OV     DH,120
   AGAIN:   MOV    AL,[SI]
             MP     AL,8
               (1)  
             UL     DL
             MP     NEXT
   BIGGER:    (2)  
             UB     AL,8
               (3)  
             DD     AX,BX
   NEXT:      (4)  
               (5)  
             NC     SI
             OOP    GAIN
   ;    ***+****  END  ********
             EA     DX,RESULT
             EA     SI,NAME1
             OV     CX,N*2
             ALL    AVE
             ET
   START     ENDP
   CSEG      NDS
             END    START

选项

答案(1)JA BIGGER (2)MOV BX,80*8 (3)MUL DH (4)MOV[DI],AX (5)ADD DI,2

解析 本题也是一个分段函数问题,题目所要求的功能可用一个循环程序和几个分支程序来完成,又由于只分两种情况,因此用两个分支程序即可实现。
   在程序中,首先将乘法要使用的系数放到了DL和DH中,然后进入循环程序。循环程序中,首先将第一个数据取入AL后,对其进行判断,如果小于8的话,则直接执行乘以80的操作,否则要跳转到其他地方执行。由于是大于8的时候进行跳转,因此应该使用JA指令。同时如果跳转到AGAIN的话,则已经取下一个数据,而此时这个数据还未处理完,因此不能是 AGAIN;如果跳转到NEXT,NEXT后的程序有两个空白、一条ADD和一条LOOP语句,两个空白处显然无法将表达式b求出,因此NEXT也不是,所以JA跳转的语句只能是BIGGER,即第一个空白处的内容是JA NEXT。程序运行到BIGGER之后的程序段的时候,执行的是表达式b的内容。程序中有一条SUBAL,8的语句,显然这是在进行表达式b第二个式子的计算,所以接下来语句的功能是乘以120,即MUL DH,这也就是第三个空应该填的内容。在第三个空的下面有一条ADD AX,BX的语句,这是执行表达式b的加法操作,所以程序的前面的部分必须有将8×80送入BX寄存器的语句,即第二个空应填MOV BX,8*80。
   到此为止,程序已经完成了对一个数据的处理,下面应该进行的是存储操作与循环。NEXT后面的程序对运算的结果进行存储并控制整个循环。程序计算的结果要送入RESULT中,指针D¨旨向的正是RESULT存储单元,所以直接传送即可,即第四个空白处的内容为MOV  [DI],AX。数据存储完毕以后,应该进行的就是指针的修改,为下一次循环做准备,RESULT是用 DW来进行定义的,所以指针DI每次的改变量应该为2,即第五个空白处应填的内容为ADD DI,2。
转载请注明原文地址:https://kaotiyun.com/show/ZTgZ777K
0

最新回复(0)