2016-12-21 104 views
0

即时尝试使用int 21h啊是40h,但我似乎无法得到它的工作,当我打开我的文件后,程序关闭它只是不写在它并没有输出....任何想法,为什么发生这种情况?我在该行一个侧面说明从该代码中的bug了,之前它工作完全正常.....当ah = 40h时使用int 21h没有实际的输出

;multi-segment executable file template. 

.model small 
assume cs: code, ds: data 
data segment 
player db 0 
startText1 db "Hello and welcome to 'Submarines'" 
startText2 db "Please enter a game code 5 characters long" 
streamRead db 7 dup(0) 
fileName db 6 dup (0) 
fileOpenError1 db "1 invalid funtion number" 
fileOpenError2 db "Game not found, you're the host...." 
fileOpenError3 db "3 path not found" 
fileOpenError4 db "4 all available handles in use" 
fileOpenError5 db "5 access denied" 
fileOpenError6 db "6 invalid file handler" 
fileOpenSucs db "Succsessfully joined game!" 
fileHandler dw ? 
readInfo db 405 dup(0) 
writeInfo db 405 dup(0) 
errors db "error ",'$' ;; 
data ends 

.stack 

code segment 

start: 
; set segment registers: 
mov ax, data 
mov ds, ax 
mov es, ax 
;;end of setting registers 

call xorAll;; clearing all registers 

call newScreen ;;setting up a screen for start screen 640x200 
call borderOfScreen 

;; start screen text: 
mov bp, offset startText1 
mov bl,0Eh 
mov dx,0218h 
mov cx,33 
call colorTextDisplay 
mov bp, offset startText2 
mov bl,0Eh 
mov dx,0412h 
mov cx,42 
call colorTextDisplay 
;; end of start screen text 
;; start reading file name and working with playerity 
call xorAll 
mov streamRead,6 
mov dx, offset streamRead 
mov ah, 0Ah 
int 21h 
call preapreFileName 
call openFile;; error is handled inside the open file code 
;; players are set and messages have been sent 

mov cx,1 
mov writeInfo,'1' 
call writeBytes; when i use this the first byte of my file doesnt change to 1...... 
mov cx,1 
call readBytes;l;; and this ready method doesnt work, btw there is no error output 
mov dl,readInfo 
mov ah,2 
int 21h 
call closeFile 



call terminate 




;; procedures: 
proc terminate 
mov ax, 4c00h 
int 21h 
ret 
endp terminate 

proc showErrorMsg 
mov ah,09 
mov dx, offset errors 
int 21h 
ret 
endp showErrorMsg 

proc preapreFileName 
mov cx,5 
mov bx,offset streamRead 
add bx,2 

loopFileName: 
    push [bx] 
    inc bx 
    loop loopFileName 

mov cx,5 
mov bx,offset fileName 
add bx,4 
loopFileName1: 
    pop ax 
    mov [bx],al 
    dec bx 
    loop loopFileName1 
add bx,6 
mov [bx],0 
ret 
endp preapreFileName 

proc delay 
mov dx,0FFFFh 
startBig: 
    dec dx 
    mov ax,1 
    mov ax,2 
    mov ax,3 
    cmp dx,0 
    jne startBig 
ret 
endp delay 


proc newScreen ;;640x200 ;; debugging use 3 
mov ax, 000Eh 
int 10h 
ret 
endp newScreen 

proc colorTextDisplay;; BL is color as BACK|FORE BP is offset of text DX is as ROW|COL CX is length of string 
mov ah, 13h 
mov al ,01 
mov bh,0 
int 10h 
ret 
endp colorTextDisplay 

proc createFile 
mov ah, 13h 
mov al, 01 
mov bh, 0 
mov bl,02h 
mov dx, 0615h 
int 10h 
call xorAll 
mov ah,3Ch 
mov cl,2 
mov dx, offset fileName 
int 21h 
mov fileHandler, ax 
mov player,1 
ret 
endp createFile 

proc borderOfScreen 
call xorAll 
mov bh,0 
mov ah,0Ch 
mov al,0Eh 
mov cx,639 
mov dx,199 
rightSide: 
    int 10h 
    dec dx 
    cmp dx,0 
    jne rightSide 
topSide: 
    int 10h 
    dec cx 
    cmp cx,0 
    jne topSide 
