2013-03-31 41 views
1

我在这里有一个TASM代码,并且在我再次运行程序时它不会追加新的字符串。我想感谢us2012帮助我达到这个“国家”。
在程序集中的文本文件末尾追加

; This example program creates a file and then writes to it. 
.model small 
.stack 

.data 
CR equ 13 
LF equ 10 

StartMessage DB "This program creates a file called NEW.TXT" 
     DB ,"on the C drive.$" 

EndMessage DB CR,LF,"File create OK, look at file to" 
     DB ,"be sure.$" 

WriteMessage DB "An error has occurred (WRITING)$" 
OpenMessage DB "An error has occurred (OPENING)$" 
CreateMessage DB "An error has occurred (CREATING)$" 

WriteMe DB "HELLO, THIS IS A TEST, HAS IT WORKED?",0 
FileName DB "new.txt",0 ; name of file to open 
Handle DW ? ; to store file handle 

.code 
START: 
mov ax,@data ; base address of data segment 
mov ds,ax ; put it in ds 
mov dx,offset StartMessage 
mov ah,09h 
int 21h 

mov si,offset FileName ; put offset of filename in dx 
xor cx,cx  ; clear cx - make ordinary file 
mov ah,6Ch  ; function 3Ch - create a file 
mov al, 0 
int 21h   ; call DOS service 
mov bx, Handle 
xor cx, cx 
xor dx, dx 
mov ah, 42h 
mov al, 02h 
int 21h 


jc CreateError  ; jump if there is an error 



mov si,offset FileName ; put offset of filename in dx 
mov al,2  ; access mode -read and write 
mov ah,3Dh  ; function 3Dh - open the file 
int 21h   ; call dos service 



jc OpenError  ; jump if there is an error 



mov Handle,ax  ; save value of handle 
mov bx, Handle 
xor cx, cx 
xor dx, dx 
mov ah, 42h 
mov al, 02h 
int 21h 



mov dx,offset WriteMe ; address of information to write 
mov bx,Handle  ; file handle for file 
mov cx,38  ; 38 bytes to be written 
mov ah,40h  ; function 40h - write to file 
int 21h   ; call dos service 

jc WriteError  ; jump if there is an error 
cmp ax,cx  ; was all the data written? 
jne WriteError  ; no it wasn't - error! 

mov bx,Handle  ; put file handle in bx 
mov ah,3Eh  ; function 3Eh - close a file 
int 21h   ; call dos service 

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

ReturnToDOS: 

mov ax,4C00h  ; terminate program 
int 21h 

WriteError: 
mov dx,offset WriteMessage 
jmp EndError 

OpenError: 
mov dx,offset OpenMessage 
jmp EndError 

CreateError: 
mov dx,offset CreateMessage 

EndError: 
mov ah,09h 
int 21h 
mov ax,4C01h 
int 21h 

END START 

如果我使用3Ch,该程序的作品,但它不附加到文件末尾。通过使用6Ch代替3Chthis说,它不会截断现有的文件,以零个字节,但每当我运行的代码,在那里创建该文件是一个错误(没有文件被创建)。请帮我修复代码。非常感谢你!

编辑2:

; This example program creates a file and then writes to it. 
.model small 
.stack 

.data 
CR equ 13 
LF equ 10 

StartMessage DB "This program creates a file called NEW.TXT" 
     DB ,"on the C drive.$" 

EndMessage DB CR,LF,"File create OK, look at file to" 
     DB ,"be sure.$" 

WriteMessage DB "An error has occurred (WRITING)$" 
OpenMessage DB "An error has occurred (OPENING)$" 
CreateMessage DB "An error has occurred (CREATING)$" 

WriteMe DB "HELLO, THIS IS A TEST, HAS IT WORKED?",0 
FileName DB "new3.txt",0 ; name of file to open 
Handle DW ? ; to store file handle 

.code 
START: 
mov ax,@data ; base address of data segment 
mov ds,ax ; put it in ds 
mov dx,offset StartMessage 
mov ah,09h 
int 21h 

