當我運行代碼:彙編器(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(拒絕訪問)錯誤。 但文件是免費的。
檢查錯誤代碼。另外,使用調試器。 – Jester
查看更新。調試器告訴我,我只有一個錯誤05h – AJIOB
Jose正在尋找合適的地方。您以只寫方式打開文件,然後嘗試從中讀取文件。你需要'20h'而不是'21h'。 – Jester