【问题标题】:Hard Disk handling using 32-bit system call in assembly language使用汇编语言中的 32 位系统调用处理硬盘
【发布时间】:2015-11-17 07:02:10
【问题描述】:

朋友们,我需要有关使用 32 位系统调用处理硬盘的帮助。我是汇编语言的新手,我正在使用 MASM 汇编程序。我尝试了一些示例代码,但它们处于 16 位模式,并且在编译时我也给了我错误。我想用32位写。我还在一本书中读到 32 位很复杂,是否还有其他用于 32 位系统调用的程序。

示例代码!

; This program calls INT 21h Function 7303h, to get free space information
; on a FAT-type drive volume. It displays both the volume size and free space.
; Runs under Windows 95/98/Me, but not under Windows NT/2000/XP.
; Last update: 12/11/01

INCLUDE Irvine16.inc

.data

buffer ExtGetDskFreSpcStruc <>
driveName BYTE "C:\",0
str1 BYTE "Volume size (KB): ",0
str2 BYTE "Free space (KB):  ",0
str3 BYTE "Function call failed.",0dh,0ah,0

.code
main PROC
    mov ax,@data
    mov ds,ax
    mov es,ax

    mov  buffer.Level,0     ; must be zero
    mov  di, OFFSET buffer      ; ES:DI points to buffer
    mov  cx, SIZEOF buffer      ; buffer size
    mov  dx, OFFSET DriveName   ; ptr to drive name
    mov  ax, 7303h          ; Get disk free space
    int  21h
    jc   error          ; Failed if CF = 1

    mov  dx,OFFSET str1     ; volume size
    call WriteString
    call CalcVolumeSize
    call WriteDec
    call Crlf

    mov  dx,OFFSET str2     ; free space
    call WriteString
    call CalcVolumeFree
    call WriteDec
    call Crlf
    jmp  quit
error:
    mov  dx,OFFSET str3
    call WriteString
quit:
    exit
main ENDP

;-------------------------------------------------------------------
CalcVolumeSize PROC
; Calculate and return the disk volume size, in kilobytes.
; Receives: buffer variable, a ExtGetDskFreSpcStruc structure
; Returns:  EAX = volume size
; Remarks:  (SectorsPerCluster * 512 * TotalClusters) / 1024
;--------------------------------------------------------------------
    mov eax,buffer.SectorsPerCluster
    shl eax,9           ; mult by 512
    mul buffer.TotalClusters
    mov ebx,1024
    div ebx             ; return kilobytes
    ret
CalcVolumeSize ENDP


;-------------------------------------------------------------------
CalcVolumeFree PROC
; Calculate and return the number of available kilobytes on the
;           given volume.
; Receives: buffer variable, a ExtGetDskFreSpcStruc structure
; Returns:  EAX = available space, in kilobytes
; Remarks:  (SectorsPerCluster * 512 * AvailableClusters) / 1024
;--------------------------------------------------------------------
    mov eax,buffer.SectorsPerCluster
    shl eax,9           ; mult by 512
    mul buffer.AvailableClusters
    mov ebx,1024
    div ebx             ; return kilobytes
    ret
CalcVolumeFree ENDP

END main 

【问题讨论】:

  • 你的目标是什么操作系统?
  • 此代码是您发现并且已经知道没用的 16 位示例之一吗?

标签: windows assembly x86 dos masm


【解决方案1】:

正在尝试组装这个程序...

我也给了我错误

首先,它无法组装,因为该行中的结构ExtGetDskFreSpcStruc

buffer ExtGetDskFreSpcStruc <>

之前未定义 - 不在此文件中,也不在(唯一的)包含文件中,在本例中为“Irvine16.inc”,其中不包含定义。因此,所有尝试访问“buffer.xxx”都会引发错误。

其次,如果您尝试将此程序汇编为 32 位,则您将在 32 位汇编文件中包含一个 16 位包含文件。您应该使用 32 位版本的“Irvine32.inc”,否则子程序中的所有间接寻址(如 mov al, [si](16 位))都会失败。

第三,您正在调用 DOS-legacy-interrupts,它仅在 Win95/98/Me 中可用,因为它们的内核是基于 DOS 的。 Win2000 及更高版本中较新的 NT 内核不提供它们,因为它是一个不同的操作系统架构/代码库,没有/减少了遗留代码。 DOS 中断(21h)是 16 位的,因为 DOS 是 16 位的。我不知道在 Win95/98/Me 中是否实现了 32 位版本的旧 DOS 中断。快速搜索没有发现这已经实现的迹象。 “Irvine16.inc”中使用的 BIOS 中断肯定是 16 位的,因此在 32 位可执行文件中无法使用(没有非常复杂的解决方法)可能会导致程序崩溃。

32位系统调用是否有其他程序[?]

是的。使用 Win32-API,它在 Win95 到 Win8/10(?) 中可用。 最简单的方法是使用 Hutch 在MOVSD.COM 找到的 MASM 包,然后从中包含kernel32.inc/lib。然后你可以调用GetFreeDiskSpace function 来获得想要的结果,类似这样的一行:

invoke GetFreeDiskSpace, 
  offset driveName, 
  offset buffer.lpSectorsPerCluster,       ; adjust to actual buffer layout names
  offset buffer.lpBytesPerSector,          ; "
  offset buffer.lpNumberOfFreeClusters,    ; "
  offset buffer.lpTotalNumberOfClusters    ; "

【讨论】:

  • 32 位版本的 Windows 仍然可以模拟 DOS,但仅限于 16 位可执行文件。 64 位版本不包括 DOS 仿真。
  • @Harry Johnston:是的。我的意思(和写的)是,Win95/98/Me 基于 DOS,因此不需要模仿它。带有 NT 内核的 32 位 Windows 版本可以模拟它,可能使用 Virtual x86 模式,这在 LongMode(64bit) 中不可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2017-03-20
  • 2011-03-21
  • 2021-08-19
  • 2018-10-01
  • 2017-04-24
相关资源
最近更新 更多