assembly 汇编加密解密程序

ix0qys7i  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(131)

你好,如果任何人可以帮助我与此代码,我面临的问题,我不知道确切的错误是什么,但它只与前几步工作,然后当它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

我甚至不知道错误在哪里

iovurdzv

iovurdzv1#

当它让用户输入消息时,它会导致错误
您正在使用DOS.BufferedInput函数0Ah来输入要编码/解码的字符串。您遇到的问题是没有为这个DOS函数提供正确的输入结构。
你需要把message db 20 dup(?)修改成message db 21, 0, 21 dup(0)。但是不要就这样把它从我这里拿走!阅读How buffered input works以获得完整的解释。
既然您显然希望用户准确地输入20个字符,我宁愿使用一个简单的循环,而不是使用缓冲输入函数:

mov  ah, 09h
  mov  dx, offset prompt3
  int  21h
  mov  di, offset message
  mov  cx, 20
NextChar:
  mov  ah, 01h    ; DOS.GetCharacter
  int  21h        ; -> AL
  mov  [di], al
  inc  di
  loop NextChar

您的程序显示更多错误

; read the user's input and store it in x3100
; read the encryption key and store it in x3101
; read the message and store it in x3102

在LC3这样的体系结构中,可能会使用固定地址存储,但在x86上绝对不应该这样做。
就像当前的 * data * 程序段存储消息和缓冲区一样,您是否应该为这些附加项添加存储空间。
一个二个一个一个
如果用户选择的不是'E'或'D',你的程序还是会加密!一个不错的输入策略是也接受小写的命令'e'和'd',如果不符合,你让用户从头重做。

; output the encrypted message
mov ah, 09h
mov dx, offset result
int 21h
; decrypt the message
decrypt:

一旦你加密(并显示)了一个字符串,你就立即开始解密它。这可能是故意的,但它会把选择加密方法('E'或'D')变成(某种)愚蠢/多余的操作。

mov bx, [3101H] ; encryption key
add al, [bx] ; add the encryption key

虽然这是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), '$'

相关问题