leftSide: 
    int 10h 
    inc dx 
    cmp dx,199 
    jne leftSide 
botSide: 
    int 10h 
    inc cx 
    cmp cx,639 
    jne botSide 
mov cx,638 
mov dx,198 
rightSide1: 
    int 10h 
    dec dx 
    cmp dx,1 
    jne rightSide1 
topSide1: 
    int 10h 
    dec cx 
    cmp cx,1 
    jne topSide1 
leftSide1: 
    int 10h 
    inc dx 
    cmp dx,198 
    jne leftSide1 
botSide1: 
    int 10h 
    inc cx 
    cmp cx,638 
    jne botSide1 
ret 
endp borderOfScreen 

proc openFile 
call xorAll 
mov ah,3Dh 
mov al,2 
mov dx, offset fileName 
int 21h 
jc error 
mov fileHandler, ax;; if there arent any errors display message: 
mov player,2 
mov bp, offset fileOpenSucs 
mov ah, 13h 
mov cx, 26 
mov al, 01 
mov bh, 0 
mov bl,02h 
mov dx, 0615h 
;;end of message display 
int 10h 
jmp noError1 
error: 
call displayError 
noError1: 
ret 
endp openFile 

proc closeFile 
call xorAll 
mov ah,10h 
mov bx, fileHandler 
int 21h 
ret 
endp closeFile 

proc failOpenFile 
mov ah, 13h 
mov al, 01 
mov bh, 0 
mov bl,04h 
mov dx, 0615h 
int 10h 
ret 
endp failOpenFile 

proc xorAll 
xor ax,ax 
xor bx,bx 
xor cx,cx 
xor dx,dx 
ret 
endp xorAll 

proc waitForClick 
mov ah,0 
int 16h 
ret 
endp waitForClick 

proc readBytes;; cl is bytes to read 
call xorAll 
mov ah,3Fh 
mov bx,fileHandler 
mov dx,offset readInfo 
int 21h 
jc error 
ret 
endp readBytes 

proc writeBytes;; cl is bytes to read 
call xorAll 
mov ah,40h 
mov bx,fileHandler 
mov dx,offset writeInfo 
int 21h 
jc error 
ret 
endp writeBytes 

proc displayError 
mov fileHandler, ax 

cmp fileHandler,1 
    je error1 
cmp fileHandler,2 
    je error2 
cmp fileHandler,3 
    je error3 
cmp fileHandler,4 
    je error5 
cmp fileHandler,6 
    je error6 
error1: 
    mov bp, offset fileOpenError1 
    mov cx, 24 
    call failOpenFile 
    ret 
error2: 
    mov bp, offset fileOpenError2 
    mov cx,35 
    call createFile 
    ret 
error3: 
    mov bp, offset fileOpenError3 
    mov cx,16 
    call failOpenFile 
    ret 
error4: 
    mov bp, offset fileOpenError4 
    mov cx,30 
    call failOpenFile 
    ret 
error5: 
    mov bp, offset fileOpenError5 
    mov cx,15 
    call failOpenFile 
    ret 
error6: 
    mov bp, offset fileOpenError6 
    mov cx,22 
    call failOpenFile 
    ret 
endp displayError 

;; end of procedures. 


code ends 

end start ; set entry point and stop the assembler. 

回答

3

这是你如何写入文件:

mov cx,1 
mov writeInfo,'1' 
call writeBytes; when i use this the first byte of my file doesnt change to 1...... 

一切看起来不错:字符串'1'是在变量writeInfo,并且cx1,所以一个字符应该被写入文件,但这是writeBytes

proc writeBytes;; cl is bytes to read 
call xorAll    ;◄■■ CX IS ZERO !!! 
mov ah,40h 
mov bx,fileHandler 
mov dx,offset writeInfo 
int 21h 
jc error 
ret 
endp writeBytes 

cx为零(xor cx,cx),这就是为什么零字节正在写入文件。请删除call xorAll

顺便说一句,我发现了另一个错误:

proc closeFile 
call xorAll 
mov ah,10h   ;◄■■ THIS VALUE SHOULD BE 3EH. 
mov bx, fileHandler 
int 21h 
ret 
endp closeFile 
+0

感谢的人,就这样恼人的调试代码 –