如何使用TASM创建文本文件并向其中写入数据



我必须在汇编中编写程序(使用TASM进行编译),这将创建一个文本文件并将数据写入其中。它应该类似于包含用户活动信息的日志文件。

下面是一个小示例程序的代码,可以让您更好地理解我的意思。一旦程序运行,它应该创建一个文本文件,并在其中写入一条消息"程序开始工作"。如果用户按了"1"它会写一条消息"用户按下1";转换成文本文件。如果用户按"2";它会写"用户按下2";转换成文本文件。如果用户按下"3";它会写"程序完成它的工作";转换成文本文件。文本文件中的每条消息都应该从新的一行开始。
.model small
.data
msg_start db "Press 1 or 2",0dh, 0ah,"Press 3 to exit the program$"
msg_1 db "You pressed 1" ,0dh, 0ah,"Press any key to continue$"
msg_2 db "You pressed 2" ,0dh, 0ah,"Press any key to continue$"
.code
.startup

start:
;Clearing screen
MOV AH, 0 
MOV AL, 2 
INT 10H 

;Start message output
mov ax, seg msg_start
mov ds, ax
mov dx, offset msg_start
mov ah, 9h
int 21h

;Ask user to press the key
mov ah, 1h
int 21h

;Comparing pressed key
cmp al, 31h ;Pressed "1"
je label_1  ;Jump to "label_1"
cmp al, 32h ;Pressed "2"
je label_2  ;Jump to "label_2"
cmp al, 33h ;Pressed "3"
je label_3  ;Jump to "label_3"

jmp start ;Pressed any other key

label_1:
;Clearing screen
MOV AH, 0 
MOV AL, 2 
INT 10H 

;Message output
mov ax, seg msg_1
mov ds, ax
mov dx, offset msg_1
mov ah, 9h
int 21h

;Ask user to press the key
mov ah, 1h
int 21h
cmp al, 33h ;Pressed "3"
je label_3  ;Jump to "label_3"
jmp start ;Jumping to start label

label_2:

;Clearing screen
MOV AH, 0 
MOV AL, 2 
INT 10H 

;Message output
mov ax, seg msg_2
mov ds, ax
mov dx, offset msg_2
mov ah, 9h
int 21h

;Ask user to press the key
mov ah, 1h
int 21h
cmp al, 33h ;Pressed "3"
je label_3  ;Jump to "label_3"
jmp start ;Jumping to start label
label_3:
;Exit the program
mov ah, 4ch
mov al, 01
int 21h
end

当您想要处理文件时,您需要使用操作系统的一些服务。DOS函数由INT 21h提供。查找名称中带有FILE的函数(忘记过时的FCB文件函数)。

对磁盘文件的操作需要文件句柄,它是文件创建时由操作系统建立的内部对象标识符。句柄可以通过CREATE FILE

函数从DOS中获得。
.data
FileName DB "Rimanio.log",0
.text
MOV AH,3Ch  ; Function CREATE OR TRUNCATE FILE.
SUB CX,CX   ; 0=Normal file attributes.
MOV DX, OFFSET FileName ; Offset of file name.
INT 21h     ; Invoke DOS function. 
JC Error    ; Go to report if error occured.
MOV BX,AX   ; Save the handle to BX.

使用刚刚创建的文件的句柄可以很容易地向其写入字符串,使用write。写应该用CLOSE FILE结束,这将刷新写入文件的内容,并更新其大小、时间和其他属性。然后,您可以在控制台窗口中使用type Rimanio.log检查它。

最新更新