我的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
...全文
28 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫郢剑侠 2003-12-22
  • 打赏
  • 举报
回复
楼主可以看看MSDOS 6.0的源代码:

MS-Dos6.0源码大全
http://www.x86asm.com/xzzq/msdos60.zip
ues 2003-12-20
  • 打赏
  • 举报
回复
我不想用INT 21H
谢谢,只不过调试的时候用
dunkel 2003-12-20
  • 打赏
  • 举报
回复
不是吧? DIR 还是用 int21h(AH=4eh/4fh) 功能调用比较方便吧? 用磁盘直接读写比较繁琐的唉.

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