Assembly 打开文件代码ax=3 |程序集x86时出错

Assembly 打开文件代码ax=3 |程序集x86时出错,assembly,x86,Assembly,X86,我正在处理一个加密项目,我想打开一个文件并在那里写入加密消息,但打开文件时出错。我试过运行同一个过程,它工作得很好,但当我用代码的其余部分运行它时,它会给我一个打开错误-进位标志亮起,ax=3。这是代码,很抱歉可能有点混乱: ;KorenM IDEAL MODEL small STACK 100h DATASEG ; -------------------------- ; Your variables here ; -------------------------- buff db

我正在处理一个加密项目,我想打开一个文件并在那里写入加密消息,但打开文件时出错。我试过运行同一个过程,它工作得很好,但当我用代码的其余部分运行它时,它会给我一个打开错误-进位标志亮起,ax=3。这是代码,很抱歉可能有点混乱:

;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

谢谢你的时间

通常,如果例程在单独调用时工作,但在插入执行流时不工作,则内存或寄存器会在调用之前的某个地方被阻塞

在您的情况下,在
lcg
例程中,您在未初始化
si的情况下向
mov[word ptr gkey+si]ax
写入数据。
循环前的异或si,si将解决此问题。
确保记录例行程序clobber
si
或保存/还原它


这可能会也可能不会使您的代码正常工作,使代码正常工作的唯一安全方法是使用调试器(例如,它在DOS二进制文件中工作得非常好)逐步调试代码,并查看程序行为偏离预期行为的位置和原因。

谢谢!顺便说一下,我使用了Turbo调试器,没有发现问题,但我会尝试你的建议,谢谢!