请编制程序,其功能是:以SOURCE开始的内存区域存放着N个字节的压缩BCD码,将每个压缩BCD码转换成两个 ASCII值,并在每个ASCII值的最高位增加偶校验位,结果存放在RESULT指示的内存区域。 例如: 原压缩BCD码:26H,75H

admin2009-02-15  25

问题 请编制程序,其功能是:以SOURCE开始的内存区域存放着N个字节的压缩BCD码,将每个压缩BCD码转换成两个 ASCII值,并在每个ASCII值的最高位增加偶校验位,结果存放在RESULT指示的内存区域。
   例如:
   原压缩BCD码:26H,75H,91H,33H…
   结果为:    B2H,36H,B7H…
   部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
   请填空BEGIN和END之间已经给出的一段原程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。
   对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
   [试题程序]
            EXTRN    LOAD:FAR,SAVE:FAR
   N        EQU      10
   STAC     SEGMENT STACK
            DB       128  DUP(?)
   STAC     ENDS
   DATA     SEGMENT
   SOURCE   DB        N  DUP(0)
   RESULT   DB        2*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
            MOV        ES,AX        ;置附力,段寄存器
            LEA        DX,SOURCE    ;数据区起始地址
            LEA        SI,NANE0     ;原始数据文件名
            MOV        CX,N         ;字节数
            CALL       LOAD          ;从’INPUT1.DAT’ 中读取数据
   ;    *************BEGIN *************
            LEA        SI,SOURCE
            MOV        DI,OFFSET  RESULT
            MOV        CX,N
   SERCH1: MOV          (1)  
            MOV        AH,AL
            AND        AH,0FH
            AND        AL,0FOH
            PUSH       CX
            MOV        CL,4
             (2)  
             (3)  
            ADD        AL,30H
             (4)  
            OR         AL,80H
   SERCH2: MOV        [DI],AL
            INC        DI
             (5)  
            JP         SERCH3
            OR         AH,80H
   SERCH3: MOV        [DI],AH
            INC        DI
            INC        SI
             (6)      SERCH1
   ;    ********  END  ***********
            LEA        DX,RESULT    ;  结果数据区首址
            LEA        SI,NAMEl     ;结果文件名起始地址
            MOV        CX,2*N       ;字节数
            CALL       SAVE          ;保存结果到,OUTPUT1.DAT,文件中
            RET
   START    ENDP
   CODE     ENDS
            END        START

选项

答案(1)AL,[SI] (2)SHRAL,CL (3)POPCX(4)JP SERCH2 (5)ADDAH,30H (6)LOOP

解析 此程序要实现两个功能:将N个字节的压缩BCD码转换成2N个ASCII值,并在每个ASCII值的最高位增加偶校验位。这里考查压缩BCD码与ASCII码之间的转换,特别是对SHR指令的理解和状态标志位PF的运用。
   程序的基本结构如下:
   堆栈段定义了一个128字节的堆栈区。堆栈段下面是数据段。数据段中定义了四个字节型变量:原始数据区SOURCE、结果数据区RESULT、原始数据文件名NAME0、结果数据文件名NAME1。数据段下面是代码段,在代码段开始告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。
   先将原始数据偏移地址装入到SI中,结果数据偏移地址送DI。 CX赋初值为N,用于控制循环处理的次数。
   SERCH1段的开始要填写第(1)空,将[SI]中的内容传送到AL。所以第(1)空填写“AL,[SI]”。将AL暂存在AH中。接着用两条逻辑“与”指令,将AH的高四位屏蔽掉,将AL的低四位屏蔽掉。CX先压入堆栈中,再将CL赋值为4,用以控制下面的移位指令的移位位数。将AL逻辑右移四位,则AL的原高四位数字移入到低四位,高四位现在变成了0。第(2)空填写“SHRAL,CL”。
   有压入就必有弹出,与前面的“PUSH CX”指令相对应,第(3)空填写“POP CX”。然后将AL中的值加30H,就将压缩BCD码的高四位转换成相应的ASCII字符了。再由状态标志位PF求AL的偶校验位。若PF=1,说明AL中有偶数个1,则偶校验位为0,AL的最高位不变,转向SERCH2段。否则,PF=0,则AL的偶校验位为1,将偶校验位1加到AL的最高位,用指令“ORAL,80H”来实现,所以第(4)空填写“JPSERCH2”。
   SERCH2段,将转换后的结果AL存入到[DI]中,DI加1。接着将压缩BCD码的低四位(已存放在AH中)转换成ASCII值,所以第(5)空填写“ADDAH,30H”。接下来两条指令,是同求高四位的偶校验位一样,来求低四位的偶校验位。
   SERCH3段,将转换后的结果AH存放到[DI]中,DI地址加1,SI地址加1,然后循环到SERCH1入口处,继续处理下一个压缩BCD码,所以第(6)空填写“LOOP”。
转载请注明原文地址:https://kaotiyun.com/show/B8rZ777K
0

最新回复(0)