对请求文件的INFO的系统调用(如果存在)

时间:2019-07-14 20:14:26

标签: assembly operating-system x86-16

我正在尝试在MikeOS操作系统中设计和实现系统调用。该呼叫将通过MikeOS中的命令行界面(CLI)进行访问。我正在尝试进行系统调用INFO,该信息将显示所请求文件的信息(未格式化)(如果存在)。显示的信息包括

  • 属性字节。
  • 创建时间。
  • 创建日期
  • 最后访问日期
  • 最后写入时间
  • 文件大小(以字节为单位)

我应该在其中添加INFO的系统调用。我不知道该怎么做或从哪里开始。我在SERIAL中添加了内容,但找不到用于调用INFO或执行此操作的任何示例

源代码

obj[propName]

1 个答案:

答案 0 :(得分:2)

通过查看Mike如何执行 os_get_file_size api调用,您可以轻松完成此操作。
对于您的任务,您不仅要返回BX中的FileSize,还要返回您选择的任何其他寄存器中的其他信息。
可能是这样的选择:

AL = Attribute byte.
CX = Creation Time.
DX = Creation Date
SI = Last Access Date
DI = Last Write Time
BX = File size in bytes

; --------------------------------------------------------------------------
; os_get_file_size -- Get file size information for specified file
; IN: AX = filename; OUT: BX = file size in bytes (up to 64K)
; or carry set if file not found

os_get_file_size:
    pusha
    call os_string_uppercase
    call int_filename_convert
    clc
    push ax
    call disk_read_root_dir
    jc .failure
    pop ax
    mov di, disk_buffer
    call disk_get_root_entry
    jc .failure
    mov word bx, [di+28]        <<<<< FileSize
    mov word [.tmp], bx
    popa
    mov word bx, [.tmp]
    ret
.failure:
    popa
    stc
    ret
.tmp    dw 0

所有这些信息都存储在这里。现在,您可以看到Mike从何处得到mov word bx, [di+28]

byte [di+11], 0     ; Attributes             AL
byte [di+12], 0     ; Reserved
byte [di+13], 0     ; Reserved
byte [di+14], 0C6h  ; Creation time         \CX
byte [di+15], 07Eh  ; Creation time         /
byte [di+16], 0     ; Creation date         \DX
byte [di+17], 0     ; Creation date         /
byte [di+18], 0     ; Last access date      \SI
byte [di+19], 0     ; Last access date      /
byte [di+20], 0     ; Ignore in FAT12
byte [di+21], 0     ; Ignore in FAT12
byte [di+22], 0C6h  ; Last write time       \DI
byte [di+23], 07Eh  ; Last write time       /
byte [di+24], 0     ; Last write date
byte [di+25], 0     ; Last write date
byte [di+26], 0     ; First logical cluster
byte [di+27], 0     ; First logical cluster
byte [di+28], 0     ; File size              \BX
byte [di+29], 0     ; File size              /
byte [di+30], 0     ; File size
byte [di+31], 0     ; File size

如果要从命令行显示所有这些信息,则就像使用编写的SERIAL命令一样,您将必须将返回的寄存器中的数字转换为文本,a -蛋糕!

此外,如果将代码添加到 DISK.ASM 并更新 KERNEL.ASM os_call_vectors 表,则您的代码可以成为api的扩展。 / em>。

您可以通过查看与您想做的事情相似的现有代码来学到很多东西