第一个宏汇编程序 zv
O:"w}
W5SN I>|E
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 CU$#0f>
z%sy$^v@vD
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! dv!r.
|m;L?)F<
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! BzN@gQo
?djQZ*
比较长啊!所以可以自动跳过。 >o/95xk2
rN5tI.iC
.286 pRi<cO
.radix 16 ashar&'
data segment ;定义数据段 4 1t)(+r
zN!j%T.e
PeTA$Yl
msg db 0dh, "Reading sector:$" V%NeZ1{ e
msg1 db 0dh, "Writing sector:$" Qxa{
UQh}9
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" H}ZQ?uK;
Sh&PNJ-*
dsp db " $" |PP.<ce\-
->gZ)?Fqy
;DAP a#[-*ou`
PacketSize db 16d; // 数据包尺寸(16字节)
gU;&$
Reserved db 0; // ==0 YGk9b+`
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) =Op+v"
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) V.=lGhi
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 hXB|g[zT
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 #;Tz[0
O0huqF$K
;定位用DAP (复位到0磁道) 8-Me.2K
DAP0 db 16d pe.QiMW{8
db 0 LFf`K)q
dw 1 qP1FJ89H
buff1 dw 0,0 h<x4YB5Mj
dw 0,0,0,0 ;Vu5p#,O<M
~h)&&'a
u0
y 1
;DiskParameters (9C<K<
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) ,
ZFE
(
falgs dw 0; WORD Flags; // 信息标志 jc:s` 4
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 42+#<U7T
Heads DW 0; DWORD Heads; // 磁盘磁头数 $,27pkwHeW
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 Riry_
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 2k5/SV
X
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) %j+xgX/&
F9flSeN
cmpsect dw 0 ub K7B |p
%J~WC$=Qv
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" fU+Pn@'
msgHds db 0dh,0a,"Heads:$" z|N3G E(.@
msgspt db 0dh, 0a,"SectorsPerTrack:$" _O]xey^r
msgTotal db 0d,0a, "Total Sectors:$" l]6%lud8_
msgSS db 0dh,0a, "Sector Size:$" Q5a)}6-5
p2%
msgReadErr db 0dh,0a,"Error Reading Sectors:$" nwmW.(R4
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" u:dx;*
msgReset db 0dh,0a, "Reseting drive to Cyl 0" [[+ pMI
9 OT,TpA
|E3X
buffer db 32768d dup(0); G
P a`e
X+82[Y,mB.
data ends ;数据段结尾 /*rhtrS)
k)7{Y9_No
stack segment rwf^,r"r
db 400 dup(?) ig!7BxM)<h
stack ends xDLG=A%]z
L'Q<>{;Ig
code segment ;定义代码段 o:p
*_>&
assume cs:code ;规定cs的内容 =L]Q2V}
assume ds:data ;规定ds的内容 s?C&s|'.
assume ss:stack se9>.}zZN
=#xK=pRy;
start: Z`Z5sj 4{
pusha sa&) #Z:
F0lOlS
.iwZ*b{
mov ax,data ;程序从start开始 9`B$V##-L
mov ds,ax ;ds置初值,data的段地址 ej(ikj
~j
YY5!_k
;设置缓冲区 J'T=q/
lea bx, buffer D Ml?o:l
mov bufferaddr,bx DAO]uh{6
mov buff1,bx <q2?S
mov bx,ds 'T8W!&$
mov bufferaddr+2,bx z-T{~{q
mov buff1,bx s:>\/[*>0c
pv,45z0
lea di,infosize >BVoHt~;
mov dl,80h Jkt4@h2Q}
mov ah,48h k cuzB+
int 13h s60
TxB
=O$M_1lp
lea bx,msgcyl 19UN*g3(
mov dx,bx Hi}RZMr1
mov ah,09 c&nh>oN
int 21h xTz%nx
mov dx,cylinders |>
enp>
call dispdx PnYBy| yl
g(4b
Ba9y
lea bx,msghds quxdG>8
mov dx,bx 7'lZg<z{~j
mov ah,09 r 2:2,5_
int 21h `3_lI~=eH
mov dx,heads gm"#:< )
call dispdx aSutM
ec3<%+0f
lea bx,msgspt Ond'R'3 \E
mov dx,bx S<wj*"|.s
mov ah,09 9jir*UI
int 21h N.do "
mov dx,spt+2 !|Q5Zi;aX7
call dispdx ipE]}0q
mov dx,spt pY"O9x
call dispdx [
<c&|tfl
, X{>
lea bx,msgtotal +0l`
5."d
mov dx,bx }^kL|qmjR
mov ah,09 !wz/cM;
int 21h Cb;WZ3HR
lea bx,sectors vX|UgK?2^
call dispqword T^.Cc--c
/~p+j{0L3W
lea bx,msgss }T_Te?<&
mov dx,bx BMyzjteS+
mov ah,09 {w6/[-^
int 21h ca<"
mov dx,sectorsize X6e/g{S)
call dispdx .ic:`1
5@~|*g[
sbb word ptr sectors, 63d |a^U]
jnc subok RP4Ku9hk
sub word ptr sectors+2,1 Nf41ZT~
jnc subok f58?5(Dc|
sub word ptr sectors+4,1 {FO$yw=>
jnc subok 5\
fCd|
sub word ptr sectors+6,1 V ~{fB~
rf&M!d}!
subok: K4ZolWbU
;q>9W,jy
qoMfSz"(
J @IS\9O
xor ax,ax gb|Q%LS9R
mov blocknumL, ax zbkMFD.{y
mov blocknumL+2, ax %kshQ%P)?
mov blocknumL+4, ax 9LC&6Q5O&
mov blocknumL+6, ax @~td`Z?1y
T
1WWK'
startread: ),}AI/j;zY
0MF}^"R
call rwsect ?#A]{l
yR5XJ;Tct
adc word ptr blocknuml,63d eGL1
jnc addok Ol_q{^
adc word ptr blocknuml+2,1 EbNd=Z'J
jnc addok AnBJ(h
adc word ptr blocknuml+4,1 J9~i%hzr
jnc addok 8 .>/6M
adc word ptr blocknuml+6,1 !~i'
-4]
jnc addok 2BXy<BM @
W i.5Y{
addok: 3>M&D20Z
mov ax, word ptr sectors+6 bC!`@/
cmp ax, blocknuml+6 X;F8_+Np
jg complete >w6taX
jl startread 5&Ts7& .
mov ax, word ptr sectors+4
08bJCH
cmp ax, blocknuml+4 s"KJiQKGM
jg complete w4,Ag{t>
jl startread nAJdr*`a,5
mov ax, word ptr sectors+2 Gbpw5n;e
cmp ax, blocknuml+2 7r#ymQ
jg complete rh*sbZ68>E
jl startread !A3-0zN!
mov ax, word ptr sectors W#fZ1E6
cmp ax, blocknuml K>:]Bx#F7
jg complete `_ %S
jl startread 5K%SL1N
cf_|nL#9
complete: 6?tlU>A2s
U&Wwyu:4i
lea bx,msgready d~J-|yyT
mov dx,bx CTa#Q,
mov ah,09 bBcp9C)iY
int 21 B5%n(,Lx
E>LkJSy=
popa jhgX{xc
mov ax,3100h {V19Zv"j
int 21h T4/fdORS
SymwAS+
; T=f|,sK +7
dispdx proc near :nN1e
pusha Ga>uFb}W~
lea bx, dsp+3 `O?T.p)
mov cx,4 CBYX]
y
m,H@~
repeat0: )::>q5c
mov al,dl :(|'S4z
and al,0fh G6P)C##ibn
cmp al,09h ?tdd3ai>
jg add40 @oP_
;G
add al, 30h {PU!=IkTS
jmp okadd D1
Z{W
add40: eDI=nSo
add al,37h zdl%iop3e
okadd: e> rRTN
mov byte ptr [bx],al q<W=#Sx
dec bx {~GYj%-^
shr dx,4 6DIZ@ oi
loopnz repeat0 _9H*agRe
lea bx,dsp f>o,N{|
mov dx,bx -/C)l)V}
mov ah,09h #hfuH=&oh
int 21h [jdFA<Is
^[E'1$D
popa 6DTTV66
ret o Pci66
dispdx endp LWoG4s?w
d$ACDX2
dispqword proc near C;+(Zp
pusha 0-Y:v(|.
mov cx ,4 *.-
.iY.a]
add bx,6 ^)!F9h+
repeatdecbx: O=cxNy-I
mov dx,[bx] 1F'1>Bu~
call dispdx .{KjE
g 6
sub bx,2 s'aip5P
loopnz repeatdecbx b3-eR5U/
popa #t8{R~y"gv
ret [D"t~QMr
dispqword endp #eZ6)i<
]Y>h3T~
rwsect proc near Z7rJ}VP
q#A (gyy
lea bx,msg mMx ;yZ
mov dx,bx ]M>9ULQ
mov ah,09h 8M*PML4r
int 21h w.\w1:d
d6{Gt"
lea bx,BlockNumL ^efb
5
call dispqword O`GsS{$sS
sxKf&p;
lea di, packetsize `vG,}Pt]
mov dl,80h {#P`^g
mov ah,42h `nXVE+E@
int 13h h}_~y'^!
jnc readok AmPMY:1i"
7\zZpPDV
mov cx,5 G0 J4O!3
;出错后重试(定位0道后再重读) AE`We
$!
retryrd:
9fnA
lea bx, msgReadErr i@5[FC
mov dx,bx ]?1Y
e8>Y<
mov ah,09 5Z/GK2[HL
int 21h o;a:Dd
\@3Qi8u//
cq&*.
lea di,dap0 GPhl4#'
mov dl,80h c
}*2$1
mov ah,44h <:/&&@2
int 13h GDhE[of
Ma *y=d;,1
lea bx,BlockNumL `i) 2
nNJ"
call dispqword anw}w!@U
LH 3}d<{
lea di, packetsize mffn//QS
mov dl,80h SKuIF*"!S
mov ah,42h B&+`)E{KB
int 13h XY.5Rno4
jnc readok EFuvp8^y
loopnz retryrd u cwnA
>h2%[j=
readok: =p^He!
lea di, packetsize HmfG$Z
mov dl,80h v[@c*wo
mov ah,43h .roqEasu8
int 13h EpS(o>'
/yz=Cj oz
rwsect endp ,ox
cq?7#4
)3YtIH_
code ends ;代码段结尾 =(a1+.O
end start ;结束汇编 GuZ( &G6*
,/&'m13b/L