程序集 8086 - 使用 int21h 函数 5Ah 创建一个随机命名的文件

Assembly 8086 - Using int21h function 5Ah to create a randomly named file

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

我的代码:

.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 中应该放什么。应该创建文件的文件夹的路径?不是应该默认创建在当前目录下吗?如果没有,我该怎么做?如上所示,用 '/' 试了一下。文档说了一些关于以 'backslash' + 13 字节结尾的路径以接收生成的文件名,但老实说我不知道​​那是什么意思。应该在代码中添加什么才能使函数正常工作?

DOS.CreateUniquelyNamedFile函数5Ah在指定目录中创建一个名称保证唯一的文件。即使您的文档谈到 以 'backslash' + 13 字节 结尾的路径,DOS 也只创建一个 8 个字符的文件名,如“BEAAAGDB”(无扩展名)。 'backslash' + 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 程序已经可以使用超出文件末尾的 space 作为未初始化的缓冲区 space,因此实际路径缓冲区扩展到该缓冲区。