第一个宏汇编程序
4A2?Uhpy
Yx>"bv
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 {1b Zg
oD$J0{K6
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 6#Q K%[1!>
x*Y@Q?`>5W
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 9t#S= DP
<0PT"ij
比较长啊!所以可以自动跳过。
!OuWPH.
:
yd?x=|
.286 6CMub0
.radix 16 yfC^x%d7G
data segment ;定义数据段 q2et|QCru
k+DR]icv
NvvUSyk\;s
msg db 0dh, "Reading sector:$" zBe8,, e
msg1 db 0dh, "Writing sector:$" :M6+p'`j
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" T"0,r$3:
!ki.t
dsp db " $" Xt'sQ}
$.
[#0lCI
;DAP ?IGVErnJJC
PacketSize db 16d; // 数据包尺寸(16字节) )}_a
0bt
Reserved db 0; // ==0 y})70w@+_
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) :P(K2q3
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) \}
^E`b
BlockNumL Dw 0,0; // 磁盘起始绝对块地址
''Cay0h
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 :"!9_p(,,
T.qNCJmB
;定位用DAP (复位到0磁道) 1M}&Z H
DAP0 db 16d Y>&Ew*
Y
db 0 U8G%YGMG.4
dw 1 b/Xbs0q
buff1 dw 0,0 (1NA
dw 0,0,0,0 ]TyisaT
Vl2XDkhq
h@LHRMO
;DiskParameters ^tCd L@$AS
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) $O*O/iG
falgs dw 0; WORD Flags; // 信息标志 n2IV2^ "
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 I*`* Q$
Heads DW 0; DWORD Heads; // 磁盘磁头数 W[^qa5W<FB
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 -%I2[)F<
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 C|o`k9I#
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) V.{H9n]IO
/0eYMG+K=
cmpsect dw 0 rrCNo^W1
J:kmqk!
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" W[}s o6
msgHds db 0dh,0a,"Heads:$" P:N1#|g
msgspt db 0dh, 0a,"SectorsPerTrack:$" xu'yVt9RC
msgTotal db 0d,0a, "Total Sectors:$" HuVJ\%.
msgSS db 0dh,0a, "Sector Size:$" |a#f\
{pHM},WJ
msgReadErr db 0dh,0a,"Error Reading Sectors:$" X B_B4X1R
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" -^ C=]Medl
msgReset db 0dh,0a, "Reseting drive to Cyl 0" l}lIi8
Nq@+'<@p$
<bD>m[8,
buffer db 32768d dup(0); '`Wwt
.A
&|`C)6[C
data ends ;数据段结尾 L^{|uP15N
$e /^u[~:
stack segment "&%#!2
db 400 dup(?) gL3"Gg3
stack ends @S7sr-
!0dNQ[$82
code segment ;定义代码段 nM0[P6p
assume cs:code ;规定cs的内容 bcZf>:gVf
assume ds:data ;规定ds的内容 ?K3(D;5
&i
assume ss:stack /-i!;!
leQT-l2Bk
start: zr
U{@z$l
pusha `3Uj{w/Q:L
B.L]Rk\4
uZ=NSbYsA
mov ax,data ;程序从start开始 c~v~2DM
mov ds,ax ;ds置初值,data的段地址 U2%.S&wS,e
gc?#pP
;设置缓冲区 "1-}A(X
lea bx, buffer dzkw$m^@^
mov bufferaddr,bx "hdvHUz
mov buff1,bx |#*'H*W
mov bx,ds p}<w#p
|
mov bufferaddr+2,bx 9,^_<O@Q
mov buff1,bx L*x[?x;)@
]J#9\4Sq
lea di,infosize MX ;J5(Ae
mov dl,80h nO)X!dp}J
mov ah,48h 25&J7\P*
int 13h EMc;^ d
A<B=f<N3gV
lea bx,msgcyl mSo_} je(
mov dx,bx "kA*Vc#
mov ah,09 t&(PN%icD
int 21h UDL
RCS8i
mov dx,cylinders E~AjK'Z
call dispdx :Pv*,qHE
KW7UUXL
lea bx,msghds c-Pw]Ju
mov dx,bx oy;K_
9\
mov ah,09 c?%(Dp E
int 21h QzAK##9bfa
mov dx,heads
Dxk+P!
!K
call dispdx :(H> 2xS,s
ykFJ%sw3X
lea bx,msgspt 9Fr3pRIJ
mov dx,bx Z*Fr
B58
mov ah,09 1u|Rl:Q
int 21h %b^OeWip
mov dx,spt+2 C*G=cs\i
call dispdx j6g[N4xr
mov dx,spt A3ZY~s#Iv
call dispdx oaK%Ww6~
# (- Qx
lea bx,msgtotal i>joT><B
mov dx,bx a<h1\ `H7
mov ah,09 LbII?N8`N
int 21h N72Yq)(
lea bx,sectors [S@}T
zE
call dispqword +z$pg
}E7:ihy
lea bx,msgss "t0kAG
mov dx,bx W\L`5C
W
mov ah,09 3S&U!
int 21h ts8+V<g
mov dx,sectorsize <u=4*:QE
call dispdx CV{r5Sye
mB\C?=_
sbb word ptr sectors, 63d \fjMc }'
jnc subok .%82P(
sub word ptr sectors+2,1
XJIv1s\g
jnc subok X~xd/M=9^
sub word ptr sectors+4,1
-!\fpl{
jnc subok `~W-Xx
sub word ptr sectors+6,1 {Ixg2=E\
SnYLdwgl
subok: wm+})SOX9
L-9~uM3@\
G
5FaYL.7
I=!rbF;Z
xor ax,ax E.iSWAJ(w
mov blocknumL, ax gp-T"l
mov blocknumL+2, ax mP(kcMT"
mov blocknumL+4, ax ZoB{x*IH
mov blocknumL+6, ax 8L1oh
j
oY=q4D
startread: NzW`B^p
.WQ+AE8Q
call rwsect Z,.G%"i3C
/CIh2
]#e
adc word ptr blocknuml,63d 8+Td-\IMk
jnc addok $8crN$ye
adc word ptr blocknuml+2,1 d
O~O
|Xsb
jnc addok 4);)@&0Md~
adc word ptr blocknuml+4,1 \))=gu)I
jnc addok -&e92g&n
adc word ptr blocknuml+6,1 . ]8E7
jnc addok x{&w?ng
wlPx,UqZ
addok: sk|=% }y
mov ax, word ptr sectors+6 leCVK.
cmp ax, blocknuml+6 /N-_FMl?
jg complete W k}AmC
jl startread c c
mov ax, word ptr sectors+4 Z,X'-7YkU
cmp ax, blocknuml+4 W#Qmv^StZ
jg complete Ea(,aVlj
jl startread Ou>v
X[{
mov ax, word ptr sectors+2 ]0r|_)s
cmp ax, blocknuml+2 w;e(Gb%9
jg complete BJS-Jy$-
jl startread p)~lL
mov ax, word ptr sectors lW 81q2n
cmp ax, blocknuml "p3_y`h6+
jg complete wap3Kd>MP
jl startread p\Lq}tk<
SI6B#u-i
complete: [qoXMuC|P
SAY
f'[|w
lea bx,msgready [+Y{%U
mov dx,bx 7FF-*2@
mov ah,09 zW8*E E+,
int 21 k;5P om
?J,AB #+
popa +B|7p9qy
mov ax,3100h g_Im;1$
int 21h
x3zj
?-
-TV?E%r
; |D.O6?v@
dispdx proc near S:61vD
pusha O6]. *25
lea bx, dsp+3 Oi} T2I
mov cx,4 "Y=+Ls(3o(
7_# 1Ec|;
repeat0: nPUqMn'
mov al,dl Y+qQI MZ
and al,0fh UgN28YrW
cmp al,09h .6~`Ubr}E
jg add40 x^*1gv $o
add al, 30h OD=!&LM
jmp okadd /xJqJ_70X
add40: DKmZ
add al,37h _U{&@}3
okadd: R3X{:1{j
mov byte ptr [bx],al Y[SU&LM
dec bx ,Os? f:Y6
shr dx,4 fKtV'/X;Q
loopnz repeat0 W~Z<1[
lea bx,dsp p*l$Wj
mov dx,bx HWm#t./
mov ah,09h <*EZ@XoN>
int 21h {5|("0[F
4"=Vq5
popa |*mL1#bB
ret /1`cRyS
dispdx endp U,Mx@KdV
|7@O($ b
dispqword proc near rbZ[!LA
pusha 0ji
q-3V)
mov cx ,4 aV1lJ;0
add bx,6 5yVkb*8HS
repeatdecbx: aTzDew
mov dx,[bx] -]:GL>b
call dispdx gLsU:aeCT
sub bx,2 x#C@8Bxq=
loopnz repeatdecbx Q7bq
popa KL'z
XkS
ret HvxJj+X9
dispqword endp \x>65;
[ REf>_R
rwsect proc near KTEZ4K^o=
8I,QD`
xu
lea bx,msg jtm?z c
mov dx,bx F%rHU5CkV
mov ah,09h m%#`y\]I
int 21h #;#3%?
ir3VTqz
lea bx,BlockNumL \/|)HElKR
call dispqword
>`jU`bR@
+!0eu>~_&
lea di, packetsize 19q{6X`x
mov dl,80h NcM>{{8
mov ah,42h H@uE>
int 13h |3?
8)z\n
jnc readok rx :z#"?I
:"o
o>
mov cx,5 mceG!@t
;出错后重试(定位0道后再重读) l\$+7|W
retryrd: @$eT~ C
lea bx, msgReadErr rbqo"g`
mov dx,bx 9PUes3"v
mov ah,09 ug`NmIQP
int 21h N]YtLa,t
V,ZY*f0
9F;S+)H4
lea di,dap0 _;RVe"tR#
mov dl,80h z{]?h cY
mov ah,44h ]+H?@*b`
int 13h $ex!!rqN|
Qju`e Eo
lea bx,BlockNumL iGXBqUQ:
call dispqword 4F MAz^
b.2J]6G
lea di, packetsize gBk5wk_j|
mov dl,80h Cz^Q5F`
mov ah,42h W0cgI9
=9
int 13h Zt E##p
jnc readok VK3it3FI>3
loopnz retryrd
a1N!mQ^
o0z67(N&g
readok: q1k{
lea di, packetsize 4O{Avt7C
mov dl,80h [*m2
mov ah,43h YH:8<O,{-
int 13h B
?%L
] q~
<=
rwsect endp 8X?>=tl
qO`qJ/
code ends ;代码段结尾 {w^uWR4f
end start ;结束汇编 xeTgV&$@
/OGA$eP