我的DIR命令
ues 2003-12-20 09:34:10 ;我自己写了一个DIR命令,程序如下,不知道为什么不行
;暂时只要显示A盘的根目录下的内容
;高手帮帮忙!!!!
sseg segment
dw 100 dup(0)
sseg ends
data segment
bpb db 0bh dup(0)
Ssize dw 200h ;0 ;每扇区字节数(bytes/per sector)
SperC db 1 ;0 ;每簇扇区数
SNR dw 1 ;0 ;保留扇区数
noFAT db 2 ;0 ;FAT表总数
MnoRoot dw 0ffh ;0 ;根目录最大目录项数
dw 0 ;逻辑卷中总扇区数
db 0 ;介质描述字节
FATsize dw 9 ;0 ;每张FAT表占扇区数
Sectors dw 12h ;0 ;每道扇区数
Heads dw 2 ;0 ;磁头数
hidden dw 0 ;0 ;隐含扇区
;tmp equ
db 500 dup(0)
buffer db 2000h dup(0)
dirsize dw 32 ;目录项大小(B)
data ends
code segment
assume cs:code,es:data,ds:code,ss:sseg
start proc near
mov ax,data
mov ds,ax
mov es,ax
lea bx,Ssize ;ES:BX=内存地址
;mov dx,0 ;磁头 物理驱动器号
;mov cx,0001h ;磁道 起始扇区号
;mov ax,0201h ;功能号 扇区数
;int 13h ;读第一扇区
call display;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;读FDT
mov al,[bx+5] ;FAT表个数
xor ah,ah
call display;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mul FATsize ;乘表大小
add ax,hidden ;
add ax,SNR ;
call display;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;现在AX=根目录起始逻辑扇区号
call LS_pha ;逻辑扇区转为物理扇区
push dx
;push ax
mov ax,MnoRoot ;最大根目录项
mul dirsize ;根目录大小dx:ax
div Ssize ;根目录占扇区数
cmp dx,0
jz next1
inc ax
;现在ax(al)中为根目录占扇区数
call display;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
next1: pop dx
mov ah,02
lea bx,buffer ;缓冲区
;mov cx,0001h
int 13h
mov cx,MnoRoot ;最大根目录项 作循环条件
mov si,bx
next2: cmp byte ptr[si+11],0fh
jz next3 ;是长文件名目录项,转
cmp byte ptr[si],0
jz next3 ;目录项为空
call dir
next3: add si,32
loop next2
mov dx,2020h
mov ah,02h
int 21h
mov ax,4c00
int 21h
ret
start endp
;显示文件名
;入口:si=目录项首地址
dir proc
push si
push ax
push bx
push cx
push dx
mov dx,11 ;文件名长11Byte
next4: stosb
dec dx
jz exit1
cmp al,20h
jb next4
cmp al,7eh
ja next4
mov ah,0eh
int 10
jmp next4
exit1: pop dx
pop cx
pop bx
pop ax
pop si
ret
dir endp
;将逻辑扇区转换为物理扇区
;入口:AX=逻辑扇区,BX=BPB首址
;出口:DH=磁头号,CL=扇区号,CH=磁道号
LS_pha proc
push ax
mov ax,[bx+0dh] ;每首扇区数
mul word ptr[bx+0fh];乘每簇扇区数
mov cx,ax ;DX=0
pop ax
mul dx
div cx ;CL=磁道号
mov ch,al
mov ax,dx ;余数
xor dx,dx
div word ptr[bx+0dh]
mov cl,dl
inc cl ;扇区号
mov dh,al ;磁头号
ret
LS_pha endp
display proc near ;输出AX中的十六进制数
push ax
push bx
push cx
push dx
mov bx,ax
mov ch,4 ;输出数含16进制位数
redo3: mov cl,4
rol bx,cl ;循环左移,高四位进入低四位
mov al,bl
and al,0fh ;取4位二进数
or al,30h ;转为ASCII码
cmp al,3ah
jl printf
add al,07h
printf:mov dl,al
mov ah,02h
int 21h ;输出一位十六进制数
dec ch
jnz redo3
pop dx
pop cx
pop bx
pop ax
ret
display endp
code ends
end start