首页 > 解决方案 > 程序集 8086 - 使用 int21h 函数 5Ah 创建一个随机命名的文件

问题描述

正如标题所暗示的,我想使用这个函数来生成一个随机的、唯一的文件名。

我的代码:

.model tiny
.code

ORG 100H

HOST:

MOV AH, 5Ah
XOR CX, CX
MOV DX, OFFSET HI
int 21h;

MOV BX, DX

mov ax,4c00h
    int 21h
    
mov ah,9
mov dx, OFFSET BX
int 21h
HI DW '\'

END HOST



END

这是函数的文档->

问题是,我不明白应该放入什么DX。应在其中创建文件的文件夹的路径?不应该在当前目录下默认创建吗?如果没有,我该怎么做?如上所示,使用“/”进行了尝试。文档说明了以“反斜杠”+ 13 个字节结尾的路径以接收生成的文件名,但老实说,我不知道这应该是什么意思。应该在代码中添加什么以使该功能起作用?

标签: assemblydosx86-16temporary-files

解决方案


DOS.CreateUniquelyNamedFile 函数 5Ah 在指定目录中创建一个具有保证唯一名称的文件。即使您的文档提到以 'backslash' + 13 bytes 结尾的路径,DOS 也会创建一个 8 个字符的文件名,如“BEAAAGDB”(无扩展名)。'反斜杠' + 9 个字节就足够了。当然,如果你想安全起见,那么只需分配所有 13 个字节。

要在特定目录中创建,请使用例如db '\DOS\TEMP\', 9 dup (0).
要在当前目录中创建,请使用db '.\', 9 dup (0).
要在父目录中创建,请使用db '..\', 9 dup (0).
要在根目录中创建,请使用db '\', 9 dup (0)db 10 dup (0)

.model tiny
.code

ORG 100h

HOST:
      mov dx, offset TFile
      xor cx, cx            ; Attribute NORMAL
      mov ah, 5Ah           ; DOS.CreateUniquelyNamedFile
      int 21h               ; -> AX CF

      ; Because we exit immediately, there's no need to check the CF for failure
      ; nor do we need to 'close' the file (Terminate does that for us)

      mov ax, 4C00h         ; DOS.Terminate
      int 21h

TFile db '.\', 0
    ; db 12 dup(?)     ; implicit at the end of a .COM file

END HOST

TFile是这个 .COM 程序中的最后一项。所以在这种情况下,不需要使用超过一个零字节作为 DOS 将从该缓冲区读取的隐式长度 C 字符串的终止符。

.COM 程序已经可以将文件末尾以外的空间用作未初始化的缓冲区空间,因此实际的路径缓冲区会扩展到该空间。


推荐阅读