📄 haiwang.asm
字号:
.model small
.386
.stack 100h
;-----------------------------
.data
X dw ? ;在二进制到十进制转换过程中用来暂存商与余数的
Y dw ?
sign db 'C' ;用于存贮盘的逻辑符号
begin dw 01beh
err db 'There is a error1',0ah,0dh,'$'
w_r db 'There is a error2', 0ah, 0dh,'$'
fat12 db 'fat12' ; 分区系统格式
fat16 db 'fat16'
fat32 db 'fat32'
ntfs db 'NTFS'
logic dw 0,0 ;用来存储扩展分区的启示逻辑地址
result1 db 'Partion ' ;用来存储要输出的内容
result2 db 'Boot '
result3 db 'System '
result4 db 'Start(s) '
result5 db 'End(s) '
result6 db 'Sizes (MB) '
result7 db 0ah,0dh,'$'
buffer db 16,00,01,00 ;磁盘地址数据包
addr dw ?,?
sec dw 0,0,0,0
pa_tble db 512 dup(0) ;用来缓存分区表的内容
;-------------------------------
.code
main proc far
start:
push ds
sub ax,ax
push ax
;---------------------------
mov ax,@data
mov ds,ax
mov es,ax
;--------------------------------
lea ax,pa_tble
mov addr,ax
mov ax,ds
mov addr+2,ax
lea dx,result1
call print ; 输出内容
call clear ; 把result块清理成空格
A_again:
mov word ptr[sec],0
mov word ptr[sec+2],0 ; 把磁盘号存入栈
lea si,buffer
call cha_xun
lea bx,pa_tble
mov ax,0aa55h ;判断是否是分区表
cmp ax,word ptr [bx+01feh]
jnz error2
lea bx,pa_tble
add bx,begin
call chu_li ;从主分区表读入的信息
add begin,10h
cmp begin, 01feh
jz A_exit
jmp A_again
error2:
lea dx,err
call print
A_exit:
ret
main endp
;--------------------------------
chu_li proc near
mov ah,[bx+4] ;具体主分区信息处理
cmp ah,00
jz B_exit
cmp ah,0fh ;根据分区类型来判断是扩展分区,还是主分区
jz link_out
cmp ah,05h
jz link_out
mov al,sign
mov result1,al
inc sign ;输出盘符
mov ah,[bx]
lea si,result2
call bin_hex ;以十六进制输出分区状态
add bx,4
call lei_xing ;输出分区类型
add bx,4
call s_tata ;以十进制输出开始扇区与结束扇区及大小
lea dx,result1
call print
call clear
jmp B_exit
link_out: ;扩展分区出口
lea si,sec
lea di,logic
mov ax,word ptr[bx+8]
mov word ptr[si],ax
mov word ptr[di],ax
mov ax,word ptr[bx+10]
mov word ptr[si+2],ax
mov word ptr[di+2],ax
call link
B_exit:
ret
chu_li endp
;---------------------------------
link proc near
E_again:
lea si,buffer
call cha_xun
lea bx,pa_tble ; 扩展分区信息处理
mov ax,0aa55h
cmp ax,word ptr [bx+01feh]
jnz error3
call link_deal
cmp cx,'@@' ;如果cx='@@',则扩展分区结束
jnz E_again
ret
error3:
lea dx,w_r
call print
ret
;----------------------------------
link_deal proc near
lea bx,pa_tble ; 扩展分区具体处理
mov al,sign
mov result1,al
inc sign
add bx,01beh
mov ah,[bx]
lea si,result2
call bin_hex
add bx,4
call lei_xing
add bx,4
lea si,sec
mov ax,word ptr[si]
add word ptr[bx],ax
mov ax,word ptr[si+2] ;处理过程与主分区基本类似
adc word ptr[bx+2],ax
call s_tata
lea dx,result1
call print
call clear
mov cx,0
add bx,4
mov ah,[bx]
cmp ah,00
jnz E_exit
mov cx, '@@'
E_exit:
add bx,4
lea di,logic
mov ax,word ptr[bx] ;填好下个分区的起始绝对地址到磁盘地址数据包中
add ax,word ptr[di]
mov sec,ax
mov ax,word ptr[bx+2]
adc ax,word ptr[di+2]
mov sec+2,ax
ret
;------------------------------
cha_xun proc near
mov ah,42h
mov dl,80h
int 13h
ret
cha_xun endp
;----------------------------------
lei_xing proc near ;输出分区类型
mov ah,[bx]
cmp ah,01h
jz fat_12
cmp ah,04h
jz fat_16
cmp ah,06h
jz fat_16
cmp ah,0eh
jz fat_16
cmp ah,0bh
jz fat_32
cmp ah,1bh
jz fat_32
cmp ah,0ch
jz fat_32
cmp ah,1ch
jz fat_32
cmp ah,07h
jz nt_fs
jmp wrong
fat_12:
mov cx,5
lea di, result3
lea si,fat12
cld
rep movsb
jmp D_exit
fat_16:
mov cx,5
lea di,result3
lea si,fat16
cld
rep movsb
jmp D_exit
fat_32:
mov cx,5
lea di,result3
lea si,fat32
cld
rep movsb
jmp D_exit
nt_fs:
mov cx,4
lea di,result3
lea si,ntfs
cld
rep movsb
jmp D_exit
wrong:
lea dx,w_r
call print
D_exit:
ret
lei_xing endp
;--------------------------------
s_tata proc near ;处理分区的起始扇区与结束扇区及大小
mov ax,word ptr[bx]
mov dx,word ptr[bx+2]
lea si,result4
call bin_dec
add bx,4
mov ax,word ptr[bx]
mov dx,word ptr[bx+2]
mov cx,800h
div cx
mov dx,0
lea si,result6
call bin_dec
mov ax,[bx-4]
add [bx],ax
mov ax,[bx-2]
adc [bx+2],ax
mov ax,[bx]
mov dx,[bx+2]
lea si,result5
call bin_dec
add bx,4
ret
s_tata endp
;--------------------------------
bin_dec proc near
push bx
mov cx,10000
div cx ; 二进制到十进制的处理
mov X,dx
mov Y,ax ;将二字的数据除以10000,分为两段进行处理
mov bx,2
mov cx,10000
call dec_div
D_again:
mov cx,1000
call dec_div
mov cx,100
call dec_div
mov cx, 10
call dec_div
mov cx,1
call dec_div
mov ax,X
mov Y,ax
dec bx
jnz D_again
pop bx
ret
bin_dec endp
;-------------------------------
dec_div proc near
mov ax,Y
mov dx,0
div cx
mov Y,dx
add al,30h ; 做除法运算
mov [si],al
inc si
ret
dec_div endp
;--------------------------------
bin_hex proc near
push bx
mov bx,ax
mov ch,2 ; 二进制到十六进制的转换
B_again:
mov cl,4
rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl C_exit
add al,7h
C_exit:
mov [si],al
inc si
dec ch
jnz B_again
pop bx
ret
bin_hex endp
;-----------------------------
print proc near ; 输出程序
mov ah,09h
int 21h
ret
print endp
;---------------------------------
clear proc near
mov cx,72
lea di,result1
F_again:
mov byte ptr[di],' ' ; 把要输出的内容清成空格
inc di
dec cx
cmp cx,0
jnz F_again
ret
clear endp
;-------------------------------------
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -