第一个宏汇编程序 PVp>L*|BZ;
PXYLLX\3
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 cJaA*sg
yy=hCjQ)
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! }LS8q
EN\cwa#FU
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 38p"lT
G9^`cTvv'8
比较长啊!所以可以自动跳过。 A6]X
aF
Hs'~)T
.286 q+\<%$:u
.radix 16 i,r:R
g~
data segment ;定义数据段 G|f9l?p
3?a`@C&x
uAeo&|&
msg db 0dh, "Reading sector:$" BYX c
'K
msg1 db 0dh, "Writing sector:$" &&9|;0<
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" FHQ`T\fC$@
Hvm}@3F|
dsp db " $" B6
(\1
0>Snps3*Z
;DAP `!Z?F]):G
PacketSize db 16d; // 数据包尺寸(16字节) a%B&F|u
Reserved db 0; // ==0 h8asj0
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) d<7b<f"~
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) &L$9Ii
BlockNumL Dw 0,0; // 磁盘起始绝对块地址
;6P>S4`w
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 m%`YAD@2z
}6%XiP|
;定位用DAP (复位到0磁道) ]"Uzn
DAP0 db 16d &|{1Ws
db 0 qIQ=OY=6
dw 1 IS&qFi}W|W
buff1 dw 0,0 {73V?#P4
dw 0,0,0,0 (l^7EpNs
H]R/=OYBUh
"ktuq\a@
;DiskParameters bpwA|H%{M
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) [w'Q9\,p
falgs dw 0; WORD Flags; // 信息标志 K 77iv
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 iVn4eLK^v
Heads DW 0; DWORD Heads; // 磁盘磁头数 \)N
o?fB
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ;7z6B|8
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 XqmB%g(
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) l; _IH|A
C7ivAh
cmpsect dw 0 ~^' ,4<K-}
HK/WO jr
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" t<Yi!6
msgHds db 0dh,0a,"Heads:$" E+O{^C=
msgspt db 0dh, 0a,"SectorsPerTrack:$" 49Jnp>h
msgTotal db 0d,0a, "Total Sectors:$" U_"!\lI_yg
msgSS db 0dh,0a, "Sector Size:$" 9)1Ye
ZQE1]ht
msgReadErr db 0dh,0a,"Error Reading Sectors:$" NSz}
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" c EYHB1*cT
msgReset db 0dh,0a, "Reseting drive to Cyl 0" ]##aAh-P4&
~Mn3ADIb=
Sc[#]2 }
buffer db 32768d dup(0); q k^FyZ<
RH;ulAD6(~
data ends ;数据段结尾 Dhn7N8(LF!
%m
|I=P
stack segment +_7a/3kh
db 400 dup(?) :,0(aB
stack ends q-<DYVG+
7yfh4-1M
code segment ;定义代码段 ]@Zv94Z(
assume cs:code ;规定cs的内容 kP%hgZ
assume ds:data ;规定ds的内容
T06(Q[)
assume ss:stack *yRsFC{,
88osWo6rG
start: 60!%^
O =
pusha Dm}eX:'{
oN,1i
g
xUdGSr50
mov ax,data ;程序从start开始 R7Y_ 7@p
mov ds,ax ;ds置初值,data的段地址 `xBoNQai
~|}]
;设置缓冲区 {oqbV#/&
lea bx, buffer }CBQdH&g;
mov bufferaddr,bx '|SO7}`;Q
mov buff1,bx +-@n}xb@
mov bx,ds c9-$^yno
mov bufferaddr+2,bx <l5i%?
mov buff1,bx t<##0#xS.
[_'A(.
lea di,infosize 6#+&/ "*
mov dl,80h |ky40[C
mov ah,48h "sN%S's
int 13h *,$5EN
M4C8K{}
lea bx,msgcyl @vlP)"
mov dx,bx +-<G(^
mov ah,09 d. vNiq,`
int 21h SCcvU4`o
mov dx,cylinders \ZLi Y
call dispdx :0l+x0l}
#h[>RtP:
lea bx,msghds o%?)};o
mov dx,bx @-)?uYw:r
mov ah,09 UN.;w3`Oc
int 21h ur}'Y^0iR
mov dx,heads ;0 B1P|7zK
call dispdx h
~ k<"
vdq=F|&
lea bx,msgspt uslu-|b!%
mov dx,bx ^Lgvey%
mov ah,09 w{W+W
J
int 21h ,-AF8BP
mov dx,spt+2 n?@zp<
call dispdx Rs<q
^w]
mov dx,spt )*BZ
o
>"
call dispdx 4{uQ}ea
d%8n
lea bx,msgtotal %b^4XTz
mov dx,bx @A1f#Ed<
mov ah,09 ^L2d%d\5
int 21h Hx gC*-A$/
lea bx,sectors
#%;Uh
call dispqword Nu"v
.]Y2
|eu8;~A
lea bx,msgss YcobK#c
mov dx,bx .|O T#"LP
mov ah,09 '8;bc@cE
int 21h J 4gtm"2)
mov dx,sectorsize uy
hh"[
call dispdx { ^dq7!
{1SsH
ir>
sbb word ptr sectors, 63d S&!(h
{O
jnc subok zo ?RFn
sub word ptr sectors+2,1 |0i{z(B
jnc subok a yoC]rE
sub word ptr sectors+4,1 s>J5.Z7"'j
jnc subok Ku,wI86
sub word ptr sectors+6,1 *-9i<@|(U^
OvX&5Q5
subok: yI:
;+K
qf x*a88
5IF5R#
A'jvm@DvQI
xor ax,ax ,m#
mov blocknumL, ax 3lp'U&3`5
mov blocknumL+2, ax
jB?SX
mov blocknumL+4, ax \AwkK3
mov blocknumL+6, ax (.:*GUg
unFRfec{
startread: %/Wk+r9uu
;TJpD0
call rwsect L(;$(k-/(
UOZ+&DL,L
adc word ptr blocknuml,63d :PT{>r[
jnc addok 9w=7A>.U
adc word ptr blocknuml+2,1 XjN4EDi+E
jnc addok ^`kwSC
adc word ptr blocknuml+4,1 ?9\D(V
jnc addok OE@[a
adc word ptr blocknuml+6,1 VgNB^w
jnc addok N\PdX$
JUr
t%2
addok: c7XBZ%D
mov ax, word ptr sectors+6 /i,n75/y?
cmp ax, blocknuml+6 X}Oe 'y
jg complete i3w~&y-
jl startread gQPw+0w
mov ax, word ptr sectors+4 KkCGL*]K
cmp ax, blocknuml+4 @U_CnhPQq
jg complete sE[`x^1'8
jl startread !_W/p`Tc
mov ax, word ptr sectors+2 B%8@yS
cmp ax, blocknuml+2 qzZ/%{Ak
jg complete -V}oFxk]q
jl startread +aOdaNcI
mov ax, word ptr sectors I}_}VSG(
cmp ax, blocknuml R/oi6EKv
jg complete Y%?S:&GH
jl startread `q36`Wn
p*b_"aF 1
complete: >%tG[jb
lI?
P_2AaS
lea bx,msgready J%CCUl2
mov dx,bx _qa]T'8
mov ah,09 T[SK>z
int 21 )h}IZSm
|]9@JdmV
popa r?/Uu
&
mov ax,3100h G!6b
)4L-
int 21h &[[r|
Nm"P8/-09
; e`n ZiM>
dispdx proc near >/A]C$?3
pusha WML--<dU
lea bx, dsp+3 wyy
1M+
mov cx,4 K83
'`W^
HV~Fe!J_
repeat0: Xfk
DMh
mov al,dl >:-e
and al,0fh [#Qf#T%5h
cmp al,09h uN)c!='I
jg add40 {32
m&a
add al, 30h (xb2H~WrN
jmp okadd hWy@?r.
add40: +cH>'OXoB
add al,37h 7FE36Ub9
okadd: tKV,
mov byte ptr [bx],al +Vk L?J
dec bx
PuJ3#H
T
shr dx,4 #Nh'1@@
loopnz repeat0 8%K{l g"
lea bx,dsp n[Q(q[ULV
mov dx,bx bA)nWWSg=
mov ah,09h zP44
Xhz
int 21h VO0:4{-
Y!L-5|G
popa dx@dnWRT,
ret nB`|VYmOP1
dispdx endp /0/ouA>+
G=zNZ
dispqword proc near MDF_Xr-hZ
pusha 1D'r;`z
mov cx ,4 |*c1S
-#
add bx,6 }&vD(hX
repeatdecbx: xE8?%N U
mov dx,[bx] #^L&H
oo6
call dispdx r]!#v{#.
sub bx,2 D"pT?\kO
loopnz repeatdecbx +mWf$+w
popa 'W(u.
ret ~P'.R.e
dispqword endp hr];!.Fv
GURiW42
rwsect proc near h^ Cm\V
xqX3uq
lea bx,msg M G$+Blw>
mov dx,bx
$eFMn$o
mov ah,09h [h'u@%N|/
int 21h )NZH{G
0OM^,5%8
lea bx,BlockNumL 9295:Y| w1
call dispqword WK6,K92
p3Ux%/ZqPV
lea di, packetsize c]uieig0~
mov dl,80h 8NfXYR#
mov ah,42h ZPH_s^
int 13h ye.6tlW
jnc readok !`e`4y*N
@*y4uI6&
mov cx,5 W_}j~[&
;出错后重试(定位0道后再重读) e6taQz@}
retryrd: 7su2A>Ix
lea bx, msgReadErr I,hw
0e
mov dx,bx Onq^|r's&
mov ah,09 dcY(1p)
int 21h 5f7id7SI
DO(};R%=
zp
woK&T+
lea di,dap0 Oo
:Dt~Ib
mov dl,80h A;L
]=J
mov ah,44h KVOV<uDCj
int 13h A&M_ J
O]tR~a
lea bx,BlockNumL Pdf-2
Tx
call dispqword 4J5 zSTw
J3mLjYy
lea di, packetsize &<;T$Y
mov dl,80h g!}]FQBb
mov ah,42h ><}nZ7
int 13h 56)!&MF
jnc readok PgA<pfEHE
loopnz retryrd ` Tap0V
-*k2:i`
readok: vi}16V84l
lea di, packetsize *<sc[..)
mov dl,80h Oz6$u
mov ah,43h :XhF:c[.:
int 13h I#2$CSJ
i9L]h69r
rwsect endp TO.b-
;
{g.YGO
code ends ;代码段结尾 c0zcR)=mL
end start ;结束汇编 K[icVT2v~
Q/SO%E`E