第一个宏汇编程序 Lp+?5DjLT
~`0=-Qkd
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 D6'-c#
C2L=i3R
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! yQFZRDV~
JaN53,&<
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 3)l<'~"z<
-(E-yCu
比较长啊!所以可以自动跳过。 n]K {-C;
FX
~pjM
.286 +X>Aj=#
.radix 16 kcP&''
data segment ;定义数据段 99[v/L>F
WVx^}_FD0
/f>I;z1
msg db 0dh, "Reading sector:$" 4EhWK;ra
msg1 db 0dh, "Writing sector:$" %.:]4jhk
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Fl\kt.G
|jKFk.M
dsp db " $" 7V"Jfh4_
!A+jX7Nb
;DAP vtq47i
PacketSize db 16d; // 数据包尺寸(16字节) ~S0T+4$
Reserved db 0; // ==0 Mu_'C$zA
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) :x!'Eer
n
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ?~;
q r
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 K48QkZ_gY
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 \~T&C5
LOk J
;定位用DAP (复位到0磁道) 8>:u%+C1c
DAP0 db 16d c}2"X,
db 0 wy""02j
dw 1 u}jC$T>2%6
buff1 dw 0,0 hM8FN
dw 0,0,0,0 zKf0 :X
I.1(qbPkF+
(V`ddP-
;DiskParameters *{=q:E$
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) y*
lAmO
falgs dw 0; WORD Flags; // 信息标志 %,udZyO3uR
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 #
tU@\H5kN
Heads DW 0; DWORD Heads; // 磁盘磁头数 )+a]M1j
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 I$f'BAw
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 NDG?Xs [2
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) sb%l N
"g1Fg.o
cmpsect dw 0 [t]q#+Zs
_!o0bYD
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" >NA{* *$0
msgHds db 0dh,0a,"Heads:$" bFfDaO<k
msgspt db 0dh, 0a,"SectorsPerTrack:$" tSiQrI
msgTotal db 0d,0a, "Total Sectors:$" {HP.HK
msgSS db 0dh,0a, "Sector Size:$" UJ&gm_M+kL
jG,^~5x
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 7K/t>QrBtU
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 3`ze<K((
msgReset db 0dh,0a, "Reseting drive to Cyl 0" vARZwIu^D
}G<A$*L1
^ E3 HY@j
buffer db 32768d dup(0); %z["TVH
}vW3<|z
data ends ;数据段结尾 :Lq=)'d;6
'uLYah
stack segment ::Pf\Lb>
db 400 dup(?) Y_nlIcu
stack ends oN(F$Nvk
Rm@F9D[,
code segment ;定义代码段 f/i[?
gw
assume cs:code ;规定cs的内容 f
'u[G?C
assume ds:data ;规定ds的内容 JL?|NV-
assume ss:stack q94*2@KV
21~~ =+)X
start: -n6T^vf
pusha r6e!";w:U
Bh6lK}9
B_0]$D0
^
mov ax,data ;程序从start开始 DE$T1pFV
mov ds,ax ;ds置初值,data的段地址 (FOJHjtkM
inyS 4tb
;设置缓冲区 "IoY$!Hk
lea bx, buffer sV`XJ9e|
mov bufferaddr,bx 5:l"*
mov buff1,bx V`LW~P;
mov bx,ds ^bXCYkx
mov bufferaddr+2,bx {G _|gs
mov buff1,bx R)9FXz$).
<}AmzeHr+
lea di,infosize 9~}8?kPNw=
mov dl,80h .Mzrj{^Y
mov ah,48h a0cW=0l=
int 13h 62>/0_m5
NqN9
lea bx,msgcyl /gE9 W
mov dx,bx o6S`7uwJ*/
mov ah,09 KI5099 _/
int 21h 9`DY6qfly
mov dx,cylinders cqb]LC
call dispdx Y=
^o {C6
pEiq;2{~Yn
lea bx,msghds bpfSe
mov dx,bx N<|-b0#Z6
mov ah,09 Y67i\U>?
int 21h 4,ewp coC%
mov dx,heads CdiL{zH\3
call dispdx p;{w0uld"
4?~Ei[KgQn
lea bx,msgspt V(n3W=#kky
mov dx,bx SSr2K
mov ah,09 E>qe hs,g
int 21h $+HS^m
mov dx,spt+2 `wNJ*`
call dispdx `aaT
#r
mov dx,spt 76S>xnN
call dispdx 1)!]zV
[,mcvO;
lea bx,msgtotal H=5#cPI#(^
mov dx,bx yx/qp<=
mov ah,09 \MtdT[*
int 21h |(R[5q
lea bx,sectors \J^xpR_0u
call dispqword s_`y"'^
f8L3+u
lea bx,msgss GI#TMFz3
mov dx,bx z';h5GNd>z
mov ah,09 Q37zBC0
int 21h BC1P3Sk
6X
mov dx,sectorsize w7_2JS
call dispdx '8f
h(`
8?k.4{?
sbb word ptr sectors, 63d A;Uw
b
jnc subok K?mly$
sub word ptr sectors+2,1 5>M@
F0
jnc subok 8hvh
xp
sub word ptr sectors+4,1 QEl~uhc3
jnc subok OY(znVHU
sub word ptr sectors+6,1 ps=QVX)YP
:,=Z)e
subok: m{0u+obi&w
7>|p_o`e
/M~rmIks
,
-S n
xor ax,ax u9dL-Nr`
mov blocknumL, ax D{s4Bo-
mov blocknumL+2, ax ?a-}1A{
mov blocknumL+4, ax \
ffU15@N
mov blocknumL+6, ax +4Lj}8,
}i2d
XC/
startread: *wJ'Z4_5F
kA&ul
call rwsect ktK/s!bgY
|}K7Q
adc word ptr blocknuml,63d 1z=}`,?>
jnc addok v:@ud,d<
adc word ptr blocknuml+2,1 \fD[Ej
jnc addok ~uu~NTz
adc word ptr blocknuml+4,1 Vq#_/23=$y
jnc addok
tD}HL_
adc word ptr blocknuml+6,1 F84?Mi{r2
jnc addok F6#U31Q=
2v\-xg%1
addok: $6\W8v
mov ax, word ptr sectors+6 @EcY&mP)
cmp ax, blocknuml+6 7j%sM&
jg complete ]mvVX31T
jl startread &8 4Izs/[
mov ax, word ptr sectors+4 DR#[\RzNI
cmp ax, blocknuml+4 TZk.h8
jg complete Q@#Gm9m
jl startread Dv+:d 4|"
mov ax, word ptr sectors+2 Qmn'G4#@E
cmp ax, blocknuml+2 0B~Q.tyP
jg complete BcD%`vGJ
jl startread =u]FKY
mov ax, word ptr sectors K?aUIkVs
cmp ax, blocknuml WjMP]ND#c
jg complete -q/FxESp
jl startread =6+j
Po{F
+v'n[xa1v
complete: +l_$}UN
1oIu~f{`
lea bx,msgready &0S/]E`_M
mov dx,bx {1`n^j(>
mov ah,09 %uhhQ<zs%
int 21 ;:pd/\<
'k[gxk|d2
popa )ur&Mnmm
mov ax,3100h WWYG>C[
int 21h dCM*4B<
nzORG
; _7w2E
dispdx proc near 4WV)&50
pusha &,@wLy^T
lea bx, dsp+3 98eS f
mov cx,4 _i{4 4zE
J'y*>d
W
repeat0: Gu9x4p
mov al,dl U9p^?\-=
and al,0fh \78kShx
cmp al,09h V/7?]?!xu
jg add40 >~^##bIb
add al, 30h y7#4Mcc`~
jmp okadd A)q,VSR8
add40: [u2)kH$
add al,37h \ g[A{
okadd:
},LW@Z}
mov byte ptr [bx],al Nm/Fc
dec bx 7 }sj&
shr dx,4 Vl+,OBy
loopnz repeat0 *npe]cC
lea bx,dsp |1(9_=i'
mov dx,bx !4G<&hvb
mov ah,09h -d6*M*{|
int 21h LlG~aGhel
bwAL:
popa
? /Z
hu
ret OHha5n
dispdx endp tC -H2@
C
iGN?
1|
dispqword proc near 7oI^sh k
pusha }~28UXb23
mov cx ,4 i<Be)Y-'
add bx,6 gJ>HFid_C
repeatdecbx: TID0x/j"K5
mov dx,[bx] mDp|EXN
call dispdx L)ry!BuHI
sub bx,2 ~0>{PD$@
loopnz repeatdecbx 9#@CmiIhy
popa o<-+y\J8K
ret >h
m<$3
dispqword endp 7eg//mL"6
ba
rwsect proc near lCyp&b#(L
VCvqiHn
lea bx,msg sIJ37;ZA
mov dx,bx "i_}\p.,X
mov ah,09h yw;!KUKb|
int 21h [0G>=h@u
I:aG(8Bi)H
lea bx,BlockNumL 6Pa
jBEF
call dispqword
I"=XM
H;n(qBSB
lea di, packetsize \;A\ vQ[
mov dl,80h
O}3M+
mov ah,42h lEC58`Ws
int 13h (8(z42
jnc readok {L8(5
3It'!R8 $
mov cx,5 aJ Du_
;出错后重试(定位0道后再重读) $'Hg}|53
retryrd: [Pt5c6 L:
lea bx, msgReadErr c!%:f^7
g
mov dx,bx ?iBHJ{
mov ah,09 ynN[N(m#
int 21h PF(P"f.?D
b#C"rTw
%R{clbbbn
lea di,dap0 =>CrZ23B"
mov dl,80h n
[/|M
mov ah,44h }?Y+GT"E
int 13h Yg#)@L
7>m#Y'ppl@
lea bx,BlockNumL (IR'~:W
call dispqword xf@D<}~1
U)p P^:|
lea di, packetsize
oB$D&
mov dl,80h o;JBe"1
mov ah,42h Pz"!8b-MN
int 13h w`Dzk.2
jnc readok
E
2DTE
loopnz retryrd *{)![pDYd
-3r&O:
readok: \(LHcvbb
lea di, packetsize +:d))r=n
mov dl,80h 6X:-Z3
mov ah,43h ;D[b25
int 13h {hM*h(W~3
Sk$XC
rwsect endp :L FwJ
}r/L 9
code ends ;代码段结尾 w`VmN}pR
end start ;结束汇编 <u"#Jw/VP
'vTD7a^