2017-03-20 53 views
0

當我運行代碼:彙編器(ASM)不能讀取文件

;-------------------MACRO----------------- 
println MACRO info 
    push ax 
    push dx 

    mov ah, 09h 
    mov dx, offset info 
    int 21h 

    ;print new line 
    mov dl, 10 
    mov ah, 02h 
    int 21h 

    mov dl, 13 
    mov ah, 02h 
    int 21h 

    pop dx 
    pop ax 
ENDM 
;-----------------end macro---------------- 
.model small 

.stack 100h 

.data 
sourcePath db "C:\Files\lab5\text.txt" 

sourceID dw 0 

maxWordSize equ 50 
buffer db maxWordSize + 2 dup(0) 

startText db "Program is started", '$' 
badSourceText db "Cannot open source file", '$' 
fileNotFoundText db "File not found", '$' 
errorClosingSource db "Cannot close source file", '$' 
errorClosingDest db "Cannot close destination file", '$' 
endText db "Program is ended", '$' 
errorReadSourceText db "Error reading from source file", '$' 
errorWritingDestText db "Error writing to destination file", '$' 

.code 

main: 
    mov ax, @data 
    mov es, ax 
    mov ds, ax 

    println startText 

    call openFiles 
    cmp ax, 0 
    jne endMain    ;we have some error 

    call processingFile 
    cmp ax, 0 
    jne endMain    ;we have some error 

    call closeFiles 
    cmp ax, 0 
    jne endMain    ;we have some error 

endMain: 
    ;exit 
    println endText 

    mov ah, 4Ch 
    int 21h 

;Result in ax: 0 if all is good, else not 
openFiles PROC 
    push bx dx 

    ;open source 
    mov ah, 3Dh   ;open source file 
    mov al, 21h   ;readonly, block write, other cannot write 
    mov dx, offset sourcePath 
    mov cx, 01h 
    int 21h 

    jb badOpenSource ;works when cf = 1 

    mov sourceID, ax ;save file ID 

    mov ax, 0   ;return value 
    jmp endOpenProc  ;all is good 

badOpenSource: 
    println badSourceText 
    cmp ax, 02h 
    jne errorFound 

    println fileNotFoundText 

errorFound: 
    mov ax, 1 
endOpenProc: 
    pop dx bx 
    ret 
ENDP 

;macro help processing 

;bx - file ID 
resetPosInFileToStart MACRO 
    push ax bx cx dx 

    mov ah, 42h 
    xor al ,al   ;mov al, 0 - from file start 
    xor cx, cx 
    xor dx, dx 
    int 21h 

    pop dx cx bx ax 
ENDM 
;end macro help 

processingFile PROC 
    push ax bx cx dx si di 

    mov bx, sourceID 
    resetPosInFileToStart 

    call readFromFile 
    cmp ax, 0 
    je finishProcessing 

    mov si, offset buffer 
    mov di, offset buffer 
    mov cx, ax     ;save num of symbols in buffer 
    xor dx, dx 

finishProcessing: 
    pop di si dx cx bx ax 
    ret 
ENDP 

;Result in ax: 0 if all is good, else not 
closeFiles PROC 
    push bx cx 

    xor cx, cx 

    mov ah, 3Eh 
    mov bx, sourceID 
    int 21h 

    jnb goodCloseOfSource  ;cf = 0 

    println errorClosingSource 
    inc cx   ;now it is a counter of errors 

goodCloseOfSource: 
    mov ax, cx  ;save number of errors 

    pop cx bx 
    ret 
ENDP 

;reads to buffer maxWordSize symbols 
;RES: ax - how much symbols we read 
readFromFile PROC 
    push bx cx dx 

    mov ah, 3Fh 
    mov bx, sourceID 
    mov cx, maxWordSize 
    mov dx, offset buffer 
    int 21h 

    jnb goodRead     ;cf = 0 - we read file 

    println errorReadSourceText 
    mov ax, 0 

goodRead: 
    pop dx cx bx 
    ret 
ENDP 

end main 

我有一個輸出:

程序啓動
錯誤從源文件讀取
程序結束

text.txt內容:

Aenean ut scelerisque lacus,at aliquam ipsum。 Aenean et tincidunt felis。在布蘭迪特懸浮volutpat aliquam陰道。整枝lig conse conse conse,inter inter inter inter inter,,,,,,,ve ve ve整數rhoncus quis felis et maximus。普通的調味品精英。 Nullam一個molestie ligula。

我想要看這個文件。
編譯器:帶有DOSBox的TASM 16位(以及帶有TASM的FreeDOS)。
操作系統:Windows 10 x64(VirtualBox上的FreeDOS v1.2)。

爲什麼它不起作用?

更新
錯誤代碼:我在DOS 3FH(INT 21H)
CF = 1,AL = 05H(拒絕訪問)錯誤。 但文件是免費的。

+0

檢查錯誤代碼。另外,使用調試器。 – Jester

+0

查看更新。調試器告訴我,我只有一個錯誤05h – AJIOB

+0

Jose正在尋找合適的地方。您以只寫方式打開文件,然後嘗試從中讀取文件。你需要'20h'而不是'21h'。 – Jester

回答

0

由於Jose Manuel Abarca Rodríguez說,然後刪除回答:

有兩種打開文件時,三個可能的值:

0 = read only. 
1 = write only. 
2 = read/write. 

但在你的代碼與值21H打開文件

;結果in ax:0如果一切正常,否則不打開文件PROC push bx push dx

;open source 
mov ah, 3Dh   ;open source file 
mov al, 21h   ;readonly, block write, other cannot write ◄■■██ As !!! 
mov dx, offset sourcePath 
mov cx, 01h 
int 21h 

jb badOpenSource ;works when cf = 1 

替換21H 0,1或2:

MOV人,0

它確實有效。謝謝

+0

是的,他的觀點是'21h'無效,但它是。這對你的目的來說是錯誤的,因爲這意味着獨佔寫入權限。 – Jester

+0

@Jester,就夠了:) –

+1

是的先生,對不起先生:D – Jester