第一个宏汇编程序 &M&*3
#8i DM5:EQ
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 \0).
ODA(
b<n*wH
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! $mgW|TBXCQ
lvY[E9I0
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! Uyj6Ij_Pj)
xG/B$DLn
比较长啊!所以可以自动跳过。 :Ugf3%sQ
T]HeS(
.286 Y;-$w|&P>
.radix 16
E{k$4
data segment ;定义数据段 SFv
'qDA
of659~EIW
Uc^e Ia@
msg db 0dh, "Reading sector:$" n
9PYZxy
msg1 db 0dh, "Writing sector:$" i}[cq_wJ
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" j4k\5~yzS
41Hv)}Yd
dsp db " $" 8BE] A_X
L7;8:^ v
;DAP C.].HQ
PacketSize db 16d; // 数据包尺寸(16字节) nl5A{ s
Reserved db 0; // ==0 Gh>&+UA'$1
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) J}BN}|Y@2
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset)
?I{L^j^#4
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 \|&KD
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 m Q4(<,F
%PM&`c98z7
;定位用DAP (复位到0磁道) ^m~&2l\N=
DAP0 db 16d /W9(}Id6
db 0 '
Dcj\=8
dw 1 %D1 |0v8}
buff1 dw 0,0 >~:Md
dw 0,0,0,0 SO4?3wg7
<-;/,uu
Xdh2
;DiskParameters ^F,sV*
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 4P jC[A*
falgs dw 0; WORD Flags; // 信息标志 Pm&h v*D
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 /oOZ>B%1s
Heads DW 0; DWORD Heads; // 磁盘磁头数 E@,m+
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 n&OM~Vs
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 }@x!r=O)I
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) J/LsL
k
U}@xMt8@l
cmpsect dw 0 j 5}'*
5C0![$W>
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" DK)T2{:
msgHds db 0dh,0a,"Heads:$" :aQ.:b(n
msgspt db 0dh, 0a,"SectorsPerTrack:$" ttOk6-
msgTotal db 0d,0a, "Total Sectors:$" ,2YZB*6h{
msgSS db 0dh,0a, "Sector Size:$" ];xDXQd
e[
yN
msgReadErr db 0dh,0a,"Error Reading Sectors:$" f7YBhF
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" @,Z0u2WLl6
msgReset db 0dh,0a, "Reseting drive to Cyl 0" V56WgOBxz
Yw] 7@
xt_:R~/[
buffer db 32768d dup(0); {Y
-~7@
`+z^#3l
data ends ;数据段结尾 y+3+iT@i
t:MSV?
stack segment wXjidOd$
db 400 dup(?) TyDh\f!w
stack ends `AYq,3V
KpA1Ac)T
code segment ;定义代码段 n{u\t+f
assume cs:code ;规定cs的内容 B*Q 9g r
assume ds:data ;规定ds的内容 G %'xEr0n
assume ss:stack w4(L@1
b9-IrR4h
start: X NgcBSD
pusha nv0\On7wd
T/a=z
$=iw<B r
mov ax,data ;程序从start开始 Ve2{;`t
mov ds,ax ;ds置初值,data的段地址 2n)?)w]!M
^M{,{bG
;设置缓冲区 }}"pQ!Z
lea bx, buffer G54
J'*Z
mov bufferaddr,bx v3#,Z!
mov buff1,bx oNZ_7t
U
mov bx,ds )adV`V%=>
mov bufferaddr+2,bx P q$0ih
mov buff1,bx N_IKH)
l+[:Cni
lea di,infosize 9 w$m\nV
mov dl,80h 3pg=9*{
mov ah,48h %xN${4)6
int 13h @/F61Ut
S=(<m%f
lea bx,msgcyl M@#T`aS
mov dx,bx XeX"IhgS>E
mov ah,09 J$Z=`=]t+
int 21h #MKM.T,\t
mov dx,cylinders ^|H={pd'c0
call dispdx -8xf}v~u
#F`A(n
lea bx,msghds baBBn%_V
mov dx,bx CHsg2S
mov ah,09 l|=4FIMD
int 21h jMgXIK\
mov dx,heads V:$+$"|
call dispdx -QroT`gy
<
Hkq
lea bx,msgspt TP"cEfs x
mov dx,bx N ai5!_'
mov ah,09 'C/yQvJ
int 21h @^A5{qQ\
mov dx,spt+2 ,$0-I@*V
call dispdx HcgvlFb
mov dx,spt q pCI[[
call dispdx XEgJ7h_
MC* Hl`C
lea bx,msgtotal !bP%\)5
mov dx,bx yEq7ueJ'
mov ah,09 4b:|>Z-
int 21h G@.MP|
2
lea bx,sectors )V\@N*L`ik
call dispqword F}5d>nw
v8)"skVnFG
lea bx,msgss l-Z( ]
mov dx,bx MF8-q'upyT
mov ah,09 &^r>Q`u
int 21h b~J)LXj]w
mov dx,sectorsize ;$QC_l''b
call dispdx DsejZ&
H_X^)\oJ
sbb word ptr sectors, 63d |M7cB$y
jnc subok P.}d@qD{)
sub word ptr sectors+2,1 H5T_i$W
jnc subok cg.{oM wa
sub word ptr sectors+4,1 z5kAf~A
jnc subok O2?C *
sub word ptr sectors+6,1 h q)1YO
u.|Z3=?VG
subok: ZEAUoC1E1
Nob(D'vSr
Ot2o=^Ng
;f=m+QXU
xor ax,ax 5~|{:29X
mov blocknumL, ax Y !?'[t
mov blocknumL+2, ax r- <O'^C
mov blocknumL+4, ax L=l&,ENy
mov blocknumL+6, ax G3~`]qf
Qc; kj
startread: TaN{xpo
b6bs .
call rwsect gcU*rml
_y@].G
adc word ptr blocknuml,63d ;f[lq^eV
jnc addok 4f([EV[6dK
adc word ptr blocknuml+2,1 :OG I|[
jnc addok l4>^79* *
adc word ptr blocknuml+4,1 c-sjYJXKM*
jnc addok T#))_aC
adc word ptr blocknuml+6,1 U[@y8yN6M
jnc addok 2;8m0+tl
Y()"2CCV
addok: m^k0j/
mov ax, word ptr sectors+6 1^!SuAA@
cmp ax, blocknuml+6 Nc
;O)K!FH
jg complete T$I_nxh[)L
jl startread ;V
xRaj?
mov ax, word ptr sectors+4 0B}4$STOo[
cmp ax, blocknuml+4 6qWUo3
jg complete /|IPBU 5
jl startread *'?7OL
mov ax, word ptr sectors+2 VPe0\?!d
cmp ax, blocknuml+2 X2z<cJG|d@
jg complete xT%`"eM}
jl startread ?, S/>SP
mov ax, word ptr sectors x4oWZEd
cmp ax, blocknuml !sb r!Qt
jg complete =~B"8@B
jl startread mQj=-\p
JZ:@iI5>+
complete: AcC &Q:g
uM-,}7f7
lea bx,msgready X\AH^I6S
mov dx,bx 1~5DIU^
mov ah,09 !+eH8
int 21 SIe!=F[
V!W.P
popa ;mkkaW,D*
mov ax,3100h `*C=R
_
int 21h 2
T!Ti
u
bGPE0}b
; gc9R;B1
dispdx proc near 558P"w0"X
pusha j/FLEsU!R
lea bx, dsp+3 Y`;}w}EcgR
mov cx,4 0!T`.UMI
nHseA
repeat0: @^P^-B
mov al,dl fpD$%.y'J
and al,0fh D 2X_Yv
cmp al,09h "& ,ov#
jg add40 -U d^\
Yy
add al, 30h JvpGxj
jmp okadd CSO'``16
add40: 6l#x1o;
add al,37h Q&} 0owe
okadd: (W
~K1]
mov byte ptr [bx],al Mo,&h?VOM?
dec bx <+`%=r)4
shr dx,4 ZJ
Yn[\]
loopnz repeat0 /wV|;D^ )
lea bx,dsp !@xO]Jwv
mov dx,bx Wg']a/m
mov ah,09h l":W@R
int 21h gcJ!_KZK
tt"<1
z@
popa C=:<
[_m`
ret ~r1pO#r-
dispdx endp &X=7b@r
%rzPh<>e
dispqword proc near szI7I$Qb
pusha 2KlQ[z4Ir
mov cx ,4 kZ40a\9
Ye
add bx,6 U2q6^z4l
repeatdecbx: $x0SWJ \G
mov dx,[bx] z
p E|
call dispdx g.lTNQm$u
sub bx,2 Lc*>sOm9
loopnz repeatdecbx T] zEcx+e
popa ;<[X\;|'
ret kT%wt1T4
dispqword endp O tG\Uw8
d*gAL<M7E
rwsect proc near '![oLy
P@{x@9kI
lea bx,msg H iyg1
mov dx,bx b;k+N`
mov ah,09h L:z0cvn"
int 21h 3S^0%"fY
xa>|
k>I
lea bx,BlockNumL ;cor\R
call dispqword ;_o]$hV|
;]{ee?Q^ld
lea di, packetsize |>.Q U3
mov dl,80h _BczR:D*
mov ah,42h BOs/:ZbK0W
int 13h s]arNaaA
jnc readok Lc3&\q
e
/^.|m3
mov cx,5 ;G[V:.o-
;出错后重试(定位0道后再重读) 2w 2Bc+#o
retryrd: _yg_?GH
lea bx, msgReadErr 6Sr]<I +:
mov dx,bx t]/eCsR
mov ah,09 1F@k9[d~
int 21h 3H,E8>Vd
@
~3--
+r:g }i
R
lea di,dap0 W(, j2pU
mov dl,80h p"g|]@m
mov ah,44h .tngN<f
int 13h }>A
q<1%
}9~^}99}
lea bx,BlockNumL mk-{@$Q Jb
call dispqword IhnBp 6p9
RK3 yq$
lea di, packetsize (]|h6aI'}
mov dl,80h nhV"V`|d
mov ah,42h 8Zv``t61
int 13h
Ei;tfB
jnc readok
RBX<>*
loopnz retryrd y.r N(
"yWw3(V2>
readok: IGlR,tw_/
lea di, packetsize @:lM|2:
mov dl,80h )!T~l(g
mov ah,43h ).T&fa"
int 13h iI3:<j
l
6TtB3;5
rwsect endp 2]>O ZhS
xoaO=7\io
code ends ;代码段结尾 U{U"%XdO
end start ;结束汇编 @<.@X*#I
f6Qr0Op