2017-01-20 1 views
1

Я работаю над проектом шифрования, и я хочу открыть файл и записать там зашифрованное сообщение, но есть ошибка, открывающая файл. Я попытался выполнить ту же процедуру, и она работает отлично, но когда я запускаю ее с остальной частью кода, она дает мне ошибку открытия - флаг флага переноса и ax = 3. Вот код, жаль, что это может быть немного грязный:Ошибка открытия файла кода ax = 3 | Assembly x86

;KorenM 
IDEAL 
MODEL small 
STACK 100h 
DATASEG 
; -------------------------- 
; Your variables here 
; -------------------------- 
buff db 26  ;MAX NUMBER OF CHARACTERS ALLOWED (25). 
     db ?   ;NUMBER OF CHARACTERS ENTERED BY USER. 
     db 26 dup(0) ;CHARACTERS ENTERED BY USER. 
seed dw ? ;define word for seed 
a dw 9556 ;define word for multiplier 
b dw 6213 ;define word for increment 
m dw 0FFFFh 
gkey dd ? 
fkey dd ? 
key db ? 
msg db 'Hello$' 
filename db 'msg.txt',0 
filehandle dw ? 
errormsg db 'Error Opening Sending File$' 
CODESEG 
    ;procedure for encrypting each letter 
proc enc 
    mov bl,al ;saves key number in bl 
    and al,01 ;if key number is odd zero flag turns on 
    jz nzugi ;if zero flag is on jump to nzugi: 
    sub [buff+2+si],bl ;if key number is even substract key number from letter ascii code 
    jmp exproc ;ends the procedure 
nzugi: 
    add [buff+2+si],bl ;if key number is odd add key number to letter ascii code 
exproc: 
    inc si ;increases si so next time it takes the next letter 
    ret 
endp enc 
;---------------------------------------- 
;end procedure for encrypting each letter 
;proc for input 
;---------------------------------------- 
proc input 
    ;CAPTURE STRING FROM KEYBOARD.          
      mov ah, 0Ah ;SERVICE TO CAPTURE STRING FROM KEYBOARD. 
      mov dx, offset buff 
      int 21h     
;CHANGE CHR(13) BY '$'. 
    mov si, offset buff + 1 ;NUMBER OF CHARACTERS ENTERED. 
    mov cl, [ si ] ;MOVE LENGTH TO CL. 
    mov ch, 0  ;CLEAR CH TO USE CX. 
    inc cx ;TO REACH CHR(13). 
    add si, cx ;NOW SI POINTS TO CHR(13). 
    mov al, '$' 
    mov [ si ], al ;REPLACE CHR(13) BY '$'.    
    ret 
endp input 
;-------------------------- 
;Number Genarator Procedure 
;-------------------------- 
proc lcg 
    mov di,2 
    mov ax,[seed] 
keygen: 
    mov cx,[a] 
    mov bx,[b] 
    mul cx 
    add ax,bx 
    mov [word ptr gkey+si],ax 
    mov [word ptr fkey+si],ax 
    add si,2 
    dec di 
    cmp di,0 
    jne keygen 
    ret 
endp lcg 
;--------------------- 
;proc for opening file 
;--------------------- 
proc openfile 
    mov ah,3Dh 
    mov al,2 
    mov dx,offset filename 
    int 21h 
    jc openerror 
    mov [filehandle],ax 
    ret 
openerror: 
    mov dx,offset errormsg 
    mov ah,9h 
    int 21h 
    ret 
endp openfile 
;---------------------------- 
;proc for writing msg to file 
;---------------------------- 
proc WriteToFile 
    mov ah,40 
    mov bx,[filehandle] 
    mov cx,28 
    mov dx,2 
    int 21h 
    ret 
endp WriteToFile 
start: 
    mov ax,@data 
    mov ds, ax 
;creating the seed 
    mov ah,00h ; 
    int 1Ah ; dx holds clock ticks since midnight 
    mov [word ptr seed],dx ;dx is the seed 
;generating key 
    mov di,2 
    mov ax,[seed] 
    call lcg 
;single letter to a single cell 
    xor ax,ax 
    xor cx,cx 
    xor bx,bx 
    xor si,si 
    xor di,di 
    mov bx,4 ;used for loop 
    mov cl,4 ;used for shl and shr 
skey: 
    shr [byte ptr gkey+di],cl ;gets single first letter from memory cell 
    mov al,[byte ptr gkey+di] ; 
    mov [byte ptr key+si],al ;moves single letter to a single memory cell 
    inc si 
    shl [byte ptr fkey+di],cl ; 
    shr [byte ptr fkey+di],cl ;gets single second letter from memory cell 
    mov al,[byte ptr fkey+di] ; 
    mov [byte ptr key+si],al ;moves single letter to a single memory cell 
    inc si 
    inc di 
    dec bx ;loop 
    cmp bx,0 ;loop 
    jne skey ;loop 
;input 
    call input 
;encrypting letters 
    xor si,si 
    xor ax,ax 
    xor cx,cx 
    xor di,di 
    mov cl,[1] 
encr: 
    mov al,[byte ptr key+di] ;moves first number of key to al 
    call enc ;encrypting 
    inc di 
    loop encr 
;openfile 
    call openfile 
;write msg to file 
    call WriteToFile 
exit: 
    mov ax, 4c00h 
    int 21h 
END start 

Это процедура я попробовал, и это хорошо работает в одиночку:

;KorenM 
IDEAL 
MODEL small 
STACK 100h 
DATASEG 
    buff db 'Hello' 
    filename db 'msg.txt',0 
    filehandle dw ? 
    errormsg db 'Error Opening File$' 
CODESEG 
proc openfile 
    mov ah,3Dh 
    mov al,2 
    mov dx,offset filename 
    int 21h 
    jc openerror 
    mov [filehandle],ax 
    ret 
openerror: 
    mov dx,offset errormsg 
    mov ah,9h 
    int 21h 
    ret 
endp openfile 
start: 
    mov ax, @data 
    mov ds, ax 
    call openfile 
exit: 
    mov ax, 4c00h 
    int 21h 
END start 

Спасибо за ваше время!

ответ

3

В общем случае, если подпрограмма работает, если вы вызываете ее самостоятельно, но не вставляете ее в поток выполнения, либо память, либо регистры будут сбиты где-то перед вызовом.

В вашем случае, в процедуре lcg вы пишете до mov [word ptr gkey+si],ax, не имея si.
A xor si, si перед тем, как цикл исправит это.
Обязательно запишите, что рутина clobber si или сохраните/восстановите.

Это может или не может сделать ваш код работоспособным, единственный безопасный способ заставить ваш код работать над ним с помощью отладчика (например, Turbo Debugger, он отлично работает для двоичных файлов DOS) и посмотреть, где и почему поведение программа отличается от ожидаемой.

+0

Спасибо! Кстати, я использую Turbo Debugger и не вижу проблемы, но я попробую ваше предложение, спасибо! –