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

📄 phydisk9x.asm

📁 windows下汇编语言 学习汇编语言好助手
💻 ASM
字号:
;*****************************
;文件:PhyDisk9X.ASM         *
;功能:Win9x下读物理盘       *
;      硬盘不适用            *
;*****************************
.386p
.model flat,stdcall	;平坦内存模式
;外部过程声明
extrn MessageBoxA:proc	
extrn ExitProcess:proc
extrn CreateFileA:proc
extrn DeviceIoControl:proc
extrn CloseHandle:proc

;常量定义
NULL  = 0
MB_OK = 0
INVALID_HANDLE_VALUE = -1
FILE_FLAG_DELETE_ON_CLOSE    =   04000000H

VWIN32_DIOC_DOS_INT13 = 4

DIOC_REGISTERS	STRUC
    reg_EBX  dd ?
    reg_EDX  dd ?
    reg_ECX  dd ?
    reg_EAX  dd ?
    reg_EDI  dd ?
    reg_ESI  dd ?
    reg_Flags  dd ?
ENDS

.data 
	FileName db '\\.\vwin32',0
	align 4				;双字对齐
	Buffer  db 4096 dup (0)
	hFile	dd 0
	drs_in	DIOC_REGISTERS<>
	drs_out	DIOC_REGISTERS<>
	readed	dd 0
	
	Caption		db 'Windows 9x中读写物理磁盘',0
	ErrCreate	db '建文件错!',0
	ErrRead		db '读盘错误!',0

	ShowText	db 4096*3 dup (0)
	Digit		db '0123456789ABCDEF'

.code
main proc
	;取vwin32句柄
	call CreateFileA,offset FileName,0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL
	mov  [hFile],eax
	cmp  eax,INVALID_HANDLE_VALUE
	jnz  read
	;显示错误信息
	call ShowError,offset ErrCreate
read:	;读数据
	mov drs_in.reg_EAX,201H		;Int 13参数
	mov drs_in.reg_EBX,offset Buffer
	mov drs_in.reg_ECX,1
	mov drs_in.reg_EDX,0		;只能是:0-A盘,1-B盘
	
	call DeviceIoControl,hFile,VWIN32_DIOC_DOS_INT13,\
						offset drs_in,size drs_in,\
						offset drs_out,size drs_out,	\
						offset readed,0;
	cmp  eax,0
	jnz  show
	;显示错误信息
	call ShowError,offset ErrRead	
show:	;显示读出的内容
	mov readed,512
	call ShowBuffer
	;关闭文件句柄
	call CloseHandle ,[hFile]
	;退出
	call ExitProcess,0
main endp	
	
ShowError proc ,MESSAGE:DWORD		;显示出错信息并退出
	call MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK
	cmp  [hFile],0
	jz   endShowErr
	call CloseHandle ,[hFile]	;关闭句柄
endShowErr:
	call ExitProcess,0		;退出
ShowError endp

ShowBuffer proc				;显示所读出的信息
	;把数据转换成16进制的形式
	mov  esi,offset Buffer		;数据
	mov  edi,offset ShowText 	;转换后的数据
	mov  ebx,offset Digit
	mov  ecx,0
	xor  eax,eax
computeAgain:
	cmp  [readed],0
	jz   endCompute
	dec  [readed]
	mov  al,[esi]
	push eax
	shr  eax,4			;高4位
	mov  al,[ebx+eax]
	mov  byte ptr[edi],al
	inc  edi
	pop  eax
	and  eax,0fH			;低4位
	mov  al,[ebx+eax]
	mov  byte ptr[edi],al
	inc  edi
	mov  byte ptr[edi],' '		;空格
	inc  edi
	inc  esi
	inc  ecx
	cmp  ecx,16
	jnz  computeAgain
	xor  ecx,ecx
	mov  byte ptr[edi-1],13		;回车
	jmp  computeAgain
endCompute:
	;显示
	call MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
	ret
ShowBuffer endp

	end main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -