第一个宏汇编程序 v&(PM{3o
,n-M!y
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 4D0=3Vy
*[9FPya
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! ~bf-uHx
.|G([O^H
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 9l+'V0?`
)C|[j@MD
比较长啊!所以可以自动跳过。 ~$Xz~#~
GNgPf"}K
.286 Akb#1Ww4
.radix 16 *G7/
data segment ;定义数据段 xf_NHKZ)
8rx?mX,}
iLIH |P%
msg db 0dh, "Reading sector:$" s["8QCd"r
msg1 db 0dh, "Writing sector:$" m+?$cyA>v
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Z
Ql
ja
d
*!) w
t
dsp db " $" [z5pqd-
Mxc0=I'a
;DAP /2Y t\=S=
PacketSize db 16d; // 数据包尺寸(16字节) &O/;YGEAB
Reserved db 0; // ==0 &-dyg+b3
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) G\@uj>Z
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) [u`v'*0d
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 G0Eqo$W)S
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 96fbMP+7R
?h2!Z{[0b
;定位用DAP (复位到0磁道) fb0i6RC~&
DAP0 db 16d 7y""#-}V[r
db 0 "eA4JL\%)
dw 1 V\5ZRLawP
buff1 dw 0,0 5
<X.1T1
dw 0,0,0,0 jgQn^
*I:^g
;G|5kvE>
;DiskParameters ]DHB'NOh,
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) \vjIw{
falgs dw 0; WORD Flags; // 信息标志 ...|S]a
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 ABuK`(f.
Heads DW 0; DWORD Heads; // 磁盘磁头数 h8i
ic
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ]+@ @{?0
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 p2cwW/^V
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) LZG?M|(6D
7k.=_
Tl
cmpsect dw 0 H$bu*o-Z
k)U9%Pr
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" =]X_wA;%
msgHds db 0dh,0a,"Heads:$" UFr
]$m&
msgspt db 0dh, 0a,"SectorsPerTrack:$" e`27 ?
msgTotal db 0d,0a, "Total Sectors:$" $ @QF<?i~
msgSS db 0dh,0a, "Sector Size:$" >> yK_yg
h mC.5mY
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 6q-X$
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" OuWG.Za
msgReset db 0dh,0a, "Reseting drive to Cyl 0" %{?EfULg
4! ]28[2B6
G6]W'Kk
buffer db 32768d dup(0); "#Qqwsw7
(,*e\o
data ends ;数据段结尾 X,DG2HT
efW<
stack segment 2K[Y|.u8>q
db 400 dup(?) #;4<dDVy
stack ends #fk#RNt
Q"itV&d,
code segment ;定义代码段 l6]:Zcd0
assume cs:code ;规定cs的内容 uQk}
assume ds:data ;规定ds的内容 + :4
F@R
assume ss:stack SM;UNIRVE
<H03i"Z/S
start: _Vul9=
pusha 0eP7efy
Ac{"$P`
MKMWHGN
mov ax,data ;程序从start开始 4HG;v|Cp
mov ds,ax ;ds置初值,data的段地址 VbLwhA2W}F
R~TzZ(Ah]
;设置缓冲区 -9W)|toWb"
lea bx, buffer
`=TV4h4
mov bufferaddr,bx lKKg n{R
mov buff1,bx .K%1{`.|
mov bx,ds fhp\of/@
R
mov bufferaddr+2,bx %xv }
mov buff1,bx >|Yr14?7
Q"rQVO
lea di,infosize V9
Z
mov dl,80h oMey^]!
mov ah,48h !6.}{6b
int 13h 2%o@ ?Rp
pbc<326X"
lea bx,msgcyl ;7=pNK
mov dx,bx "V|&s/9
mov ah,09 c~ x
int 21h onqfmQ,3E
mov dx,cylinders mu`:@7+Yp
call dispdx moz*=a
1fajTT?
lea bx,msghds }h{8i_R
mov dx,bx sa6/$
mov ah,09 >8%<ML
int 21h b`:n i
mov dx,heads 7-S?\:J
call dispdx Cb:}AQ =
IP<]a5
lea bx,msgspt drRi<7
i
mov dx,bx -|_#6-9
mov ah,09 ?D[9-K4Vn
int 21h pe%$(%@v
mov dx,spt+2 xb8S)zO]Q
call dispdx nSR7$yS_
mov dx,spt '$nm~z,V
call dispdx A><w1-X&=o
A:Y
([
lea bx,msgtotal JO3"$s|t
mov dx,bx SlK6KnX
mov ah,09 pSMF1Oy
int 21h vNo(`~]c
lea bx,sectors *DBm"{q%&k
call dispqword GS_+KR\
TQhu$z<