请编制程序,其功能是:内存中连续存放着10个十六位二进制数。分别对每个数的高位字节和低位字节进行逻辑与运算及逻辑或运算。运算结果以字的形式按序连续存放(低位字节存入逻辑与运算的结果,高位字节存入逻辑或运算的结果)。 例如: 内存中有:AA55H

admin2009-02-15  23

问题 请编制程序,其功能是:内存中连续存放着10个十六位二进制数。分别对每个数的高位字节和低位字节进行逻辑与运算及逻辑或运算。运算结果以字的形式按序连续存放(低位字节存入逻辑与运算的结果,高位字节存入逻辑或运算的结果)。
   例如:
   内存中有:AA55H,55AAH,FFAAH
   结果为:    PP00H,FF00H,FFAAH
   部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从 RESULT开始存放,  由过程SAVE保存到文件OUTPUT1.DAT中。
   请填空BEGIN和END之间已经给出的源程序使其完整,空白处已经用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。
   对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
   [试题程序]
              EXTRN    LOAD:FAR,SAVE:FAR
   N          EQU      3
   STAC       SEGMENT  STACK
              DB       128  DUP  (?)
   STAC       ENDS
   DATA       SEGMENT
   SOURCE     DW        N  DUP(?)
   RESULT     DW        N  DUP(0)
   NAME0      DB        ’INPUT1.DAT’,0
   NAME1      DB        ’OUTPUT1.DAT’,0
   DATA       ENDS
   CODE       SEGMENT
              ASSUME     CS:CODE,  DS:DATA,  SS:STAC
   START      PROC       FAR
              PUSH       DS
              XOR        AX,AX
              PUSH       AX
              MOV        AX,DATA
              MOV        DS,AX
              LEA        DX,SOURCE    ;数据区起始地址
              LEA        SI,NANE0     ;原始数据文件名
              MOV        CX,N*2       ;字节数
              CALL       LOAD          ;从’INPUT1.DAT’中读取数据
   ;    *********  BEGIN **********
              MOV        DI,OFFSET  RESULT
              MOV        CX,N
              MOV        BX,00
   PRO:      MOV        AX,      (1)  
              MOV        DX,AX
              AND          (2)  ,DH
               (3)      AH,AL
              MOV          (4)  ,DL
              ADD        BX,2
               (5)  
              ADD        DI,2
               (6)  
              JNZ        PRO
   ;    ********  END  ********
              LEA        DX,RESULT    ;结果数据区首址
              LEA        SI,NAME1     ;结果文件名
              NOV        CX,N*2       ;结果字节数
              CALL       SAVE          ;保存结果到文件
              RET
   START      ENDP
   CODE       ENDS
              END        START

选项

答案(1)SOURCE[BX] (2)DL (3)OR(4)AL (5)MOV [DI],AX (6)DECCX

解析 该程序的功能是:将每个16位二进制数的高8位和低8位分别进行逻辑“与”运算和逻辑“或”运算,并将运算结果以字的形式按序连续存放,低字节存放逻辑“与”运算的结果,高字节存放逻辑“或”运算的结果。
   程序的堆栈段定义了一个128字节的堆栈区。堆栈段下面是数据段。数据段中定义了两个字型变量:原始数据区SOURCE和结果数据区RESULT:两个字节型变量:原始数据文件名NAME0和结果数据文件名NAME1。数据段下面是代码段,在代码段的开始告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。
   在程序的开始部分,是对返回地址的保存和数据段寄存器的初始化,这是每一个汇编程序所必须具有的操作步骤。然后调用外部过程LOAD,从“INPUT1.DAT”中读取数据。准备工作完成以后,程序进入主体部分。
   首先将结果数据偏移地址传送给DI,CX赋初值为N,原始数据偏移地址BX赋初值为0。在PRO段,将SOURCE[BX]中的内容送AX,所以第(1)空填写“SOURCE[BX]”。接着将AX中的数据送DX暂存,将DL和DH中的内容(即16位二进制数的高8位和低8位的值)进行逻辑“与”操作,结果存放于DL中,所以第(2)空填写“DL”。然后将AH和AL中的内容进行逻辑“或”操作,结果存放于AH中,第(3)空填写“OR”。将高8位和低8位逻辑“与”的结果(DL的内容)送AL,所以第(4)空填写“AL”。注意,此时AH中的内容为高8位和低8位逻辑“或”的结果。接着将地址指针BX加2,指向下一个16位二进制数。最后,将AX中的逻辑“或”和逻辑“与”的结果存入到字单元[DI]中,所以第(5)空填写“MOV [DI],AX”。
   当处理完一个16位二进制数后,CX减1,若CX的内容不为0,则转向PRO段,继续处理下一个16位二进制数:若 CX内容为0,说明1016位二进制数已全部处理完。显然第(6)空应填写“DECCX”,用以实现循环计数。
转载请注明原文地址:https://jikaoti.com/ti/J1V7FFFM
0

最新回复(0)