我正在尝试在MikeOS操作系统中设计和实现系统调用。该呼叫将通过MikeOS中的命令行界面(CLI)进行访问。我正在尝试进行系统调用INFO,该信息将显示所请求文件的信息(未格式化)(如果存在)。显示的信息包括
我应该在其中添加INFO的系统调用。我不知道该怎么做或从哪里开始。我在SERIAL中添加了内容,但找不到用于调用INFO或执行此操作的任何示例
obj[propName]
答案 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>。
您可以通过查看与您想做的事情相似的现有代码来学到很多东西