⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 haiwang.asm

📁 通过调用扩展int13
💻 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 + -