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
跳转之后,但这不会像 JSR
和 JSSR
命令那样更新存储在 R7 中的地址。因此,当您 运行 FIN1 子例程并点击 RET
命令时,您的代码会跳转到 x3014
并重新开始。
总的来说,您的代码看起来还不错,但由于您经常使用多个子例程,我建议您使用堆栈来帮助管理寄存器。
最后,我不是 100% 确定您尝试使用 DATA 变量的方式。它只有一个 Word(单个块)内存,但您正试图像存储字符串一样使用它?您只能在单个内存块中存储一个字符(也有例外,但为了简单起见,我们将坚持一对一),并且要管理一个字符串,您需要 BLKW
内存来存储一个整个字符串。
我一直在尝试制作一个程序来解密在以下条件下从文件中读取的文本: 文件第一个元素的地址是 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
跳转之后,但这不会像 JSR
和 JSSR
命令那样更新存储在 R7 中的地址。因此,当您 运行 FIN1 子例程并点击 RET
命令时,您的代码会跳转到 x3014
并重新开始。
总的来说,您的代码看起来还不错,但由于您经常使用多个子例程,我建议您使用堆栈来帮助管理寄存器。
最后,我不是 100% 确定您尝试使用 DATA 变量的方式。它只有一个 Word(单个块)内存,但您正试图像存储字符串一样使用它?您只能在单个内存块中存储一个字符(也有例外,但为了简单起见,我们将坚持一对一),并且要管理一个字符串,您需要 BLKW
内存来存储一个整个字符串。