你好,如果任何人可以帮助我与此代码,我面临的问题,我不知道确切的错误是什么,但它只与前几步工作,然后当它coms让用户输入一个消息,它导致错误
; multi-segment executable file template.
data segment
; add your data here!
pkey db "press any key...$"
prompt1 db "if u want to encrypt,type E,if u want to decrypt,type D:",0Ah,0Dh,"$"
prompt2 db "enter the encryption key(a single digit from 1 to 9):",0Ah,0Dh,"$"
prompt3 db "input a message of no more than 20 characters ,when done press <ENTER>:",0Ah,0Dh,"$"
message db 20 dup(?)
result db 20 dup(?)
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
; add your code here
; prompt the user for input
mov ah, 09h
mov dx, offset prompt1
int 21h
; read the user's input and store it in x3100
mov ah, 01h
int 21h
mov [3100H], al
; prompt the user for the encryption key
mov ah, 09h
mov dx, offset prompt2
int 21h
; read the encryption key and store it in x3101
mov ah, 01h
int 21h
mov [3101H], al
; prompt the user for the message
mov ah, 09h
mov dx, offset prompt3
int 21h
; read the message and store it in x3102
mov ah, 0ah
mov dx, offset message
int 21h
; encrypt/decrypt the message based on the user's input
mov al, [3100H]
cmp al, 'E'
je encrypt
cmp al, 'D'
je decrypt
; encrypt the message
encrypt:
mov si, offset message
mov di, offset result
mov bx, [3101H] ; encryption key
mov cx, 20 ; number of characters to process
encrypt_loop:
; toggle the low-order bit of the ASCII code
mov al, [si]
xor al, 1
add al, [bx] ; add the encryption key
mov [di], al
inc si
inc di
loop encrypt_loop
; output the encrypted message
mov ah, 09h
mov dx, offset result
int 21h
; decrypt the message
decrypt:
mov si, offset message
mov di, offset result
mov bx, [3101H] ; encryption key
mov cx, 20 ; number of characters to process
decrypt_loop:
; subtract the encryption key from the ASCII code
mov al, [si]
sub al,[ bx]
; toggle the low-order bit of the result
xor al, 1
mov [di], al
inc si
inc di
loop decrypt_loop
; output the decrypted message
mov ah, 09h
mov dx, offset result
int 21h
lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx
; wait for any key....
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
它告诉我纠正int 21/9 h的示例
mov dx,offset message
mov ah,9
我甚至不知道错误在哪里
1条答案
按热度按时间iovurdzv1#
当它让用户输入消息时,它会导致错误
您正在使用DOS.BufferedInput函数0Ah来输入要编码/解码的字符串。您遇到的问题是没有为这个DOS函数提供正确的输入结构。
你需要把
message db 20 dup(?)
修改成message db 21, 0, 21 dup(0)
。但是不要就这样把它从我这里拿走!阅读How buffered input works以获得完整的解释。既然您显然希望用户准确地输入20个字符,我宁愿使用一个简单的循环,而不是使用缓冲输入函数:
您的程序显示更多错误
在LC3这样的体系结构中,可能会使用固定地址存储,但在x86上绝对不应该这样做。
就像当前的 * data * 程序段存储消息和缓冲区一样,您是否应该为这些附加项添加存储空间。
一个二个一个一个
如果用户选择的不是'E'或'D',你的程序还是会加密!一个不错的输入策略是也接受小写的命令'e'和'd',如果不符合,你让用户从头重做。
一旦你加密(并显示)了一个字符串,你就立即开始解密它。这可能是故意的,但它会把选择加密方法('E'或'D')变成(某种)愚蠢/多余的操作。
虽然这是MASM风格,但当你加载的数字只是一个地址时,看到这些方括号会让人困惑。简单地写为
mov bx, 3101h
。如果你写为mov bx, offset EncryptionKey
会更好。关于加密密钥:你要求用户输入"1到9之间的一个数字",但是在没有任何转换的情况下,你存储在存储器中的值仍然是字符"1"到"9"之一的ASCII码。2要获得1到9之间的值,你需要减去48。
它告诉我纠正int21/9h的示例
我甚至不知道错误在哪里
DOS.PrintString函数09h在DS:DX中需要一个指向以**$结尾的字符串的远指针。您的 * result * 缓冲区中的20字节字符串没有该$**结尾符。将其编写为
result db 20 dup(0), '$'
。