Сборка 32-битной записи в файл после создания

Ну видимо у меня не получается процесс записи в файл после его создания. Я новичок в этом, поэтому помощь с этим заданием будет для меня огромной.

Описание (симметричное шифрование): 1. Кодирование a. Попросите пользователя ввести текст b. Попросите пользователя ввести закрытый ключ в пределах этого диапазона [1-255]. Выполните проверку допустимости диапазона. в. Зашифруйте входной текст с помощью предоставленного закрытого ключа, поместите зашифрованный текст в файл, названный пользователем. 2. Расшифровка а. Попросите пользователя указать файл для декодирования. б. Загрузите зашифрованный текст из этого файла и попытайтесь расшифровать его, не предполагая, что закрытый ключ тот же, что и при кодировании. в. Поместите все результаты испытаний в отдельный файл, названный пользователем. д. Выясните, каков наиболее разумный результат (или исходный открытый текст).

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 (?)
textMsg DWORD   ?

.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 ; Start a new line mov edx, OFFSET bufFile mov ecx, BUFMAX call ReadString ; Store the filename in eax mov edx, OFFSET bufFile call CreateOutputFile ;pop eax mov eax, fileHdl mov edx, OFFSET textMsg ;mov ecx, BUFFER_SIZE call WriteToFile popad call CloseFile ret
;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"

;mov edx, OFFSET filename
;mov ecx, SIZEOF filename
;push eax
;mov eax, bufSize
;call WriteToFile

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 textMsg, eax
mov bufSize, eax                ; save the length
popad
ret

InputTheString ENDP

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

person user1848703    schedule 24.11.2012    source источник
comment
Забыл указать, что файлы библиотеки находятся здесь: kipirvine.com/asm/examples/ index.htm   -  person user1848703    schedule 24.11.2012
comment
В чем проблема? Вы должны сообщить нам, что вы ожидаете, и что происходит вместо ожидаемого результата.   -  person Gunner    schedule 24.11.2012
comment
Я ожидаю, что он напишет текст в созданный выходной файл. Чего он не делает, так это записывает текст в файл, даже после того, как файл был создан.   -  person user1848703    schedule 24.11.2012


Ответы (2)


Похоже, вы вслепую просто собираете вещи.

Ирвин включает исходный код всех своих функций, включая комментарии относительно того, какие параметры они принимают. WriteToFile принимает 3 параметра - eax == дескриптор файла для записи edx == указатель на буфер, содержащий данные для записи в файл ecx == длина данных для записи в файл.

CreateOutputFile уже возвращает дескриптор файла в eax, но вы перехитрили его с помощью mov eax, fileHdl, вы правильно устанавливаете edx, теперь размер данных для записи, ReadString возвращает это в eax У вас также есть popad в неправильном месте.

call    ReadString ; Store the filename in eax 
push    eax                 ; save string length

mov     edx, OFFSET bufFile 
call    CreateOutputFile 
mov     hFile, eax          ; save file handle
pop     ecx                 ; restore string length into ecx
mov     edx, OFFSET textMsg 
call    WriteToFile 

mov     eax, hFile          ; move hfile into ecx
call    CloseFile 
popad 
ret

Увидеть разницу?

У вас есть и другие проблемы. Ваш шифр не работает.

person Gunner    schedule 24.11.2012
comment
Слепо - правильное ключевое слово! Я не очень хорошо понимаю язык ассемблера, но пытаюсь его выучить. Вчера впервые обратился за помощью в Интернете, и все были очень полезны. Я не знал, что edx может хранить textMsg для записи в файл. Я думал, что eax справится с этим. - person user1848703; 24.11.2012
comment
Я понимаю, что вы имеете в виду, говоря, что шифр не работает. Он шифрует имя файла вместо textMsg. - person user1848703; 24.11.2012
comment
Итак, как зашифрованное сообщение оказывается в файле? - person user1848703; 24.11.2012

