PC技术指导:汇编源码free

PC技术指导:汇编源码free,第1张

PC技术指导:汇编源码free,第2张

name free
page 60,132
title 'free -报告磁盘上的可用空间'
;free -报告可用空间的实用程序

;默认或选定的磁盘驱动器。

;需要pc-dos或ms-dos 2.0。

;用于形式:
;a >免费[单位:]
;(方括号中的项目是可选的)

;1.0版1984年7月4日
;版权所有(c) 1984年由雷邓肯
;可以自由复制用于非商业用途。
Cr equ 0dh;ascii回车
lf equ 0ah;ascii换行
空白equ 20hascii空格代码
eom equ ' $ ';字符串结束标记
;这里我们定义了一个包含标签的虚拟段
;对于默认文件控制块和命令尾缓冲区,
;以便主程序可以访问这些位置。

PSP segment para public ' PSP '
org 05ch
fcb标签字节;默认文件控制块
org 080h
命令标签字节;默认命令缓冲区
PSP ends
cseg segment para public ' code '
假设cs:cseg,ds:psp,es:data,ss:stack
get _ drive proc near;获取驱动器选择(如果有),
。否则获取身份
;当前磁盘驱动器的。
;在al中返回驱动器(1=a,2=b,等等)。

mov al,fcb提取驱动器代码,解析
;由dos导入默认文件
;控制块。
或者al,al;是默认吗?
jnz get _ drive 1;不,用itmov ah,19h可以,获取实际电流
int 21h;从pc-dos驱动。
Inc al;递增以匹配fcb代码。
get _ drive 1:;返回al中的驱动器代码。
ret
get _ drive endp
free proc far;pc-dos的入口点
push ds;存ds:0000做最终
xor ax,ax;返回pc-dos
push ax
mov ax,data使我们的数据段
移动,ax;可通过es寄存器寻址。
mov ah,30h检查pc-dos的版本。
int 21h
cmp al,2
jae free 1;继续,dos 2.0或更高版本。
mov dx,offset msg2dos 1.x - print错误信息
mov ax,es;然后退出。首先修复ds寄存器
mov ds,ax;因此错误消息是可寻址的。
jmp free4
free1:调用get _ drive将驱动器选择导入dl。
推送es;将es复制到ds以获得剩余部分
pop ds;程序的...
假设ds:data;并告诉汇编程序。
mov dl,al
add al,' a '-1;从驱动器代码中形成驱动器号,
mov outputb,al。并将它放入输出字符串。
mov ah,36h现在调用dos来获得空闲磁盘空间。
int 21h
cmp ax,-1;驱动器是否无效?
je免费3;是,打印错误信息
;驱动器没问题,所以现在寄存器...
;ax =每个簇的扇区数量
;bx =可用群集,
;cx =每个扇区的字节数,
;dx =每个驱动器的总簇数。
;计算可用空间:
mul CX;每个簇的扇区*每个扇区的字节数
;(我们假设这个不会溢出到dx)
mul bx;然后*可用集群
;dx:ax现在包含以字节为单位的可用空间。
;si =已转换字符串的最后一个字节地址。
mov si,offset (outputa+9)
mov cx,10;cx = 10,基数为转换
调用bin _ to _ asc将自由空间值转换为ascii,
mov dx,offset输出
jmp free 4;并打印出来。
free3: mov dx,offset msg1非法驱动,打印错误
free4: mov ah,9;打印地址
int 21h的字符串;就是在dx。
ret;然后返回dos。
free endp
;将32位二进制值转换为ascii字符串。

;用dx:ax =有符号32位值
调用;CX = radix
;si =存储结果字符串的区域的最后一个字节
;(确保有足够的空间存放
;您选择的基数中的字符串。);
;摧毁ax,bx,cx,dx和si。

bin _ to _ ASC proc near;将dx:ax转换为ascii。
;强制存储至少1位数。
mov byte ptr [si],' 0 '
或dx,dx;32位值的测试符号,
pushf;并保存堆栈上的符号。
jns bin 1;如果是阳性就跳。
不是dx;它是负数,取2的补码
而不是ax;的价值。
add ax,1
adc dx,0
bin 1:;将32位值除以基数
;提取
的下一个数字;形成字符串。
mov bx,ax;值还为零吗?
或者bx,dx
JZ bin 3;是的,我们完成了转换。
调用divide不,除以基数。
添加bl,' 0 ';将余数转换成ascii数字。
cmp bl,' 9 ';我们可能会转换成十六进制ascii,
jle bin 2;如果在范围0-9内,则跳转,
添加bl,' a '-' 9 '-1;如果在范围a-f内,则进行修正。
bin2: mov [si],bl;将该字符存储到字符串中。
dec si;通过string,
jmp bin 1;再做一次。
bin3:;还原签名标志,
popf。原始值是负数吗?
jns bin 4;不,跳
;是,将符号存储到输出字符串中。
mov byte ptr [si],'-'
bin 4:ret;回到来电者。
bin _ to _ ASC endp
;通用32位除以16位无符号除。
;这必须用来代替普通的机器无符号除
;对于商可能溢出16位的情况(例如,
;用10万除以2)。如果用零因子调用,this
;例程返回不变的红利,并且不给出警告。

;用dx:ax = 32位被除数进行调用
;cx =除数

;返回dx:ax =商
;bx =余数
;cx =除数(不变)

divide proc near;用dx:ax除以CX
jcxz div 1;如果被零除,则退出
按ax;0:divider _ upper/divisor
mov ax,dx
xor dx,dx
div cx
mov bx,ax;bx = quotient 1
pop ax;余数1:divider _ lower/divisor
div CX
xchg bx,dx;dx:ax =商数1:商数2
div 1:ret;bx = reminder 2
divide endp
cseg ends
数据段para public ' data '
output db cr,lf
output db 10 dup(空白)db '驱动器上的可用字节'
output db db ' x:',Cr,lf,eom
msg1 db cr,lf
db '表明磁盘驱动器不存在。
db cr,lf,eom
msg2 db cr,lf
db '需要dos版本2或更高版本。
db cr,lf,eom
数据结束
stack segment para stack ' stack '
db 64 dup(?)
堆栈结束
自由结束

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » PC技术指导:汇编源码free

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情