1. 背景
本文介绍了在元神操作系统中向U盘写文件的方法,示例所指的U盘是单一分区的、FAT32文件系统的盘。
2. 方法
(1)本例通过调用元神操作系统的API来向U盘写文件,写入U盘根目录下的文件“test.txt”的内容为预先存放在内存中的字符串“123456789”,该字符串有9个数字字符,代码如下所示:
use32
START:
pusha
call demo_write_usb_file
popa
iret
include 'api_def.inc'
OS_API equ 0x00030C16
API_PARAM equ 0x03000000
SEG_BASE equ 0x00040000
file_name_usb db 'u1:\test.txt',0
data_buf db '123456789'
demo_write_usb_file:
pusha
mov edi, API_PARAM
mov dword [fs:edi], API_WRITE_USB_FILE
mov dword [fs:edi+4], 3 ;3 parameters
xor eax, eax
mov ax, ds
add eax, SEG_BASE
mov bh,byte [fs:eax+7]
mov bl,byte [fs:eax+4]
shl ebx,16
mov bx,word [fs:eax+2]
mov eax, ebx
add ebx, file_name_usb
add eax, data_buf
mov dword [fs:edi+8], ebx ;parameter_1: file name
mov dword [fs:edi+12], eax ;parameter_2: start address of buffer to store result
mov dword [fs:edi+16], 9 ;parameter_3: file size in bytes
call pword [fs:OS_API]
popa
ret
代码中先对系统调用参数进行设置:第一个参数的API类型设置为API_WRITE_USB_FILE,表示写U盘文件;第二个参数设置为3,表示该API需要3个输入参数;第三个参数为要写的文件名称,传入的是绝对文件路径的起始地址;第四个参数为内存地址,存放要写入文件的内容,本例使用预定义的变量data_buf,存放要写入文件的内容“123456789”;第五个参数为文件内容的长度,以字节为单位,本例中设置为9,表示文件内容的长度为9个字节。
这里需要说明的是第三个参数,即文件名称。该名称为文件的绝对路径,路径中出现的子目录可以是已经存在的子目录,也可以是不存在的子目录,此时会自动创建子目录,换句话说,该API调用会自动创建路径中不存在的所有子目录,不需要保证路径中的所有子目录都事先建立好。另外,第四个参数可以为预定义的变量,也可以为动态申请的内存,但其中的内容都是以二进制表示的,不存在文本模式和二进制模式的区别。
设置好调用参数后通过call指令进行调用,将内容写入U盘文件。
本例中的API类型定义如下:
API_WRITE_USB_FILE equ 0x00000009
(2)运行程序
将上述代码保存为demo.asm文件,用FASM编译该文件生成二进制文件demo.bin,并将文件复制到装有元神操作系统的U盘的根目录,用该U盘启动进入元神操作系统,通过命令ZX执行该二进制文件,结果如下图所示:
程序运行前,先用CK命令查看U盘根目录下的文件,如图所示,U盘根目录下有3个文件,一个系统隐藏文件,一个元神操作系统文件hos.bin,一个应用软件文件demo.bin。
通过ZX命令执行上述示例程序后,再用CK命令查看U盘根目录,发现多了一个文件test.txt,该文件就是示例代码创建的。
再用DK命令打开该文件,发现该文件的内容为“123456789”,刚好是示例程序写入该文件的内容。至此,说明示例程序成功执行完成。
3. 总结
本文示例程序通过调用元神操作系统的API来向U盘写文件。文件名称以绝对路径的形式提供,包含着完整的路径,而且不要求路径中的所有子目录都是已经创建好的,对于不存在的子目录,该调用会自动创建。同样的,该调用所写的目标文件可以是已经存在的,也可以是事先不存在的,换句话说,该API调用可以用于修改文件,也可以用于新建文件。至于文件数据,则是以二进制形式存在和操作的,即二进制模式,没有文本模式。