gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:00:54 31 4
gpt4 key购买 nike

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

说明(对称加密):

  • 编码
  • 要求用户输入一些文字
  • 要求用户键入此范围内的私钥 [1-255]。执行范围有效性检查。
  • 使用提供的私钥加密输入文本,将密文放入用户命名的文件中。
  • 解码
  • 要求用户指定要解码的文件。
  • 从该文件加载密文并尝试解密它,而不假设私钥与编码中使用的私钥相同。
  • 将所有的试验结果放在一个由用户命名的单独文件中。
  • d.找出最合理的结果(或原始明文)是什么。

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

    我将在下面包含我的代码,并通过评论 Material 显示我在这方面进行了多少次尝试。这本书并没有很好地向我解释,所以如果我能看到它想要表达的内容,那将会非常有帮助!

    提前致谢!
    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 将所有寄存器压入堆栈但最后,你只有pop 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

    关于assembly - 32位汇编语言创建输出文件麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537164/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com