mov si, offset FileName  ; put offset of filename in dx 
xor cx,cx  ; clear cx - make ordinary file 
mov ah,6Ch  ; function 3Ch - create a file 
mov bx, 3 
mov dx, 12h 
int 21h   ; call DOS service 

jc CreateError  ; jump if there is an error 

mov ah,3Eh  ; function 3Eh - close a file 
int 21h   ; call dos service 


mov dx, offset FileName  ; put offset of filename in dx 
mov al,2  ; access mode -read and write 
mov ah,3Dh  ; function 3Dh - open the file 
int 21h   ; call dos service 

jc OpenError  ; jump if there is an error 

mov Handle,ax  ; save value of handle 
mov bx, Handle 
xor cx, cx 
xor dx, dx 
mov ah, 42h 
mov al, 02h 
int 21h 

mov dx,offset WriteMe ; address of information to write 
mov bx,Handle  ; file handle for file 
mov cx,38  ; 38 bytes to be written 
mov ah,40h  ; function 40h - write to file 
int 21h   ; call dos service 

jc WriteError  ; jump if there is an error 
cmp ax,cx  ; was all the data written? 
jne WriteError  ; no it wasn't - error! 

mov bx,Handle  ; put file handle in bx 
mov ah,3Eh  ; function 3Eh - close a file 
int 21h   ; call dos service 

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

ReturnToDOS: 

mov ax,4C00h  ; terminate program 
int 21h 

WriteError: 
mov dx,offset WriteMessage 
jmp EndError 

OpenError: 
mov dx,offset OpenMessage 
jmp EndError 

CreateError: 
mov dx,offset CreateMessage 

EndError: 
mov ah,09h 
int 21h 
mov ax,4C01h 
int 21h 

END START 

回答

1

看这部分:

mov dx,offset FileName ; put offset of filename in dx 
xor cx,cx  ; clear cx - make ordinary file 
mov ah,6Ch  ; function 3Ch - create a file 
mov al, 0 
int 21h   ; call DOS service 

和在the relevant documentation

AX = 6C00h 
BL = open mode as in AL for normal open (see also AH=3Dh) 
... 
BH = flags 
... 
CX = create attribute (see #01769). 
DL = action if file exists/does not exist (see #01770). 
DH = 00h (reserved). 
DS:SI -> ASCIZ file name 

Return: 
CF set on error AX = error code (see #01680 at AH=59h/BX=0000h) 
CF clear if successful AX = file handle 
CX = status (see #01768) 

函数需要一个si d不是dx有文件名的偏移量。

你不设置bx

你不设置dx

您不检查错误。

您不保存文件句柄。

看这个部分:

mov bx, Handle 
xor cx, cx 
xor dx, dx 
mov ah, 42h 
mov al, 02h 
int 21h 

Handle在这一点上未初始化,因为你永远不会保存手柄扳到这个变量。

现在,这里:

mov dx,offset FileName ; put offset of filename in dx 
mov al,2  ; access mode -read and write 
mov ah,3Dh  ; function 3Dh - open the file 
int 21h   ; call dos service 

你试图再次打开打开的文件。您需要在开封前关闭它。或者,如果你有句柄,只要继续处理文件,不要关闭并重新打开它。

+0

谢谢,但老实说,我不明白这一点。我现在将BX设置为2(读/写访问模式)并将DX设置为3(文件存在行为)(http://stanislavs.org/helppc/int_21-6c.html)我用'DX'替换了'DX' 'SI'(在偏移量文件名中),但打开文件时出错。关于未被初始化的'Handle',我在'mov bx,Handle'之前放了一个'mov ax,Handle'。但是,仍然是错误。该程序实际上工作,如果我使用'3Ch'和问题是它不会追加。请帮助我,谢谢你。 –

+0

请参阅我的问题中的编辑。这就是我所做的,但是由于代码中的'jc'条件,它说创建时发生错误。 –

+0

我会设置'BX = 3'(读取+写入)而不是'BX = 2'(只读)。另外,'DX = 3'无效,它在表中没有列为有效值。试试'12H'。而且您还没有先关闭文件即可重新打开文件。 –