LC3 assembly-无法打印正确的字符

LC3 assembly-unable to print the right character

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

    .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

这是新的 version.I 很抱歉更改 question.Now 程序运行到最后,但是解密 fails.PROGRAM 1,2,3 在他们身上使用时效果很好own.I 确定 LOOP3 的 LD 命令负责 this.What 我应该做的更改吗?如果有人能帮助我,我将不胜感激!

这是文件:

P; C K T M Q S K M C U Q R C K T M Q S K T S T H K S O M H W R K G H O R O H A ^ M A Q [ B M M V O T U O T ^ W I H F [ E K V W E G H O R O A Q [ Z E B M M V A Q [ Z E B M M V I R T H K P Y P E \ Y ^ E J W T T W R I I R \ I U M P R _ L Y D E D E I \ H \ W G S G R D I C _ K J Y ^ G J Q V B W G S A Q [ N S G K H \ C K G I \ A ^ T S P G R I _ H G W ] R M A G R D A Q [ L K L V \ T I K M _ O H S S T G R D A Q [ K V W E A Q [ V E R Q N Q L A ] N W W T W S C K T M Q S K T S T H K S O M H W R K C K T M Q S K M C U Q R C K T M Q S K T S T H K S O M H W R K E H A \ D O D A Q [ L R O C W O T U O T ^ W I H F [ E \ W T L A Q [ E H A \ T S L R O C W A Q [ L ^ K O S K L S J C F O I S \ A R H E P T A C M L C U M A V K G I \ A ^ H E A T E A C _ G T K I R T H K ] \ O C U F G V H E T Q D O L T S L R K D O I R H O U V A K G A ^ W S C K T M Q S K T S T H K S O M H W R K

前3个字必须解密为"welcome my son"

查看您的代码,我找到了无限循环。

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 内存来存储一个整个字符串。