0

我一直在用汇编语言编写这个程序,加密或解密一串文本。最后它应该只是输出编码的消息,但我只是得到大量的随机字符。有人知道这里发生了什么吗?

.ORIG x3000


;CLEAR REGISTERS
AGAIN AND R0, R0, 0     ;CLEAR R0
AND R1, R1, 0           ;CLEAR R1
AND R2, R2, 0           ;CLEAR R2
AND R3, R3, 0           ;CLEAR R3
AND R4, R4, 0           ;CLEAR R4
AND R5, R5, 0           ;CLEAR R5
AND R6, R6, 0           ;CLEAR R6

;ENCRYPT/DECRYPT PROMPT
LEA R0, PROMPT_E        ;LOADS PROMPT_E INTO R0
PUTS                ;PRINTS R0
GETC                ;GETS INPUT
OUT             ;ECHO TO SCREEN
STI R0, MEMX3100        ;X3100 <- R0

;KEY PROMPT
LEA R0, PROMPT_K        ;LOADS PROMPT_E INTO R0
PUTS                ;PRINTS R0
GETC                ;GETS INPUT
OUT             ;ECHO TO SCREEN
STI R0, CYPHERKEY       ;X3101 <- R0

;MESSAGE PROMPT
LD R6, MEMX3102         ;R6 <- MEMX3102
LEA R0, PROMPT_M        ;LOADS PROMPT_E INTO R0
PUTS                ;PRINTS R0
LOOP1 GETC          ;GETS INPUT
OUT             ;ECHO TO SCREEN
ADD R1, R0, #-10        ;R1 <- R0-10
BRZ NEXT            ;BRANCH NEXT IF ENTER
STR R0, R6, #0          ;X3102 <- R0
ADD R6, R6, #1          ;INCRIMENT COUT
LD R2, NUM21            ;R2 <- -12546
ADD R5, R6, R2          ;R5 - R2
STI R5, MEMX4000        ;MEMX4000 <- R5
LD R1, NUM20            ;R1 <- NUM20
ADD R1, R6, R1          ;CHECK FOR 20
BRN LOOP1           ;CREATES WHILE LOOP

;Function choose
NEXT LDI R6, MEMX3100       ;R6 <- X3100
LD R1, NUM68            ;R1 <- -68
ADD R1, R6, R1          ;CHECKS FOR D INPUT
BRZ DECRYPT

;ENCRYPT FUNCTION(DEFAULT)
LD R4, MEMX3102         ;R6 <- X3102
LOOP2 LDR R1, R4, #0        ;R1 <- MEM[R4+0]
LDI R5, ASCII           ;R5 <- ASCII
ADD R1, R1, R5          ;STRIPS ASCII
AND R6, R1, #1          ;R6 <- R1 AND #1
BRZ LSBOI           ;BRANCH IF LSB = 0
ADD R1, R1, #-1         ;R1 <- R1-1
BRNZP KEYLOAD           ;BRANCH TO KEYLOAD
LSBOI ADD R1, R1, #1        ;R1 <- R1+1
KEYLOAD LDI R2, CYPHERKEY   ;R2 <- CYPHERKEY
ADD R1, R1, R2          ;R1 <- R1+R2
STR R1, R4, #21         ;MEM[R4+21] <- R1
ADD R4, R4, #1          ;R4 <- R4 + 1
LD R5, MEMX4000         ;R5 <- COUNT
NOT R5, R5          ;NOT R5
ADD R5, R5, R4          ;CHECK FOR NEGATIVE
BRN LOOP2           ;LOOP
BRNZP NEXT2         ;BRANCH WHEN DONE

;DECRYPT FUNCTION DECRYPT LD R4, MEMX3102       ;R4 <- X3102 LOOP3 LDR R1, R4, #0       ;R1 <- MEM[R4+0] LDI R5, ASCII          ;R5 <- ASCII ADD R1, R1, R5         ;STRIPS ASCII LDI R2, CYPHERKEY     ;R2 <- CYPHERKEY NOT R2, R2         ;R2 <- NOT R2 ADD R1, R1, R2            ;R1 <- R1 - CYPHERKEY AND R6, R1,
#1          ;R6 <- R1 AND #1 BRZ LSBOI2         ;BRANCH IF LSB = 0 ADD R1, R1, #-1          ;R1 <- R1-1 BRNZP NEXTTASK1         ;BRANCH TO KEYLOAD LSBOI2 ADD R1, R1, #1        ;R1 <- R1+1 NEXTTASK1 STR R1, R4, #21   ;MEM[R4+21] <- R1 ADD R4, R4, #1            ;R4 <- R4 + 1 LD R5, MEMX4000           ;R5 <- COUNT NOT R5, R5         ;NOT R5 ADD R5, R5, R4          ;CHECK FOR NEGATIVE BRN LOOP3           ;LOOP

;OUTPUT NEXT2 LD R4, MEMX3102       ;R4 <- X3102     LOOP4 LDR R0, R4,
#21     ;R0 <- [R4+21] OUT              ;PRINT R0 ADD R4, R4, #1            ;R4 <- R4+1 LD R5, MEMX4000         ;R5 <- COUNT NOT R5, R5         ;NOT R5 ADD R5, R5, R4          ;CHECK FOR NEGATIVE BRN LOOP4


HALT MEMX4000 .FILL X4000 ASCII .FILL #-30 NUM21 .FILL #-12546 NUM20 .FILL #-12566 MEMX3102 .FILL X3102 CYPHERKEY .FILL X3101 MEMX3100 .FILL X3100 NUM68 .FILL #-68 NUM32 .FILL #-32 PROMPT_E .STRINGZ "\nTYPE E TO ENCRYPT OR TYPE D TO DECRYPT (UPPER CASE): " PROMPT_K .STRINGZ "\nENTER THE ENCRYPTION KEY (A SINGLE DIGIT FROM 1 TO 9) " PROMPT_M .STRINGZ "\nINPUT A MESSAGE OF NO MORE THAN 20 CHARACTERS THEN PRESS <ENTER> "


.END
4

1 回答 1

0

您的程序中发生了许多不同的事情,以下是我发现的一些事情:

  • 编码循环的循环次数超过输入的字符数
  • 加密密钥以其 ASCII 形式存储和使用
  • 来自用户的字符存储在 PROMPT_M 文本的中间
  • 编码循环循环数千次
  • 编码循环未更改位置 x3102 处的任何存储字符
  • 输出例程不循环,所以它只输出一个字符

从我所见,您的程序从用户那里获取了一个非 ascii 字符,并将其添加到加密密钥的 ascii 形式中,然后在 x3102 的每个内存偏移 21 个位置处存储数百次。当您的输出例程运行时,它会提取存储在 x3117 中的值并输出该字符,然后停止程序。

于 2015-04-30T19:26:35.950 回答