32位汇编语言创建输出文件的麻烦

使用此程序一段时间后,它会在创建输出文件后继续停止.我使用的是Visual Basic 2010,我仍然是初学者.作业问题是这样的:

描述(对称加密):

>编码

>要求用户输入一些文字
>要求用户键入此范围内的私钥[1-255].执行范围有效性检查.
>使用提供的私钥加密输入文本,将密文放入用户指定的文件中.

>解码

>要求用户指定要解码的文件.
>从该文件加载密文并尝试解密,而不假设私钥与编码中使用的密钥相同.
>将所有试验结果放在用户指定的分隔文件中.
> d.弄清楚最合理的结果(或原始明文)是什么.

我可以弄清楚如何加密文本,但无法使用位于此教科书地址的库创建输出文件:
http://www.kipirvine.com/asm/examples/index.htm

我将在下面包含我的代码,并通过评论材料显示我在此处尝试了多少次.这本书不能很好地解释我,所以如果我能看到它试图说它将是非常有帮助的!

提前致谢!

INCLUDE Irvine32.inc

    BUFMAX = 128                    ; maximum buffer size
    KEYMAX = 128                    ; maximum buffer size
    BUFFER_SIZE = 5000

.data

    sPrompt BYTE        "Enter some text message:       ", 0
    keyPrompt   BYTE        "Enter a private key [1-255]:       ", 0
    cFile   BYTE        "Enter a filename for cypher text: ", 0
    sEncrypt    BYTE        "Cypher text                    ", 0
    sDecrypt    BYTE        "Decrypted:                 ", 0
    error   BYTE        "The key must be within 1 - 255!    ", 0
    buffer  BYTE         BUFMAX + 1 DUP(0)
    bufSize DWORD    ?
    keyStr  BYTE         KEYMAX + 1 DUP(0)
    keySize DWORD    ?
    key     DWORD    ?
    filename    BYTE        "newfile.txt                    ", 0
    fileHdl DWORD   ?
    bufFile BYTE        BUFFER_SIZE DUP (?)

.code
main PROC

    call InputTheString             ; input the plain text
    call InputTheKey                ; input the security key
    call CypherFile             ; input a cypher filename
    ;call TranslateBuffer           ; encrypt the buffer
    ;mov edx, OFFSET sEncrypt           ; display encrypted message
    ;call DisplayMessage
    ;call TranslateBuffer           ; decrypt the buffer
    ;mov edx, OFFSET sDecrypt           ; display decrypted message
    ;call DisplayMessage
    exit
main ENDP

InputTheKey PROC

    pushad                      ; save 32-bit registers
LK: mov edx, OFFSET keyPrompt       ; display a prompt
    call WriteString                ; Enter a private key [1-255]
    call Crlf                       ; start a new line
    call ReadInt                    ; read int into system
    mov key, eax                    ; store int into keyStr
    cmp eax, 255                    ; compare newly read int
    ja LC                       ; jump if above 255 to LC
    cmp eax, 1                  ; compare newly read int
    jb LC                       ; jump if below 1 to LC
    jmp LR                      ; if between range jump to LR
LC: mov edx, OFFSET error           ; The key must be within 1 - 255!
    call WriteString                ; Display the error
    call Crlf                       ; start a new line
    loop LK                     ; loop back to enter the security key
LR: popad                       ; restore the registers
    ret
InputTheKey ENDP

CypherFile PROC
    pushad
    mov edx, OFFSET cFile           ; "Enter a filename for cypher text
    call WriteString                ; Enter a name for encrypted file
    call Crlf
    call ReadString             ; Store the filename in eax
    ;mov filename, eax
    mov edx, OFFSET filename
    ;push eax
    ;mov eax, fileHdl
    ;mov edx, OFFSET bufFile
    ;mov ecx, BUFFER_SIZE
    ;mov edx, "C:\outputtext.txt"
    call CreateOutputFile
    ;mov edx, OFFSET filename
    ;mov ecx, SIZEOF filename
    ;push eax
    ;mov eax, bufSize
    call WriteToFile
    pop eax
    ;call CloseFile
    ret
CypherFile ENDP
InputTheString PROC

    pushad                      ; save 32-bit registers
    mov edx, OFFSET sPrompt         ; display a prompt
    call WriteString                ; "Enter some text message"
    call Crlf                       ; start a new line
    mov ecx, BUFMAX             ; maximum character count
    mov edx, OFFSET buffer          ; point to the buffer
    call ReadString             ; input the string
    mov bufSize, eax                ; save the length
    popad
    ret
InputTheString ENDP
    COMMENT !
DisplayMessage PROC

    pushad
    call WriteString
    mov edx, OFFSET buffer          ; display the buffer
    call WriteString
    call Crlf
    call Crlf
    popad
    ret
DisplayMessage ENDP

TranslateBuffer PROC

    pushad
    mov ecx, bufSize                ; loop counter
    mov esi, 0                  ; index 0 in buffer
    mov edi, 0                  ; index 0 in the key
L1:
    mov al, keyStr[edi]             ; get a character from encryption key
    xor buffer[esi], al             ; translate a byte
    inc esi                     ; point to next byte
    inc edi                     ; go to next position in key
    cmp edi, keySize                ; compare if equal to size of the key
    jb L2
    mov edi, 0                  ; reset to beginning of the key
L2: loop L1
    popad
    ret
TranslateBuffer ENDP
!
END main

最佳答案 从哪里开始?

你不是缺少ReadString的几个参数吗?也许是指向存储输入文件名的位置的指针?要接收文件名的缓冲区的大小?

CypherFile你用pushad将所有寄存器压入堆栈,但最后,你只能弹出eax.那里的大问题,应该是popad

由于WriteToFile的参数已被注释掉,因此它不会向输出文件写入任何内容.

编辑 – 反对我的“只是给代码”
您需要告诉ReadString保存输入的文件名和缓冲区大小的位置.
然后将此传递给CreateOutputFile – 在CyperFile proc中 –

mov     edx, offset buffer      ; you are missing a buffer for filename
mov     ecx, BUFMAX             ; buffer size
call    ReadString              

mov     edx, offset buffer      ; Pass this to CreateOutputFile
call    CreateOutputFile

现在阅读CreateOutputFile的源代码,它表示它在成功时返回一个文件句柄,将其保存在某处.完成写入文件后,将其与CloseFile一起使用.如果它没有成功创建文件,它将返回INVALID_HANDLE_VALUE

点赞