请编制程序,其功能为:内存中存放着10个二进制数,需对此数组进行加密。方法为将前一个字节数(两位十六进制数a1a2表示)的低位十六进制数a2与后一个字节数(两位十六进制数b1b2表示)的高位十六进制数b1进行交换:第一个字节数的高位十六进制数与最后一个字节

admin2009-02-15  58

问题 请编制程序,其功能为:内存中存放着10个二进制数,需对此数组进行加密。方法为将前一个字节数(两位十六进制数a1a2表示)的低位十六进制数a2与后一个字节数(两位十六进制数b1b2表示)的高位十六进制数b1进行交换:第一个字节数的高位十六进制数与最后一个字节的低位十六进制数进行交换,加密后的结果存入内存。
   例如:内存中原始数据为:50H,61H,72H,83H,94H,…,E9H
   结果:90H,07H,18H,29H,3AH,…,85H
   部分程序已经给出,其中原始数据由LOAD 过程从文件INPUT1.DAT 中读入从SOURCE开始的内存单元,转换结果(要求从RESULT开始读入)由SAVE过程保存到OUTPUT1.DAT文件中。请在BEGIN和END之间补充使其完整,完成要求的功能。或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
   对程序必须进行汇编,并与IO.OBJ链接产生PROG1. EXE执行文件,最终产生运行结果。
部分程序如下:
   ;PROG1.ASM
       EXTRN  LOAD:FAR, SAVE:FAR
   N  EQU   10
   DSEG SEGMENT
   SOURCE DW N DUP (?)
   RESULT DW N DUP (0)
   NAME0  DB  ’INPUT1.DAT’,0
   NAME1  DB  ’OUTPUT1.DAT’,0
   DSEG ENDS
   SSEG SEGMENT STACK
       DB 128 DUP (?)
   SSEG ENDS
   CSEG SEGMENT
     ASSUME CS:CSEG, DS:DSEG;SS:SSEG
   START PROC FAR
          PUSH  DS
          XOR  AX,AX
          PUSH  AX
          MOV  AX, DSEG
          MOV  DS,AX
          MOV  ES, AX
          LEA   DX,SOURCE
          LEA   SI,NAME0
          MOV  CX,N
          CALL  LOAD
      ; *** BEGIN ***
          MOV  DI,0
          MOV  SI,0
          MOV  CX,N
   CONT:      MOV  AL, SOURCE [SI]
          MOV  AH,AL
          AND  AL,0FH
          AND  AH,0F0H
          INC  SI
          CMP  SI,N
          ____________
          MOV  SI,0
   ONE:   MOV  BL, SOURCE [SI]
          MOV  BH,BL
          AND  BL,0FH
          AND  BH,0FOH
          ____________
          MOV  CX,4
   LI:        SBR  BH, 1
          SHL  AL,1
          LOOP  L1
          ______,CX
          OR  AH,BH
          OR  AL,BL
          CMP  DI, 0
          JNZ  STOPE1
          MOV  SOURCE [SI] ,AL
          DEC  SI
          MOV  SOURCE [SI], AH
          INC  SI
          JMP  NEXT
   STORE1:    CMP  DI, N-1
          JL STORE2
          MOV  RESULT [DI], AH
          MOV  DI, 0
          MOV RESULT [DI], AL
          JMP  NEXT
   STORE2:    MOV ______, AH
          MOV ______, AL
   NEXT:       INC  DI
          LOOP CONT
       ; *** END ***
          LEA  DX, RESULT
          LEA  SI, NAME1
          MOV  CX, N
          CALL  SAVE
          RET
   START  ENDP
   CSEG   ENDS
          END START

选项

答案 ; *** BEGIN *** MOV DI, 0 MOV SI,0 MOV CX,N CONT: MOV AL, SOURCE [SI] MOV AH, AL AND AL, 0FH ; 取得低4位 AND AH, 0F0H ; 取得高4位 INC SI CMP SI,N JBE ONE ; 不是最后一个数,跳转至ONE MOV SI, 0 ONE: MOV BL,SOURCE [SI] MOV BH, BL AND BL, 0FH AND BH, 0F0H PUSH CX MOV CX, 4 L1: SHR BH, 1 SHL AL, 1 LOOP L1 ; 循环移位 POP CX OR AH, BH ; 加密运算 OR AL, BL ; 加密运算 CMP DI,0 JNZ STORE1 MOV SOURCE[S1), AL ; 交换位置 DEC SI MOV SOURCE[SI],AH ; 交换位置 INC SI JMP NEXT STORE1: CMP DI,N-1 ; 处理的是最后一个数据? JL STORE2 ; 不是则跳转至STORE2 MOV RESULT[DI],AH MOV DI,0 MOV RESULT [DI],AL JMP NEXT STORE2: MOV RESULT [D1],AH MOV SOURCE [SI],AL NEXT: INC DI ; 结果数据指针加1 LOOP CONT ; 继续处理 ; *** END *** [INPUT1.DAT 中的输入数据]: 50H,61H,72H,83H,94H,2BH,51H,11H,45H,E9H [输出结果]: 90 07 18 29 32 45 B1 14 1E 50

解析
转载请注明原文地址:https://kaotiyun.com/show/68rZ777K
0

最新回复(0)