我正在大学学习大会,即使我刚刚开始,我决定深入挖掘,到目前为止我做了一些很酷的课程。我最近的一个是加密器/解密器。它通过反转你想要加密的字符串,然后按给定值增加每个字符,如Caesar Cipher,只是反转。
当我要求用户输入要添加到字符的值时,会出现问题。用户输入值但它存储为十六进制,我无法正确执行算术运算。
我正在使用Emu8086,因为这是我们在课堂上使用的。
任何帮助都会非常苛刻。以下是完整的程序,随意提出如何改进它的提示,因为我只是一个初学者。
#make_COM#
org 100h
.data
EorD db 'Choose what you wish to do (E)ncrypt/(D)ecrypt: $'
Einput db 'Enter string to encrypt: $'
Dinput db 'Enter string to decrypt: $'
value db 'Enter value: $'
output db 'Your original string is: $'
Eoutput db 'Your encrypted string is: $'
Doutput db 'Your decrypted string is: $'
copying db 'Copying string...$'
encrypting db 'Encrypting string...$'
decrypting db 'Decrypting string...$'
done db 'done$'
line db 13, 10, '$'
str db 80 dup(?)
newStr db 80 dup(?)
.code
lea si, str
lea bp, str
lea di, newStr
mov ah, 9
lea dx, EorD
int 21h
mov ah, 1
begining:
int 21h
cmp al, 'E'
jz encryptor
cmp al, 'e'
jz encryptor
cmp al, 'D'
jz decryptor
cmp al, 'd'
jz decryptor
call delete
jmp begining
delete:
mov ah, 2
mov dx, 8 ;backspace
int 21h
mov dx, 32 ;space
int 21h
mov ah, 2
mov dx, 8 ;backspace
int 21h
mov ah, 1
ret
encryptor:
mov ah, 9
lea dx, line
int 21h
int 21h
lea dx, Einput
int 21h
call inputStr
call getValue
lea dx, encrypting
int 21h
Estart:
cmp [di], '$'
jz Edone
add [di], bx
inc di
jmp Estart
Edone:
lea dx, done
int 21h
lea dx, line
int 21h
int 21h
lea dx, output
int 21h
lea dx, str
int 21h
lea dx, line
int 21h
int 21h
lea dx, Eoutput
int 21h
lea dx, newStr
int 21h
jmp finish
decryptor:
mov ah, 9
lea dx, line
int 21h
int 21h
lea dx, Dinput
int 21h
call inputStr
call getValue
lea dx, decrypting
int 21h
Dstart:
cmp [di], '$'
jz Ddone
sub [di], bl
inc di
jmp Dstart
Ddone:
lea dx, done
int 21h
lea dx, line
int 21h
int 21h
lea dx, Eoutput
int 21h
lea dx, str
int 21h
lea dx, line
int 21h
int 21h
lea dx, Doutput
int 21h
lea dx, newStr
int 21h
jmp finish
inputStr:
mov ah, 1
getChar:
int 21h
cmp al, 13
jz endStr
mov [si], al
inc si
jmp getChar
endStr:
mov [si], '$'
dec si ;getting ready to reverse
ret
getValue:
mov ah, 9
lea dx, line
int 21h
int 21h
lea dx, value
int 21h
mov ah, 1
checkNum:
int 21h
cmp al, 0x30
jbe deleteNum
cmp al, 0x39
ja deleteNum
jmp isNum
deleteNum:
call delete
jmp checkNum
isNum:
mov ah, 0
int 16h
mov bl, al
;sub bx, 30h
mov ah, 9
lea dx, line
int 21h
int 21h
lea dx, copying
int 21h
call copyFunc
lea dx, line
int 21h
ret
copyFunc: ;automatically reverses while copying
cmp [bp], '$'
jz endCopy
mov al, [si]
mov [di], al
dec si
inc bp
inc di
jmp copyFunc
endCopy:
mov [di], '$'
lea di, newStr
lea dx, done
int 21h
ret
finish:
mov ah, 4ch
int 21h
答案 0 :(得分:0)
一个简单的算法看起来像这样(伪代码):
readText()
value = 0
loop:
value = value * 10
value = value + (getNextCharacter() - 0x30)
if (charactersLeft() > 0) goto loop
您需要知道输入文本有多长,或者您需要使用特殊字符终止它(如通常在C中完成的NULL字节)。
“魔力”是数字0
,1
,...,9
由ASCII中的字节值0x30,0x31,...,0x39表示。因此,简单地计算byteValue - 0x30
可以得到代表的数字。
您还可能想要检查您正在处理的字符是否在0x30(0
)和0x39(9
)的范围内。如果没有,请中止。