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