第一个宏汇编程序 +j(d| L\
JoRT&rkd
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 I8+~ &V}
fMGbODAvY
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! =8r 0 (c
U7!.,kR-
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! AjJURn0`,!
AS E91T~
比较长啊!所以可以自动跳过。 -RO7
'm0
r|PFw6
.286 nL$x|}XAcj
.radix 16 psnTFe
data segment ;定义数据段 3uZJ.Fb
\Y|~2Ls8tu
YY&l?*M<
msg db 0dh, "Reading sector:$" YLwnhy>dD
msg1 db 0dh, "Writing sector:$" i<H wTmm$
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Ubh{
!Y
D?C)BcN
dsp db " $" Q:|l`*.R
lIUuA
;DAP %FS$zOsgGK
PacketSize db 16d; // 数据包尺寸(16字节) o Y1';&BO9
Reserved db 0; // ==0 #VB')^d<U
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) 28/ A
DZ
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) Ma'_e=+A
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 >$ NDv
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 V$"ujRp
/n5F(5<
;定位用DAP (复位到0磁道) lc2 i`MC
DAP0 db 16d `(1K
db 0 T[,/5J
dw 1 W%.v.0
buff1 dw 0,0 2<`.#zIds
dw 0,0,0,0 ZDD..j
{fha`i
ZA Jp%
;DiskParameters ?OE.O/~l
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) k% sO 0
falgs dw 0; WORD Flags; // 信息标志 Nc:({@I
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 pM{nh00[
Heads DW 0; DWORD Heads; // 磁盘磁头数 |o2sbLp
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 }j2
Y5
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 e'*`.^
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) -6tgsfEr
<V7>?U l
cmpsect dw 0 Di@GY!
a 4=N9X
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 1G0fp:\w
msgHds db 0dh,0a,"Heads:$"
%r-V2)
msgspt db 0dh, 0a,"SectorsPerTrack:$" 1i
X)d)(b
msgTotal db 0d,0a, "Total Sectors:$" 2RqbrY n
msgSS db 0dh,0a, "Sector Size:$" 3' ~gviI
qw7@(R'"
msgReadErr db 0dh,0a,"Error Reading Sectors:$" zaFt*~@X
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" +$$$
msgReset db 0dh,0a, "Reseting drive to Cyl 0" Kx.X 7R
%&->%U|'
UK$ms~H
buffer db 32768d dup(0); aM@z^<Ub
J[A14z]#`
data ends ;数据段结尾 S#-wl2z
{&P
FXJ
stack segment aWwPvd3
db 400 dup(?) Y 2Q=rj
stack ends Rx*BwZ
:}h>by=
code segment ;定义代码段 _(d.!qGz
assume cs:code ;规定cs的内容 X=6
y_^
assume ds:data ;规定ds的内容 t~e<z81p
assume ss:stack 6\u!E~zy
,bM-I2BR
start: b{d4xU8'
pusha *\wp?s>-t
P7 ]z
bn(`O1r[(
mov ax,data ;程序从start开始 oT{@_U{*J
mov ds,ax ;ds置初值,data的段地址 Q.9qImgN
~`GhS<D
;设置缓冲区 1=|7mehL%
lea bx, buffer LAP6U.m'd
mov bufferaddr,bx Dy]I8_
mov buff1,bx [97KBoSU
mov bx,ds Ul_M3"Z
mov bufferaddr+2,bx 3)ma\+< 6
mov buff1,bx OdQT2PA_
+vNZW@_$D
lea di,infosize J0
k
mov dl,80h h'i{&mS_b
mov ah,48h &n[~!%(
int 13h %*o8L6
Hn
;>%~9j1C
lea bx,msgcyl zW}[+el}
mov dx,bx =\,uy8HX
mov ah,09 'DCFezdf3
int 21h 'S<%Xm
mov dx,cylinders T1`|~Z?g-
call dispdx j}BHj.YuP
TDg@Tg0
lea bx,msghds +&X%<S
W
mov dx,bx Zes+/.sA}]
mov ah,09 !PMU O\y
int 21h 2>]a)
mov dx,heads Nrah;i+H\o
call dispdx \XF}?*8
p1D[YeF4
lea bx,msgspt K.%U
mov dx,bx Xt{*N-v\
mov ah,09 jSOS}!=
int 21h )jCo%P/
mov dx,spt+2 "c(Sysl.L
call dispdx D?~8za`5
mov dx,spt =(EI~N
call dispdx )-Ej5'iHr
tM,%^){p$
lea bx,msgtotal sowd`I~
mov dx,bx 4"@GNk~e
mov ah,09 9Ew7A(BG_3
int 21h ?f*Q>3S)
lea bx,sectors 4g}FB+[u
call dispqword SVa6V}"Iv
/({;0
I*!i
lea bx,msgss R*zO
dxY
mov dx,bx yoRU_%xA
mov ah,09 .}k(L4T|=
int 21h ygSL
mov dx,sectorsize QN>7~=`
call dispdx ZUp\Ep}
`e]6#iJ^
sbb word ptr sectors, 63d @ct+7v~
jnc subok 1[E#vdbT
sub word ptr sectors+2,1 !ph" mf$-
jnc subok ]WUC:6x
sub word ptr sectors+4,1 aup6?'G;
jnc subok =39 ?:VoD
sub word ptr sectors+6,1 tu>{
DY{cQb
subok: `p0ypi3hn
nRb^<cZf
/<&h@$NHH4
KECElK3uj
xor ax,ax j J3
zF3Id
mov blocknumL, ax Nwc!r(
mov blocknumL+2, ax B51kV0
mov blocknumL+4, ax 6yu]GK}es
mov blocknumL+6, ax 16X@^j_
RA],lNs
startread: Z,c,G2D
J9%@VZut
call rwsect QC0!p"
D6~+Y~R
adc word ptr blocknuml,63d &[a Tw{2
jnc addok ~P-*}q2J
adc word ptr blocknuml+2,1 B/J&l
jnc addok mPPk)qy
adc word ptr blocknuml+4,1 o5Y2vmz?9
jnc addok IN7<@OS7
adc word ptr blocknuml+6,1 85IMdZ7I
jnc addok _Mc>W0'5@
dQgk.k
addok:
Ch_xyuJ
mov ax, word ptr sectors+6 xMs]Hs
cmp ax, blocknuml+6 CKlL~f EL
jg complete Te{ *6-gO3
jl startread WlV
z,t'if
mov ax, word ptr sectors+4 pi@Xkw
cmp ax, blocknuml+4 6P`)%zj
jg complete E2AW7f(/
jl startread VW@ x=m
mov ax, word ptr sectors+2 zTo8OPr
cmp ax, blocknuml+2 w%c
jg complete }wwe}E-e
jl startread U@Tj
B
mov ax, word ptr sectors 'PlaM Oy
cmp ax, blocknuml JR9$.fGJ
jg complete ~|Z'l%<Os
jl startread C;Ic
tZ2K$!/B
complete: !umEyd@ "
I,ci >/+b
lea bx,msgready 0_ yP\m
mov dx,bx [9mL $;M
W
mov ah,09 PfG`C5
d
int 21 i3mAfDF
gV U1Y6.
popa ]lS@}W\
mov ax,3100h V%CUMH =U
int 21h Y\+KoR';
Ybg-"w
; R4e&^tI@*
dispdx proc near 2.Yi(r
pusha (0Naf
lea bx, dsp+3 DF1<JdO+
mov cx,4 p"`%
Zt@Z=r:&
repeat0: K(T\9J.
mov al,dl {13!vS%5
and al,0fh ,Vd7V}t
cmp al,09h ekQrW%\3
jg add40 T~gW3J
add al, 30h x.$1<w64t
jmp okadd X6RQqen3:
add40: !asqr1/
add al,37h uXQ >WI@eF
okadd: Qu%D
mov byte ptr [bx],al fT
Y/4(
dec bx 5V-jMB
shr dx,4 6'OO-o
loopnz repeat0 %do1i W
lea bx,dsp Q;h3v1GC\P
mov dx,bx {hqAnZ@]vr
mov ah,09h \k.vN@K#
int 21h V+Xl9v4O
!:fv>FEI9
popa TSL9ax4j
ret 0O2n/`'
dispdx endp {.k)2{
4p) e}W*
dispqword proc near U!e6FHj7
pusha $T }Tz7(
mov cx ,4 qJ8-9^E,L
add bx,6 UQd6/mD`e
repeatdecbx: .d
q
"k
mov dx,[bx] H5nS%D
call dispdx zuL7%qyv
sub bx,2 vz`@x45K
loopnz repeatdecbx xi'<y
popa *]s&8/Gmb
ret tkuc/Z/@
dispqword endp Mth6-^g5
h3Fo-]0
rwsect proc near #Ogt(5Sd
TYjA:d9YH
lea bx,msg tSv0" L
mov dx,bx I__ 4I{nI
mov ah,09h 3gfimD$ _E
int 21h _$/
+D:K
zW4O4b$T
lea bx,BlockNumL 8SnS~._9
call dispqword gbOCR1PBg
[cU,!={
lea di, packetsize GVd48 *
mov dl,80h }fIqH4bp
mov ah,42h EZ#gp^$
int 13h +nZRi3yu=
jnc readok /N^~U&7
xRDi
Rj
mov cx,5 &1)xoZ'
\
;出错后重试(定位0道后再重读) `1p 8C%
retryrd: d*;$AYI#R
lea bx, msgReadErr EychR/s
mov dx,bx $V8vrT#:
mov ah,09 A%ywj'|z
int 21h K5ZnS`c;
zTCP)x
S2=%x.
lea di,dap0 "S(X[Y'
mov dl,80h 5n:71$6[
mov ah,44h C|z%P}u#p
int 13h Ly(P=M>"y
r(uP!n1+
lea bx,BlockNumL %!.M~5mCd
call dispqword f\ "`7
,9ml>ji`=
lea di, packetsize ~v:#zU
mov dl,80h C?H{CP
mov ah,42h E`p
'L!z
int 13h aIvBY78o
jnc readok WOndE=(V
loopnz retryrd _|n=cC4Qu
6w#nkF
readok: z] @W[MHY
lea di, packetsize rS~qi}4X
mov dl,80h LXhaD[
1Rb
mov ah,43h rm+v(&
int 13h PHR#>ZD
d$1#<