第一个宏汇编程序 <d*;d3gm
VT@,RlB0
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 *aem5E`c
/xS4>@hn
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! v$n J$M&k
Dqxtc|vo
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! ?so=k&I-M
EuH[G_5e0
比较长啊!所以可以自动跳过。 6>L)
g<b
(q|
.286 XHN*'@
77;
.radix 16 x{'3eJ^8
data segment ;定义数据段 WF#3'"I
FR57F(31
^jph"a C
msg db 0dh, "Reading sector:$" ioJ~k[
T
msg1 db 0dh, "Writing sector:$" ;7/
;4Z
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" XEX."y
UYw_k\
dsp db " $" ` @PHV
TK! D=M
;DAP k 'CM^,F&
PacketSize db 16d; // 数据包尺寸(16字节)
n7EG%q6m+
Reserved db 0; // ==0 C4,;l^?=%
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) fC4#b?Q
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) 0oC5W?>8s
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 Jy
iP3whW
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 h
eR$j
heizO",8.&
;定位用DAP (复位到0磁道) pYxdE|2j
DAP0 db 16d S`w_q=-^8
db 0 h=a-~= 8
dw 1 n PAl8
buff1 dw 0,0 QXaE2}}P
dw 0,0,0,0 II,snRD
~k(4eRq
?=^~(
x?S
;DiskParameters DTx!# [
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) M94zlW<
falgs dw 0; WORD Flags; // 信息标志
F]
qX}
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 Q:v9C ^7
Heads DW 0; DWORD Heads; // 磁盘磁头数 wO-](3A-8P
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 {p90
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 *X%dg$VcV
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) H
Z)an
_
x'?igy
cmpsect dw 0 L!>EW0
iHYvH
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" |Q|vCWel{
msgHds db 0dh,0a,"Heads:$" h=x{
3P;B
msgspt db 0dh, 0a,"SectorsPerTrack:$"
;:`0:Ao.
msgTotal db 0d,0a, "Total Sectors:$" X:/Y^Xu
msgSS db 0dh,0a, "Sector Size:$" 6he (v
Y%GIKtP
msgReadErr db 0dh,0a,"Error Reading Sectors:$" %C1*`"Jb&
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" .dE2,9{Z
msgReset db 0dh,0a, "Reseting drive to Cyl 0" <T^:`p/]4
,ve$bSp
s/+k[9l2
buffer db 32768d dup(0); PV(TDb:0
gK%^}xU+
data ends ;数据段结尾 <+r<3ZBA
bMCy=5
stack segment f3E%0cg
db 400 dup(?) IncHY?ud<