【发布时间】:2020-04-24 01:30:20
【问题描述】:
下面的代码是一个程序,它试图列出位于 FAT12 格式磁盘中的文件。
根据我的基本理解,我知道要找到一个文件,您需要首先查看位于物理磁盘第 19 个扇区的根目录。此根目录大小为 14 个扇区。
我已经采取了某种例程来列出 FAT12 中的文件:
步骤 1: 准备一个内存位置来加载根的每个扇区 位置 0x0:0x1000 的目录
第 2 步: 确定根目录的大小 - 我使用的公式 *Root_Directory_Size = (每个条目的大小 * 总数 条目)/扇区大小*
第三步:找出根目录的起始扇区号 使用以下公式 = *(脂肪数量 * 每个的大小 fat) + 保留扇区 + 隐藏扇区*
第四步:计算出上述偏移量后,程序开始 将每个扇区加载到位置 0x0:0x1000,在每个条目中 程序检查每个条目中的以下第一个字节 空条目(0xe5)和 0x00 这个字节表示根 条目为空或包含已删除的文件
所以这里的挑战是在完成所有这些事情之后,我的屏幕上没有现有文件的偶数字符。
;This is a basic program which reads files on FAT12 and displays their names on the screen:
;This program is loaded into RAM by a bootloader not
;bios which I have managed to accomplish
[org 0x00]
[bits 16]
mov ax, 0x2000
mov ds, ax
mov es, ax
;since we ve been loaded by bootloader into memory obviously the value of dl which normally contains
;drive letter has been altered by bootloader program will skip this routine
;and assume that our first boot drive is byte 0x80
;mov [drive_letter], dl
mov bx, file_name
mov si, bx ; since bx points to the first entry of the root directory which contains the name of the file
mov di, buffer ; the location of root directory entry
add di, [next_section]
mov cx, 11 ; string length
cld
rep movsb
mov dx, buffer
mov cx, 14
call print_string
mov ah, 8 ; read disk parameter
mov dl, [drive_letter]
int 13h
jc read_error
and cx, 3fh
mov [SectorsPerTrack], cx
movzx dx, dh ; high word has been zeroed out
add dx, 1
mov [Head], dx
xor ax, ax
mov dl, [drive_letter]
int 13h
jc read_error
;#calculating the root start
mov ax, 19 ; root directory logical block begins at 19th sector
mov [root_start], ax ; now we have the starting sector of the root directory
;#load root director entry into memory sector by sector
mov cx, 14
mov ax, [root_start]
mov bx, 0x3000
mov es, bx
xor bx, bx
read_next_sector:
push cx
push ax ; store lba address in the stack
xor bx, bx
call read_sectors
read_next_entry:
mov si, bx ; since bx points to the first entry of the root directory which contains the name of the file
mov di, buffer ; the location of root directory entry
add di, [next_section]
mov cx, 11 ; string length
cld
rep movsb
push bx
mov bx, [next_section]
add bx, 11
mov [next_section], bx
pop bx
add bx, 32 ; point to the next entry
cmp bx, 512 ; have we exceeded the sector size if yes excute the code below
jne read_next_entry
pop ax ; retrive the current logical address from the stack
pop cx ; retrive count from the stack
inc ax ; load next sector when we loop back again
loop read_next_sector
mov ah, 0x0e
xor bh, bh
mov al, 'L'
int 10h
mov dx, buffer
mov cx, 1000
call print_string
jmp $
print_string:
push cx
out_char:
mov ah, 0x0e
mov bx, dx
mov al, [bx]
xor bh, bh
int 10h
inc dx
pop cx
loop print_string
ret
file_found:
mov ah, 0x0e
xor bh, bh
mov al, 'Z'
int 10h
hlt
jmp $
read_error:
mov ah, 0x0e
xor bh, bh
mov al, 'R'
int 10h
xor ah, ah
int 16h
int 19h
hlt
jmp $
read_sectors:
push ax
push bx
xor dx, dx
mov bx, [SectorsPerTrack]; sectors per track
div bx
inc dx
mov cl, dl
xor dx, dx
mov bx, [Head] ; number of heads
div bx
mov ch, al
xchg dl, dh
;call other function routines
mov ah, 2
mov al, 1
pop bx
mov dl, [drive_letter]
int 13h
jc read_error
pop ax ; restore logical block address before exiting the read_sector routine
ret
drive_letter db 0x80
SectorsPerTrack dw 0
Head dw 0
root_size dw 14
root_start dw 0
next_section dw 0
file_name db 'KERNEL BIN', 0
buffer db 'No file found', 0
buffer1 times 1000 db 0
times 1024 db 0
【问题讨论】:
-
Edit 包含您遇到的问题的详细信息的问题。