第一个宏汇编程序 >npFg@A
'))=y@M
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 Pa
*/&WeB
O
718s\#
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 3Hkb)Wu
"%K[kA6
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! l6< bV#_qe
\Wf1b8FW
比较长啊!所以可以自动跳过。 [,ZHn$\
3/4r\%1b+
.286 Wh1'?#
.radix 16 <CGJ:% AY
data segment ;定义数据段 EGK7)O'W
3ULn ]jA
WXCZ
}l
msg db 0dh, "Reading sector:$" "j?\Ze*
msg1 db 0dh, "Writing sector:$" p/'09FY+ U
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 1ika'
}vt>}%%
dsp db " $" 1g_D
kv|D
]BY<D`$$P
;DAP >d$Sh`a6
PacketSize db 16d; // 数据包尺寸(16字节) }Z8DVTpX}
Reserved db 0; // ==0 |Q*{yvfEo
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ;7N~d TBQ
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ,=`iQl3(y/
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 |/O_AnG
I
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 +cC$4t0$^A
^THyo
hK
;定位用DAP (复位到0磁道) \Culf'iX
DAP0 db 16d zAO|{m<A2
db 0 b1-'q^M
dw 1 obSLy
Ed
buff1 dw 0,0 Ae>:i7.V
dw 0,0,0,0 Oq*=oz^~1
.X{U\{c| a
qBqh>Wo
;DiskParameters /%i: (Ny
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) '*n2<y
falgs dw 0; WORD Flags; // 信息标志 `8G {-_
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 O@sJ#i>
Heads DW 0; DWORD Heads; // 磁盘磁头数 ]%I|C++0
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 poVtg}n
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 n@y*~sG]
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ]?(_}""1
kr>F=|R]
cmpsect dw 0 [M&.'X
'+E\-X
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 0i/!nke.
msgHds db 0dh,0a,"Heads:$" jT1^oXn@
msgspt db 0dh, 0a,"SectorsPerTrack:$" z*G(AcS)
msgTotal db 0d,0a, "Total Sectors:$" )UAkg
msgSS db 0dh,0a, "Sector Size:$"
s?_
H<u
FlepM*
msgReadErr db 0dh,0a,"Error Reading Sectors:$" lW3wmSWn%
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" vlh$N
K+F
msgReset db 0dh,0a, "Reseting drive to Cyl 0" &T\,kq>)
U$ 22 r b
;@V1*7y
buffer db 32768d dup(0); Yo[Pu< zR
R]"3^k*
data ends ;数据段结尾 R6-Z]Hu
dn:/8~B"X
stack segment : 5<u!-}
db 400 dup(?) {V5eHn9/Q'
stack ends n_@cjO
i[m-&
code segment ;定义代码段 TqTz
assume cs:code ;规定cs的内容 y~;w`5;|
assume ds:data ;规定ds的内容 do=s=&T
assume ss:stack Gc{s?rB_
s!WI:E7
start: s.XLC43Rs
pusha l$3YJ.n|s~
5yQ\s[;o3
$gysy!2}.
mov ax,data ;程序从start开始 W,ik
;P\
mov ds,ax ;ds置初值,data的段地址 P%Tffsl
f%Vdao[
;设置缓冲区 b]Z>P{ j
lea bx, buffer \#q|.d$u
mov bufferaddr,bx ?qR11A};tG
mov buff1,bx U$^ $7g 3
mov bx,ds [?nM)4d
mov bufferaddr+2,bx Gey j`t
mov buff1,bx 41NVF_R6J
IHvrx:7
lea di,infosize @t<KS&
mov dl,80h
dIOiP\^
mov ah,48h <F<jx"/)
int 13h {x<yDDIv_
6;#Rd|
lea bx,msgcyl OzS/J;[PO[
mov dx,bx c,_??8
mov ah,09 vDcYz,
int 21h Jj,fdP#\
mov dx,cylinders 2~RG\JWTA
call dispdx |7%#z~rT
f'
%Pkk
lea bx,msghds c`xgz#
]v
mov dx,bx L2\NTNY
mov ah,09 |}naI_Qudv
int 21h ,'>O#kD
mov dx,heads &M*f4PeXb
call dispdx ;eT+Ly|{
"*Gp@
lea bx,msgspt Ff{dOV.i
mov dx,bx ,BE4z2a
mov ah,09 .ly K
,p
int 21h 52#Ac;Y
mov dx,spt+2 q@Oe}
call dispdx zt/N)5\
V
mov dx,spt )T!3du:M
call dispdx vw[i.af
d.t$VRO
lea bx,msgtotal FgTWym_
mov dx,bx vbSycZ2M7
mov ah,09 ,8Q&X~$rY
int 21h Qs7*_=+h
lea bx,sectors
22FHD4
call dispqword #0'%51Jcl
6uKS!\EY|
lea bx,msgss H?tX^HO:q
mov dx,bx feG#*m2g
mov ah,09 D%!GY1wdn
int 21h p@iU9K\,
mov dx,sectorsize 'O[0oi&
call dispdx ~9DD=5\
pT'jX^BU
sbb word ptr sectors, 63d D2MWrX
jnc subok 2tI ,`pSU
sub word ptr sectors+2,1 7j8Ou3
jnc subok >S'IrnH'!
sub word ptr sectors+4,1 ]8dzTEjk
jnc subok ?yy,3:
sub word ptr sectors+6,1 Ji7<UJ30x
%2^wyVkq:
subok: 5Sz}gP('
Q$8&V}jVW
6gTc)rhRT
yrQfPR
xor ax,ax WWG+0jQ9
mov blocknumL, ax oJe`]_XZ
mov blocknumL+2, ax
6
Eyinv
mov blocknumL+4, ax O8)N`#1>+
mov blocknumL+6, ax YG
J)_y
%hCd*[Z}j
startread: 2i)vT)~
,'&H`
h54
call rwsect ~NG+DyGa=
2+cpNk$
adc word ptr blocknuml,63d E8"$vl&c]
jnc addok xj;V
adc word ptr blocknuml+2,1 B<oBo&uA
jnc addok B\Uocn
adc word ptr blocknuml+4,1 8ib%CYR
jnc addok 3V%ts7: a
adc word ptr blocknuml+6,1 oUx%ra{
jnc addok !8OgaMngzF
g[$4a4X
addok: hD9b2KZv
mov ax, word ptr sectors+6 'mO>hD`V
cmp ax, blocknuml+6 ciGJtD&P
jg complete dq^vK
jl startread jchq\q)_z
mov ax, word ptr sectors+4 )>I-j$%=2
cmp ax, blocknuml+4 #dDM
"s
jg complete
e"&QQ-q
jl startread &l?AC%a5
mov ax, word ptr sectors+2 O#?@'1
cmp ax, blocknuml+2 @^Y
r=d ba
jg complete OU'm0Jlk
jl startread
i6 )HC
mov ax, word ptr sectors tQ(4UHqa~
cmp ax, blocknuml yoG*c%3V?
jg complete ubUVxYD?
jl startread D-4{9[
=Hx]K8N )
complete: ppzQh1
]Gf`nJDV
lea bx,msgready VMH^jCFp
mov dx,bx (
$'5xPb
mov ah,09 aM YtWj
int 21 r1/9BTPKdJ
DhD^w;f]
popa -rlCE-S
mov ax,3100h l;i/$Yu7
int 21h &gsBbQ+qA
Fx )BMP
; R'Uf#.
dispdx proc near bk:m
k[
pusha Cf>(,rt};
lea bx, dsp+3 `T3B
mov cx,4 ZaF9Q%
k8 z1AP
repeat0: UX%J?;g
mov al,dl >)+N$EN
and al,0fh Fs&r^ [/b
cmp al,09h .FC|~Z1T<F
jg add40 f"SK3hI$p
add al, 30h V
G|FjD
jmp okadd d
r$E:kr
add40: _
o.j({S
add al,37h '
r/xBj[Z
okadd: 8p_6RvG
mov byte ptr [bx],al W_lXY Z<
dec bx p v]" 2'aQ
shr dx,4 DB3qf>@?
loopnz repeat0 CD[}|N
lea bx,dsp n+ S&[Y
mov dx,bx xSq{pxX
mov ah,09h ||4T*B06
int 21h YO9;NA{sH
i!EAs`$o`
popa mM.YZUX
ret |=AaGJx
dispdx endp E
YA=f
U
LB`{35b-
dispqword proc near b_^y
Ke^W
pusha 'Ov
M
mov cx ,4 9;NXzO27
add bx,6 9_fbl:qk;\
repeatdecbx: G`RQl@W>)(
mov dx,[bx] 33g$mUB
call dispdx Lg{M<Q)
4
sub bx,2 f$ 7C 5
loopnz repeatdecbx 9e Fj+
popa )3k?{1:
ret 5bBCI\&sam
dispqword endp #mkf2Z=t-
:l&Yq!5
rwsect proc near nF$HWp>
f
+1@mGt
lea bx,msg FG^lh
mov dx,bx e,
fZ>EJ
mov ah,09h 'qJ0338d#U
int 21h H$.K
O L 9(~p
lea bx,BlockNumL VS >xvF
call dispqword r1:CHIwK
^h^.;Iqr=
lea di, packetsize 3S"
/l
mov dl,80h p>B-Ubu
mov ah,42h 9BAvE\o0
int 13h &f2:aT)
jnc readok N&