第一个宏汇编程序 f{_)rsqf
!I7 ?
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 [*HiI=
7d9Z/J@>
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! #Fzb8Yo
,`)OEI|1d
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! O6]u!NqG
VIg\]%qse
比较长啊!所以可以自动跳过。 (9'be\
gh61H:t kR
.286 L*^
V5^-
.radix 16 Zs73
ad
data segment ;定义数据段 !gJzg*{u@
8&?p
3#mE(
`|P
msg db 0dh, "Reading sector:$" {(0Id !
msg1 db 0dh, "Writing sector:$" C P&o%Uc*
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" vHc#m@4o
tqhh<u;
dsp db " $" {aIZFe}B
`^%@b SE(
;DAP 8Fx]koP.
PacketSize db 16d; // 数据包尺寸(16字节) ?i%nMlcc
Reserved db 0; // ==0 PUKVn+h
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) /.@x
4cdS
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) JV%nH!Fs
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 ]bu9-X&T&
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 xB,/dMdTj
DKHM\yt
;定位用DAP (复位到0磁道) z Lw(@&
DAP0 db 16d -XW8 LaQB
db 0 Bac| ;+L~L
dw 1 u\3ZIb
buff1 dw 0,0 6sy,A~e
dw 0,0,0,0 O!
(85rp/
_yJ|`g]U3
hgwn> p:S#
;DiskParameters GhiHA9.
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) %omu
falgs dw 0; WORD Flags; // 信息标志 K0 QH?F
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 :`5;nl63
Heads DW 0; DWORD Heads; // 磁盘磁头数 }5hZo%w[n
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ,!H\^Vfl
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 1tyNRoET
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) +C5#$5];
D-D# `
cmpsect dw 0 eI?HwP{m
X+*<B(E
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" _.-#E$6s#q
msgHds db 0dh,0a,"Heads:$" #G~wE*VR$
msgspt db 0dh, 0a,"SectorsPerTrack:$" ?RJdn]`4j
msgTotal db 0d,0a, "Total Sectors:$" tvCcyD%w
msgSS db 0dh,0a, "Sector Size:$" vX 1W@s
X TM$a9)
msgReadErr db 0dh,0a,"Error Reading Sectors:$" >uW^.e "F
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" t%HI1eO7h
msgReset db 0dh,0a, "Reseting drive to Cyl 0" y9ip[Xn-$:
b=G4MZQ
kyu2)L2u
buffer db 32768d dup(0); o
gp{rY
mF~ys{"t
data ends ;数据段结尾 B,MQ.|s[
pJ6Jx(
stack segment m{O
Dz:
db 400 dup(?) C (U
stack ends ?sE@]]z
-)>(8 f
code segment ;定义代码段 q#m!/wod
assume cs:code ;规定cs的内容 O!,Ca1N
assume ds:data ;规定ds的内容 4v>o%
assume ss:stack pJocI_v9
jm+blB^%K
start: SdSgn |S
pusha F {/>u(@3
8W@dtZ,d
,z oB0([
mov ax,data ;程序从start开始 *?p
^6vO
mov ds,ax ;ds置初值,data的段地址 9BO|1{
/} a_8iM\
;设置缓冲区 Lz?*B$h
lea bx, buffer 0}D-KvjyP
mov bufferaddr,bx 1wlVz#f.
mov buff1,bx Z,SY
N?@
mov bx,ds H7}g!n?
mov bufferaddr+2,bx ka8$dfC
mov buff1,bx GI?PGAT
'(T mV#3
lea di,infosize 3l$E8?[Zwi
mov dl,80h X*)?LxTj
mov ah,48h ",QYDFFeF
int 13h 9u?Eb~#$
{=qEBbM
lea bx,msgcyl ?0uOR*y'
mov dx,bx ETxp#PZ
mov ah,09 T:6K
?$y?
int 21h ov
bEmb
mov dx,cylinders /Bh>
call dispdx 9p4%8WhJ
3jXR"@Z-
lea bx,msghds OelU
D/[$
mov dx,bx Enu!u~1]F
mov ah,09 e|JIrOnc
int 21h [.ey_}X8
mov dx,heads v`
$%G
call dispdx pbPz$Y
PY2[S[
lea bx,msgspt FN>L7
*,0
mov dx,bx dDo6fP2
mov ah,09 n
3h^VQ*]G
int 21h m[W/j/$A+x
mov dx,spt+2 ^K"ZJ6?+1
call dispdx <5M_EJp
mov dx,spt rykj2/O
call dispdx B_!wutV@
}'v{dK
lea bx,msgtotal
gU+ss
mov dx,bx NtqFnxm/
mov ah,09 ~z &0qQ
int 21h el}hcAY/RP
lea bx,sectors x
~wNO/
call dispqword ;eP_;N5+J
u |'8a1
lea bx,msgss jmSt?M0.xV
mov dx,bx */4tJG1U
mov ah,09 !ZX&r{pJp
int 21h '!AT
mov dx,sectorsize "cNg
:
call dispdx 2G
ZF/9}
[A|(A$jl
sbb word ptr sectors, 63d $,.3&zsy
jnc subok xUIvLH=
sub word ptr sectors+2,1 O/(3 87= U
jnc subok [#IBYJ.6
sub word ptr sectors+4,1 e~3]/BL
jnc subok nT#37v
sub word ptr sectors+6,1 40R"^*
|^?`Q.|c$
subok: s:3aRQ%
Bpm,mp4g\#
Qg[heND
k&yQ98H$K"
xor ax,ax }M^_Z#|,
mov blocknumL, ax 7&h\l6}Yh
mov blocknumL+2, ax 1E8$% 6VV
mov blocknumL+4, ax '^e0Ud,
mov blocknumL+6, ax t?KUK>>w
(VfwLo>#
startread: QjI#Cs}w
-Sx0qi'%
call rwsect u2Y N[|V
_a fciyso
adc word ptr blocknuml,63d 4{Q$!O>
jnc addok Ndo}Tk!
adc word ptr blocknuml+2,1 CcBQo8!G
jnc addok eU`;L[
adc word ptr blocknuml+4,1 axOi5
jnc addok gAj0ukX5
adc word ptr blocknuml+6,1 3xP~~j;7
jnc addok &ycjSBK
:-(U%`a[
addok: Kq$:\B)<c
mov ax, word ptr sectors+6 !X%S)VSMU
cmp ax, blocknuml+6 UE\%
e9<l
jg complete WUzSlZq
jl startread X{#bJ
mov ax, word ptr sectors+4 cW=Qh-`jU;
cmp ax, blocknuml+4 5QKRI)XpZ
jg complete MST:.x ;
jl startread d8rBu jT
mov ax, word ptr sectors+2 04P.p6
cmp ax, blocknuml+2 JIVo=5c}
jg complete Sw yaYK
jl startread *U:VM'a
mov ax, word ptr sectors
qI(W$
cmp ax, blocknuml F
~*zC`>Y
jg complete z'?SRK5+
jl startread eR7qE) h
Ad^dF'SN
complete: K1/
U
(A
J0&zb'1
lea bx,msgready LFl2uV"
mov dx,bx BO[+E'2
mov ah,09 >ze>Xr'm5=
int 21 ?){0-
A4
j[_t6Z
popa "tfn?n0
mov ax,3100h ;&RUE
int 21h _MGNKA6JI
[|y`y%
; iK ohuZr
dispdx proc near _c[|@D
pusha 8b-7]%
lea bx, dsp+3 b*cW<vX}~
mov cx,4 n/xXQ7y
)gr}<}X)B
repeat0: dv}8YH["
mov al,dl C\y[&egww
and al,0fh XAw2 X;F%
cmp al,09h v hRu`Yb
jg add40 kZJt~}
add al, 30h ,m2A
p\l
jmp okadd zB;'_[8M
add40: f#*h^91x
add al,37h 7We?P,A\;
okadd: Tnf&pu#5
mov byte ptr [bx],al :x8Jy4L
dec bx Y,3z-Pa=@
shr dx,4 dz{#"No0
loopnz repeat0 cR,'o'V/
lea bx,dsp -
K:yU4V
mov dx,bx ~&t!$
mov ah,09h #E*@/ p/
int 21h I).=v{@9V<
F(J\ctha
popa &/ \O2Aw8
ret u
wH)$Pl
dispdx endp s[Y)d>~\$=
&\JK%X.Jlt
dispqword proc near -FQC9~rR;g
pusha 1R5Yn(
mov cx ,4 YI L'YNH
add bx,6 =n> iQS
repeatdecbx: )C'G2RV
mov dx,[bx] AmP#'U5
call dispdx vEu
Ka<5
sub bx,2 uCY(:;[<
loopnz repeatdecbx -L+\y\F
popa [Bl
$IfU
ret E%-Pyg
*
dispqword endp PthIdaN@
Rbx97(wK
rwsect proc near R1II k
n/ui<&(
lea bx,msg Su$18a"Bc
mov dx,bx KK@
&q
mov ah,09h 0eQ~#~j&
int 21h }9{dR4hD
l R:Ok8e
lea bx,BlockNumL Gtj(
call dispqword b{Z^)u2X
<FCj)CP%
lea di, packetsize 1_N~1Ik
mov dl,80h Y'tq m&}
mov ah,42h :({-0&&_
int 13h OAmES;Ck$(
jnc readok Q&oC]u(="&
yTzY?
mov cx,5 l0qdk#v
;出错后重试(定位0道后再重读) %M|Z}2qv
retryrd: 6Hc H'nmeN
lea bx, msgReadErr kqj;l\N
mov dx,bx KC&H*
mov ah,09 Ly#h|)
int 21h k)?,xY\AV
59&T