Assembly 打开文件代码ax=3 |程序集x86时出错
我正在处理一个加密项目,我想打开一个文件并在那里写入加密消息,但打开文件时出错。我试过运行同一个过程,它工作得很好,但当我用代码的其余部分运行它时,它会给我一个打开错误-进位标志亮起,ax=3。这是代码,很抱歉可能有点混乱:Assembly 打开文件代码ax=3 |程序集x86时出错,assembly,x86,Assembly,X86,我正在处理一个加密项目,我想打开一个文件并在那里写入加密消息,但打开文件时出错。我试过运行同一个过程,它工作得很好,但当我用代码的其余部分运行它时,它会给我一个打开错误-进位标志亮起,ax=3。这是代码,很抱歉可能有点混乱: ;KorenM IDEAL MODEL small STACK 100h DATASEG ; -------------------------- ; Your variables here ; -------------------------- buff db
;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将解决此问题。
确保记录例行程序clobbersi
或保存/还原它
这可能会也可能不会使您的代码正常工作,使代码正常工作的唯一安全方法是使用调试器(例如,它在DOS二进制文件中工作得非常好)逐步调试代码,并查看程序行为偏离预期行为的位置和原因。谢谢!顺便说一下,我使用了Turbo调试器,没有发现问题,但我会尝试你的建议,谢谢!