LC3装配 - 无法打印正确的字符

时间:2015-06-12 23:07:21

标签: assembly encryption lc3

我一直在尝试制作一个程序来解密正在从以下条件下的文件中读取的文本: 该文件的第一个元素的地址是5001.每个字母被加密两次:第一次使用Ceasar加密,第二次使用XOR加密。单词的长度是两者的关键。 PROGRAM 1计算2个数字的模数,PROGRAM 2计算2个数字之间的XOR计算,PROGRAM 3计算字符串的长度,以\ 0结束。 有关该计划的更多详细信息,请参阅评论。这是代码:

    .ORIG X3000
 LD R5,DATA ;r5 stores the adress of the beginning of each word
  LD  R4,COUNT ;r4 has the number of things to be read till the end                                   
      LOOP2 ADD R1,R5,#0
            LDR R0,R5,#0
            JSR PROG3 ;counts lenght.R1 is set to the last element,R0 has the length
            ST R1,TEMP
            ADD R6,R0,#0  ;R6 stores the lenght
            ST R6,KEY    ;key stored the lenght
            ADD R6,R0,#0  ;R6 will now act as a counter
            BRZ L23
            BRNZP LOOP3




            LOOP3
                 LDR R0,R5,#0   ;start decoding the letters of the string one by one
                 LD R2,KEY
                 NOT R2,R2
                 ADD R2,R2,#1  ;R2= -KEY
                 ADD R0,R0,R2  ;R0=R0-KEY
                 AND R1,R1,#0
                 ADD R1,R1,#13
                 ADD R1,R1,#13 ;R1=26,because we have 26 letters
                 ST R4,TEMP2    ;PROG1 uses R4,so we have to temporary store it
                 JSR PROG1     ;R1 has the new number
                 LD R4,TEMP2   ;get back R4
                 ADD R0,R1,#0  ;RO now has the number
                 LD R1,KEY     ;and R1 the key
                 JSR PROG2     ;r3 has the number
                 ADD R0,R3,#0  ;now r0 has it
                 TRAP X21 
                 ADD R6,R6,#-1 ;reduce counter
                 BRZ L23       ;return to LOOP2 after a few steps
                 ADD R5,R5,#1  ;move to next adress
                 BRNZP LOOP3

L23  LD R5,TEMP
     ADD R5,R5,#1  ;the new beginning is one element after the old end 
     LD R0,EMPTYSPACE ;print an empty space between the words
     TRAP X21           
     BRNZP LOOP2


PROG3     AND R0,R0,#0   ;R0 has the output(lenght)
          REP3     LDR R2,R1,#0   ;R2 has the contex of that adress
                   BRZ FIN3       ;if R2=0,then we have found end of string
                   ADD R4,R4,#-1
                    BRZ FINISH
                   ADD R0,R0,#1   ;if not,increase the lenght by 1.
                   ADD R1,R1,#1   ;increase the adress by one
                   BRNZP REP3

FIN3  ADD R4,R4,#-1
      BRZ FINISH
      RET


PROG2   

                        NOT R3, R0      ; R2 = A'
            AND R3, R3, R1  ; R2 = A'B
            NOT R1, R1      ; R1 = B'
            AND R1, R1, R0  ; R1 = AB'
            NOT R3, R3      ; R2 = NOT(A'B)
            NOT R1, R1      ; R1 = NOT(AB')
            AND R3, R3, R1  ; R2 = (A'B)'*(AB')'
            NOT R3, R3      ; R2 = ( (A'B)' (AB')' )'
                        RET

PROG1              ADD R1,R1,#0
                   BRZ IMPOSSIBLE
                   AND R2,R2,#0
                   ADD R2,R2,#1   
                   NOT R4,R1
                   ADD R4,R4,#1       
           REP1    ADD R3,R0,R4  
                   BRN FIN1
                   ADD R0,R3,#0   
                   BRNZP REP1

IMPOSSIBLE  AND R2,R2,#0
            BRNZP FIN1

FIN1    ADD R1,R0,#0
        RET


FINISH  HALT

DATA .FILL X5001   ;beginning of file (MUST use it-homework istructions)
TEMP .FILL X4000   ;random position
KEY .FILL X3000
COUNT .FILL X5000  ;number of things to read before end   (Must use it-homework instructions)
TEMP2 .FILL X4200
EMPTYSPACE .FILL #32
.END

这是新版本。我为更改问题而道歉。现在程序运行到最后,但解密失败.PROGRAM 1,2,3在自己使用时运行良好。我相信LD LOOP3的命令可以对此做出响应。我应该做出哪些改变?如果有人能帮助我,我将不胜感激!

这是文件:

P; CKTMQSKMCUQRCKTMQSKTS THKSOMHWRKGHOROHA ^ MAQ [BMMVOTUOT ^ WIHF [EKVWEGHOROAQ [ZEBMMVAQ [ZEBMMVIRTHKPYPE \ Y 1 EJWTTWRIIR \ IUMPR _ LYDEDEI \ħ\ WGSGRDIC _ KJY ^ GJQVBWGSAQ [NSGKH \ CKGI \ A ^ TSPGRI _ HGW] RMAGRDAQ [LKLV \ TIKM _ OHSSTGRDAQ [KVWEAQ [VERQNQLA] NWWTWSCKTMQSKTSTHKSOM HWRKCKTMQSKMCUQRCKTMQ SKTSTHKSOMHWRKEHA \ DODAQ [LROCWOTUOT ^ WIHF [E \ WTLAQ [EHA \ TSLROCWAQ [L ^ KOSKLSJCFOIS \ ARHEPTACMLCUMAVKGI \ A ^ HEATEAC _ GTKIRTHK] \ OCUFGVHETQDOLTSLRKDOI R H O U V A K G A ^ W S C K T M Q S K T S H H S S M M W W R K

前三个字必须解密才能“欢迎我的儿子”

1 个答案:

答案 0 :(得分:1)

看着你的代码,我找到了无限循环。

PROG1          ADD R1,R1,#0
               BRZ IMPOSSIBLE
               AND R2,R2,#0
               ADD R2,R2,#1   
               NOT R4,R1
               ADD R4,R4,#1       
       REP1    ADD R3,R0,R4     ; subtracts #27 from x5000 until negative
               BRN FIN1
               ADD R0,R3,#0   
               BRNZP REP1       ; infinite loop

IMPOSSIBLE     AND R2,R2,#0
               BRNZP FIN1

FIN1           ADD R1,R0,#0
               RET              ; Since BRN FIN1 is used, R7 isn't updated so this jumps
                                ; to x3014 and starts the loop all over again

我评论了给您带来麻烦的代码行。您可以在PROG1子程序中看到,您正在递减存储在R3(x5000)中的初始值,直到达到负数。执行BRN FIN1跳转后,但这并不像JSRJSSR命令那样更新存储在R7中的地址。因此,当您运行FIN1子例程并点击RET命令时,您的代码会跳至x3014并重新开始。

您的所有代码都看起来不好看,但由于您经常使用多个子程序,我建议您使用堆栈来帮助管理您的寄存器。

最后,我并不是100%确定您是如何尝试使用DATA变量的。它只有一个Word(单个块)的内存,但你是否正在尝试使用它,就像它存储一个字符串一样?您只能在单个内存块中存储单个字符(有例外,但为简单起见,我们将坚持一对一),并且为了管理字符串,您需要BLKW内存来存储整个字符串。