Думаешь, у тебя не получилось? Что ж, мне было скучно, поэтому я почистил ваш код и кое-что исправил. Я не отпустил вас так легко, я где-то добавил небольшую ошибку в код, поэтому вы не можете отправить правильный код/выходной файл.

Кип пишет хорошую книгу для начинающих. Однако он не использует все возможности MASM. Для новичков самое замечательное в MASM — это его макрос invoke. Он проверяет параметры вызываемого процесса и выявляет МНОГИЕ ошибки.

В вашем другом посте вам не хватало параметров для вызова, верно? Что ж, если бы вы использовали Invoke с WriteToFile, то MASM бы это уловил и сообщил вам. Но я думаю, он этого не показывает?

Во всяком случае, попробуйте это:

INCLUDE d:\irvine32\Irvine32.inc
includelib d:\irvine32\irvine32.lib
includelib d:\irvine32\kernel32.lib
includelib d:\irvine32\user32.lib
BUFMAX = 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

.data?
bufSize     DWORD   ?
key         DWORD   ?
bufFile     BYTE    BUFFER_SIZE DUP (?)
buffer      BYTE    BUFMAX + 1 DUP (?)

.code 
main PROC
    call    InputTheString                  ; input the plain text
    call    InputTheKey                     ; input the security key

    call    TranslateBuffer                 ; encrypt the buffer

    mov     edx, offset sEncrypt
    call    WriteString

    mov     edx, OFFSET buffer              ; display encrypted message
    call    WriteString
    call    Crlf

    call    CypherFile 

    call    TranslateBuffer                 ; decrypt the buffer

    mov     edx, offset sDecrypt
    call    WriteString

    mov     edx, OFFSET buffer              ; display encrypted message
    call    WriteString
    call    Crlf

    call    WaitMsg
    exit

main ENDP

InputTheString PROC
    mov     edx, OFFSET sPrompt             ; display a prompt
    call    WriteString                     ; "Enter some text message"

    mov     ecx, BUFMAX                     ; maximum character count
    mov     edx, OFFSET buffer              ; point to the buffer
    call    ReadString                      ; input the string

    push    offset buffer
    call    Str_length
    mov     bufSize, eax                    ; save the length   
    ret
InputTheString ENDP

InputTheKey PROC

PromptForKey:
    mov     edx, OFFSET keyPrompt           ; display a prompt 
    call    WriteString                     ; Enter a private key [1-255] 
    call    ReadInt                         ; read int into system 
    test    eax, eax
    jz      BadKey
    cmp     eax, 255
    jg      BadKey

    mov     key, eax
    ret

BadKey:
    mov     edx, OFFSET error               ; The key must be within 1 - 255! 
    call    WriteString  
    call    Crlf
    jmp     PromptForKey
InputTheKey ENDP

CypherFile PROC 
    mov     edx, OFFSET cFile               ; "Enter a filename for cypher text 
    call    WriteString                     ; Enter a name for encrypted file 

    mov     edx, OFFSET bufFile 
    mov     ecx, BUFMAX 
    call    ReadString                      ; Store the filename in eax 

    mov     edx, OFFSET bufFile 
    call    CreateOutputFile 
    push    eax                             ; save file handle

    mov     ecx, bufSize      
    sub     ecx, 5         
    mov     edx, OFFSET buffer 
    call    WriteToFile 

    pop     eax                             ; restore file handle
    call    CloseFile 
    ret
CypherFile ENDP

TranslateBuffer PROC
    mov     ecx, bufSize
    mov     eax, key
    xor     esi, esi
XorByte:
    xor     buffer[esi], al
    inc     esi
    cmp     esi, ecx
    jne     XorByte
    ret
TranslateBuffer ENDP

DisplayMessage PROC

    mov     edx, OFFSET buffer          ; display the buffer
    call    WriteString
    call    Crlf
    call    Crlf
    ret

DisplayMessage ENDP
END main
person Gunner    schedule 25.11.2012