第一个宏汇编程序 MiR$N
{pA&Q{ ^
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 hiEYIx
)U7fPKQ
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! uEf=
Vj}G
#SG.`J<%
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 94^b"hU
Y`(~eNX^%
比较长啊!所以可以自动跳过。 w!z*?k=Da
CO9PQ`9+
.286 {3.n!7+
.radix 16 q6 ny2;/r
data segment ;定义数据段 UNK.39
&H
P g>
7
XLqP
msg db 0dh, "Reading sector:$" KMK8jJ
msg1 db 0dh, "Writing sector:$" )0DgFA6k_
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" *[
m:4\
VN(*m(b
dsp db " $" b^&azUkMN
d!4Tw
pIgx
;DAP O#t[YP
PacketSize db 16d; // 数据包尺寸(16字节) *l;S"}b*,_
Reserved db 0; // ==0 R7K`9 c1f6
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ~9xkiu5~
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ,iY:#E
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 ,L lYRj 5
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 |rG)Q0H,
pwk Te
;定位用DAP (复位到0磁道) \XYidj
DAP0 db 16d EeT69o
db 0 <
*WGvCh%w
dw 1 H%etYpD
buff1 dw 0,0 a
9{:ot8,
dw 0,0,0,0 g cB
hEw
8};kNW^2m
u!&T}i:
;DiskParameters 8a&c=9
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) Gz BPI'C
falgs dw 0; WORD Flags; // 信息标志 ijUu{PG`X
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 hlZ{bO'f
Heads DW 0; DWORD Heads; // 磁盘磁头数 JWYe~
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数
/.=aA~|
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 {}rnn$HQe
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) jm@,Ihz=wI
dpK-
cmpsect dw 0 FJ4,|x3v[x
ecQ{ePoU
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" QqRF?%7q"q
msgHds db 0dh,0a,"Heads:$" 5ba e-
msgspt db 0dh, 0a,"SectorsPerTrack:$" '7/F]S0K
msgTotal db 0d,0a, "Total Sectors:$" \#WWJh"W
msgSS db 0dh,0a, "Sector Size:$" m Rm}7p
wG
w~ F:z
msgReadErr db 0dh,0a,"Error Reading Sectors:$" ;]b4O4C\
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" REYvFx?i
msgReset db 0dh,0a, "Reseting drive to Cyl 0" dJ#go*Gn
Z4c'1-lh
d7mn(= &
buffer db 32768d dup(0); w%plK6:6
y:^o._
data ends ;数据段结尾 <:NahxIlu
r>7+&s*yk
stack segment j"hEs(t
db 400 dup(?) %l14K_
stack ends dJ/gc"7aO
#oFyi @U
code segment ;定义代码段 NL>Trv5
assume cs:code ;规定cs的内容 S,ea[$_
assume ds:data ;规定ds的内容 FRajo~H
assume ss:stack G;iH.rCH
Qe\vx1GRLH
start: }mzd23^W>P
pusha lM}-'8tt?
KO~KaN
s^SU6P/]
mov ax,data ;程序从start开始 /H"fycZ
mov ds,ax ;ds置初值,data的段地址 F\^8k /0
^1vKhO+p$
;设置缓冲区 F'sX ^/;
lea bx, buffer dv
qg H
mov bufferaddr,bx L6DYunh}^N
mov buff1,bx Yh!=mW!OY
mov bx,ds S89j:KRXH%
mov bufferaddr+2,bx lS
#:u-k
mov buff1,bx vz>9jw:Y
+RJKJ:W
lea di,infosize (_8.gS[
mov dl,80h X 6tJ
mov ah,48h >j3':>\U
int 13h x;$ESPPg
p5tb=Zg_
lea bx,msgcyl 6wj o:I
mov dx,bx /e[m;+9^&
mov ah,09 S9]I[4
int 21h d(TN(6g@
mov dx,cylinders iETUBZ
call dispdx L\UGC%]9
}(
CYok
lea bx,msghds WcoA)we
mov dx,bx 4}k@p>5v'
mov ah,09 Yj*T'<e
int 21h 7s3=Fa:9Q
mov dx,heads </D.}ia
call dispdx ^<-)rzTI
sNcU>qjj6
lea bx,msgspt Ez"*',(
mov dx,bx IW&*3I<K
mov ah,09 /]'&cD 1
int 21h `e~i<Pi
mov dx,spt+2 LU+SuVm
call dispdx J(@" 7RX
mov dx,spt `2LmLFkb
call dispdx 24k]X`/n
qg=`=]j
lea bx,msgtotal fP5i3[T
mov dx,bx oA@M =
mov ah,09 r5ldK?=k+*
int 21h 'W4B
lea bx,sectors uR{)%udu
call dispqword /RMtCa~
}$ySZa9
lea bx,msgss i{TPf1OY`M
mov dx,bx D!!
B4zt
mov ah,09 M2p|&Z%
int 21h t!SxJB e
mov dx,sectorsize ib#rT{e
call dispdx YY :{/0?
H#D:'B j29
sbb word ptr sectors, 63d `4snTM!v&
jnc subok iE
HWD.u
sub word ptr sectors+2,1 7M7Lj
0Y)L
jnc subok Xwdcy J!
sub word ptr sectors+4,1 S{N4[U?V>
jnc subok >l><d!hw
sub word ptr sectors+6,1 {Ji&rk}NP
C
?>d$G8
subok: iQ(j_i'+!I
2uN3:_w
pfHjs3A=
A[^#8evaK
xor ax,ax bGL} nPo
mov blocknumL, ax L.yM"
mov blocknumL+2, ax |LZ{kD|
mov blocknumL+4, ax =}Zl
E
mov blocknumL+6, ax &9)/"
?d%{-
startread: i%.k{MY
YTZ :D/
call rwsect _u^3uzu
aJf3rHX
adc word ptr blocknuml,63d Gf3-%s xA
jnc addok gaz",kK<
adc word ptr blocknuml+2,1 }4!}vkVx
jnc addok #::+# G
adc word ptr blocknuml+4,1 K>e-IxA);0
jnc addok 3<+ZA-2
adc word ptr blocknuml+6,1 ,b -
jnc addok V^R,j1*
}BU%<5CQ
addok: 3@\/5I xn
mov ax, word ptr sectors+6 9
@ <
cmp ax, blocknuml+6 0m]QQGvJ{
jg complete B>>_t2IU
jl startread t0e5L{ QJ
mov ax, word ptr sectors+4 NJgu`@YoI
cmp ax, blocknuml+4 Hzm_o>^KC
jg complete IqFcrU$4
jl startread ;Ivv4u
mov ax, word ptr sectors+2 iKV|~7nwO
cmp ax, blocknuml+2 A+8)VlE\
jg complete `ovMfL.u
jl startread Zv!XNc!"$y
mov ax, word ptr sectors .Z'NH
wCy
cmp ax, blocknuml
Q"D
jg complete ,$/Ld76U
jl startread 2wB*c9~
jT$J~MpHh
complete: nRB3VsL
/CO=!*7fz
lea bx,msgready uA[
:
mov dx,bx JxwKTFU'3O
mov ah,09 aVK,(j9u
int 21 CEkUXsp
21tv(x
popa s|A[HQUtJ
mov ax,3100h ym%` l!
int 21h 4-SU\_
6q8}8;STTY
; J.XhP_aT
dispdx proc near &z40l['4bz
pusha DJ<+" .v!
lea bx, dsp+3 }DM W,+3
mov cx,4 @O'NJh{D`
aT IzfqCM
repeat0: z
JW2F_
mov al,dl dWiNe!oY2
and al,0fh (wq8[1Wzup
cmp al,09h ZCj1Cz]"l<
jg add40 hBnUpYec
add al, 30h n
nAtXVy
jmp okadd Qt{){uE
add40: ]?H12xz
add al,37h keRLai7h
okadd: tt2
S.j
mov byte ptr [bx],al ^*`#+*C
dec bx 7F0J*M
shr dx,4 X"d"a={]
loopnz repeat0
l$\B>u,>
lea bx,dsp RHn3\N
mov dx,bx m4oj1h_4
mov ah,09h J-'XT_k:iM
int 21h
-*KKrte
}:c~5whN
popa Q"u2<
ret qMVuFwPhi
dispdx endp @@
K/0:],
EK=0oy[
dispqword proc near gAorb\iJ
pusha `r-Jy{!y4
mov cx ,4 yUJ#LDW
add bx,6 F7O*%y.';
repeatdecbx:
anpKWa
mov dx,[bx] D
C/X|f
call dispdx d
WkQ NFKF
sub bx,2 ~mt{j7
loopnz repeatdecbx ]58~b%s
popa (>A#|N1U
ret Vf~-v$YI
dispqword endp aY?VP?BL
"Zhh>cz
rwsect proc near Miw=2F
"GZ}+K*GG
lea bx,msg I50LysM
mov dx,bx c}n66qJF5
mov ah,09h cL*oO@I&_
int 21h +@!\3a4!
Mz(?_7
lea bx,BlockNumL ;f[##=tm
call dispqword )'f=!'X
'+{yg+#/wV
lea di, packetsize
hx&fV#m
mov dl,80h $Ugc:L<h+
mov ah,42h -hW>1s<
int 13h ~K #92
jnc readok (0Br`%!F
"Hz%0zP&
mov cx,5 qOy(dG g
;出错后重试(定位0道后再重读) X41Qkf{
retryrd: O&aD]~|
lea bx, msgReadErr yH-&o,
mov dx,bx N}%AUm/L
mov ah,09 4[x`\
int 21h K)
AQ(n?1LU
J5Zz*'av'
lea di,dap0 )@I] Rk?
mov dl,80h WvT H+
mov ah,44h W`vPf
int 13h pXl qE,
?+7~E8
lea bx,BlockNumL CKZEX*mPC
call dispqword b3[[ Ah-
4(P<'FK $
lea di, packetsize eL"'-
d+]
mov dl,80h \^9n&MonM
mov ah,42h mMXDzAllB
int 13h WgR%mm^
jnc readok o96c`a u
loopnz retryrd q?mpvpLG
>Tl/3{V
readok: fi>.X99(G
lea di, packetsize xS%&l)dT
mov dl,80h 2;>uP#1]
mov ah,43h
P.q7rk<
int 13h .wq
j
+JC"@
rwsect endp
`ql8y '
goyDG/
code ends ;代码段结尾 d9S?dx
end start ;结束汇编 KG(F
A
,.(:b82$