;文件名:ARSE.ASM
;功能:读硬盘0面0头1扇区数据并建立存储文件
;********************************************
data segment ;1.定义数据段
ostr db 'Enter file name:','$' ;2.屏幕提示
filename db 15 ;3.输入的文件名
db ? ;4.
db 15 dup(0) ;5.
buffer db 512 dup(0) ;6.扇区数据
tmp db 15 dup(0) ;7.转存的文件名
data ends ;8.
code segment ;9.定义代码段
assume cs:code,ds:data ;10.
start: ;11.程序开始
mov ax,data ;12.初始化数据段
mov ds,ax ;13.
;14.
mov ax,seg buffer ;15.用buffer初始化附加段es
mov es,ax ;16.
mov bx,offset buffer ;17.取址
mov ax,0201h ;18.程序入口参数
mov cx,0001h ;19.
mov dx,0080h ;20.
int 13h ;21.调用中断
mov dx,offset ostr ;22.
mov ah,09h ;23.输出字符串
int 21h ;24.
;25.
mov dx,offset filename ;26.
mov ah,0ah ;27.接收字符串
int 21h ;28.
mov si,offset filename ;29.
mov di,offset tmp ;30.
lstr: mov dl,[si+2] ;31.取字符
mov [di],dl ;32.存字符
inc si ;33.地址递增
inc di ;34.
cmp dl,0dh ;35.判断是否为回车符
jne lstr ;36.不等转
;37.
mov bl,0 ;38.补0
mov [di-1],bl ;39.
mov dx,offset tmp ;40.取文件名
mov cx,0 ;41.
mov ah,3ch ;42.建立文件
int 21h ;43.
mov dx,offset buffer ;44.取缓冲区数据地址
mov cx,512 ;45.
mov bx,ax ;46.
mov ah,40h ;47.写文件
int 21h ;48.
mov ah,3eh ;49.关闭文件
int 21h ;50.
mov ah,4ch ;51.返回系统
int 21h ;52.
code ends ;53.
end start ;54.程序结束
源程序解释
在对汇编源程序进行解释的时候,有些属于汇编程序的基本格式和基本语法,就不再介绍了。大家可以看看汇编语言的基础教程,这一类的书是很多的。
第2行定义了缓冲区内的一个字符串,该字符串是作为提示行输出到屏幕的。因为输出字符串是由INT21H中断里的09H号DOS功能调用完成的,所以字符串必须以“$”作为结束符。
第3-5行在内存中开辟一块缓冲区,用来存储由键盘输入的文件名。
第6行在内存中开辟一块缓冲区,用来存储512字节扇区数据。
第7行在内存中开辟一块缓冲区,准备转存键盘输入的文件名。前面已经将文件名存入缓冲区里了,为什么还要转存呢?
因为由键盘输入的表示文件名的字符串,是由0aH号DOS功能调用接收完成的。该功能调用向缓冲区存入字符串时,从第三个字节开始存放字符串的首字节。缓冲区的第一个字节设置为缓冲区的最大容量,属于功能调用的入口参数。缓冲区的第二个字节存放实际读入的字符数(回车符除外),属于功能调用的出口参数,是在键盘输入结束后,由系统写入的。
键盘输入的字符串就是下一步要建立的存储扇区数据的文件名。建立文件是由3cH号DOS功能调用完成的,该功能调用对缓冲区的存储要求与0aH号DOS功能调用不一样,因此必须进行上述转存工作。
第15-16行取变量buffer的段址,用该段址初始化附加段ES。这是由基本INT13H中断的入口参数所要求的,其数据缓冲区地址=ES:BX。
第17-21行设置各项入口参数,然后执行13H中断。下面顺序介绍各项功能:将变量buffer的地址取到BX寄存器中;AH=02H,执行读功能;AL=01H,读一个扇区;CH=00H,磁道号(也就是柱面号)为0;CL=01H,扇区号为1;DH=00H,磁头号为0;DL=80H,驱动器号为第一硬盘(如果读取第二硬盘的扇区,设置DL=81H)。
第22-24行在屏幕上输出提示字符串。
第26-28行接收键盘输入的字符串。
第29-36行是字符串转存,每次转存一个字符。因为键盘输入的字符串以回车作为结束符,回车的ASCII码值是0dH,所以第35行设置一判断语句,若取的字符与回车相等,则结束循环。第31行将地址跳过2个字节,从第3个字节开始取字符。
第38-39行在转存字符串后面补0,作为字符串的结束符。
第40-50行建立文件、向建立的文件中写入扇区数据、最后关闭文件。这几步都是常规的简单操作,就不用详细解释了。
第51-54行返回DOS系统、结束程序。
程序编译和运行
汇编源程序的编译和连接,是用命令行方式,使用Borland C++ 3.1自带的两个程序完成的。TASM.EXE可将源程序编译成OBJ二进制文件,TLINK.EXE可将二进制文件连接成EXE可执行文件。
如果在安装Borland C++ 3.1编译软件以后,没有在自动批处理文件AUTOEXEC.BAT里面设置相关路径,就需要先进入Borland C++ 3.1的安装目录,然后才能运行有关程序。
最好的方法是修改AUTOEXEC.BAT文件,在里面设置好路径。当硬盘启动时就能自动加载,不论在哪一个目录下,都可以运行程序了。
以我用的硬盘为例,将Borland C++ 3.1安装在E盘的BC目录中,用文本编辑软件打开C盘根目录下的AUTOEXEC.BAT文件,在其中加上一行:
SET PATH=%PATH%;E:/BC/BIN
编译时先执行命令TASM ARSE,生成ARSE.OBJ文件,再执行命令TLINK ARSE,可生成ARSE.EXE文件。如果源程序有逻辑错误或语法错误,屏幕上会有出错提示或警告提示,并指出发生在哪一行。
可以将上面执行两次的命令合成一步来完成,方法是用文本编辑软件建一个批处理文件。文件名可定为TASMLINK.BAT,其内容是:
TASM %1
TLINK %1
将TASMLINK.BAT放在E:/BC/BIN目录中,编译时执行TASMLINK ARSE。
运行程序时执行命令ARSE,屏幕上提示“Enter file name:”,输入文件名后回车,在当前目录下生成一个512字节的扇区数据文件。
生成的扇区数据文件不是文本方式的,不能直接用文本编辑软件查看。
每一个想从事数据恢复工作的人,都必须能写自己的工具程序,才能在数据恢复中得心应手。因为现成的应用软件谁都会用,任何人都没有技术上的优势,有的只是时间上的优势,也就是比别人早用了几天而已。
只有形成自己的有特色的分析方法,配合自己的工具程序,才能有领先于别人的优势。同时在编写自己的工具程序的过程中,对文件系统的存储原理,对磁盘扇区的存储规律,就会有比别人更深刻的认识。