第一个宏汇编程序 g/&T[FOr
Ed:eGm }
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ;3
F"TH
Dk='+\
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 5BR2?hO4
IJJ%$%F/
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧!
i@][rdhT
[j"9rO" +
比较长啊!所以可以自动跳过。 u-1;'a
9m-)Xdoy
.286 {VP$J"\e
.radix 16 (708H_
data segment ;定义数据段 93<:RV
JMCW} bA
DaH?@Q
msg db 0dh, "Reading sector:$" {>"NyY
msg1 db 0dh, "Writing sector:$" NWd<+-pC6
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 5"/J^"!h
?X-)J=XG
dsp db " $" (oJ9k[(
*c)uGz'cD
;DAP .c#y%S
PacketSize db 16d; // 数据包尺寸(16字节) ZbT/$\0(6
Reserved db 0; // ==0 \V>?Do 7
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) VqE~c
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) zh$}~RG[
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 gt\MS;jMa
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 k"N(o(
ox
j3[</'k
;定位用DAP (复位到0磁道) cv(PP-'\
DAP0 db 16d
o0ZM[0@j
db 0 (n1Bh~R^
dw 1 <jS~ WI@
buff1 dw 0,0 0oh]61gC
dw 0,0,0,0 U;n*j3wT
(Z}>1WRju
,KJw|x4}\
;DiskParameters ql GW.jY.
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) ?DH"V7bs
falgs dw 0; WORD Flags; // 信息标志 n9;;x%6 .I
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 [I:KpAd/
Heads DW 0; DWORD Heads; // 磁盘磁头数 QW_agm
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 g}f9dB,F
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 5`]UE7gT
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) xBFJ} v
{}o>{&X
cmpsect dw 0 63!rU
B!
'u4ezwF;
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" Fxc)}i`
msgHds db 0dh,0a,"Heads:$" ~O 3D[PNW~
msgspt db 0dh, 0a,"SectorsPerTrack:$" TrdZJ21#M
msgTotal db 0d,0a, "Total Sectors:$" kF;5L)o
msgSS db 0dh,0a, "Sector Size:$" f/kI|Z
%Rh;=p`
msgReadErr db 0dh,0a,"Error Reading Sectors:$" lc6iKFyG
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" Gd+ET
msgReset db 0dh,0a, "Reseting drive to Cyl 0" !WkIi^T
u4"SH(
WU4U Zpz
buffer db 32768d dup(0); +m}Pmi$
n}mR~YqD
data ends ;数据段结尾 S?{/hy
<}jPXEB"
stack segment 9e U[*S
db 400 dup(?) Eh|.
stack ends 4gSH(*}
L'i-fM[#
code segment ;定义代码段 l/
y]nw
assume cs:code ;规定cs的内容 [~\PQYm'
assume ds:data ;规定ds的内容 )s9',4$eK<
assume ss:stack m uW!xY
dx,=Rd5'
start: @FN*TJ
pusha &t(0E:^TRU
^2odr \
IkzTJ%>
mov ax,data ;程序从start开始 idRD![!UI
mov ds,ax ;ds置初值,data的段地址 *[eL~oN.c
>O/D!j|
;设置缓冲区 !TAp+b
lea bx, buffer `Y40w#?uW
mov bufferaddr,bx 8wH.et25k
mov buff1,bx Zs2-u^3&
mov bx,ds ,&HR(jTo
mov bufferaddr+2,bx U Q@7n1
mov buff1,bx J
wm T/
Zc"B0_&?:7
lea di,infosize )R_E|@"
mov dl,80h ]ALc;lb-}
mov ah,48h nH !3(X*
int 13h /?/#B `
O
;
HY%
lea bx,msgcyl :
t$l.+B
mov dx,bx qW_u
mov ah,09 N:VX!w
int 21h fQnwy!-\
mov dx,cylinders S>q>K"j^!
call dispdx o$.e^XL
c~<1':
lea bx,msghds fU2qrcVu
mov dx,bx pWE `x|J
mov ah,09 hIJ)MZU|
int 21h |DF9cd^
mov dx,heads 6
fz}
call dispdx -V %gVI[
utlpY1#q/
lea bx,msgspt 'z=:[#b
mov dx,bx w>xV
mov ah,09 'j%F]CK
int 21h +~nzii3
mov dx,spt+2 .w6eJ4]
call dispdx RE 3Z%;'
mov dx,spt Xj+q~4{|vt
call dispdx uqyB5V0gh
BsZ{|,oQnZ
lea bx,msgtotal :`vP}I ^
mov dx,bx d h^^G^
mov ah,09 9H]_4?aX
int 21h ~9Cz6yF
lea bx,sectors aH_6s4+:
call dispqword 1on'^8]0
I/x iT
lea bx,msgss rAdacnZV
mov dx,bx ~F,
&GH
mov ah,09 p3^jGj@
int 21h _ia! mT<
mov dx,sectorsize '[ P}&<ie,
call dispdx %ICglF R
:Zw@yt
sbb word ptr sectors, 63d 3UUGblg`~
jnc subok f!t69nd%L
sub word ptr sectors+2,1 {}>n{_
jnc subok 1+y"i<3)
sub word ptr sectors+4,1 aaWJ*
>rJ
jnc subok ^]p
sub word ptr sectors+6,1 ?lCd{14Mkh
3b[jwCt
subok: Wx)K*9
~<qt%W?
!wLg67X$
-
_DPOyR2
xor ax,ax [LM^),J?
mov blocknumL, ax e yw'7
mov blocknumL+2, ax smAC,-6]~
mov blocknumL+4, ax oh#N
0
0X
mov blocknumL+6, ax qBk``!|s]
_'x8M
startread: fvo<(c#Y#
CPazEe1S
call rwsect +:jT=V"X
|`yZ
IY_
adc word ptr blocknuml,63d P}3}ek1Ax
jnc addok O,V9R
rG
adc word ptr blocknuml+2,1 t@bt6J .{
jnc addok T&"i _no*
adc word ptr blocknuml+4,1 o5Rz%k#h
jnc addok ZC
^C
adc word ptr blocknuml+6,1 &[|VZ[
jnc addok \[wCp*;1}
3mt%!}S
addok: HO|-@yOF^
mov ax, word ptr sectors+6 8_\W/I!7b
cmp ax, blocknuml+6 )E7 FA|
jg complete I12KT~z<r
jl startread K=u0nrG*
mov ax, word ptr sectors+4 ZX`J8lZP
cmp ax, blocknuml+4 %NHYW\sKX
jg complete 1@sM1WMX
jl startread {GqXP0'
mov ax, word ptr sectors+2 zz$
q5[n
cmp ax, blocknuml+2 =
Rc"^oS
jg complete R
-elIp
jl startread NSLVD[yT
mov ax, word ptr sectors Ln#a<Rx.E7
cmp ax, blocknuml K3$`
Kv>I
jg complete q(z7~:+qNr
jl startread W,hWOO
FJM;X-UOY
complete: Z&yaSB
*8g<R
lea bx,msgready wod/&!)]A
mov dx,bx XbvDi+R2A
mov ah,09 s'a= _cN
int 21 ^Ip3A
$. e)
popa 3-wD^4)O,
mov ax,3100h 1|y$~R.H
int 21h GaNq2 G
p_terD:
; dXu {p
dispdx proc near T.?k>Ak
pusha /nB'kg[h\
lea bx, dsp+3 h#f&|*Q5m
mov cx,4 Aa(<L$e!`
Ns~&sE:
repeat0: +GNWF%
zN
mov al,dl @]
.VQ<X|0
and al,0fh 7t(Y;4<2
cmp al,09h M StX
*Zw
jg add40 6517Km 4-
add al, 30h '
lo.h""
jmp okadd L-'k7?%(
add40: x(r+P9f\<
add al,37h B1T5f1;uY
okadd: p%RUHN3G[
mov byte ptr [bx],al 5h_5Z~
dec bx <DiOWi
shr dx,4 ,r+"7$
loopnz repeat0 ,a(O`##Bn
lea bx,dsp 0-e
mov dx,bx ?g}kb
mov ah,09h H*!5e0~rR
int 21h xl!K;Y2<
F$6?t.@J
popa X.J
ret ;( KMGir
dispdx endp Gi$gtLtNh
/(6zsq'v|
dispqword proc near 2>y:N.
pusha !;}2F-
mov cx ,4 #Q6w+"
add bx,6 J1 tDO?
repeatdecbx: L~0&
Q
mov dx,[bx] {/UhUG
call dispdx :k"rhI
sub bx,2 ,w\ wQn>]K
loopnz repeatdecbx ua& @GXvZ
popa ILG?r9x
ret L
DX*<(
dispqword endp Kmry=`=A
1MQ/r*(
rwsect proc near C-#.RI7
r\mPIr|
lea bx,msg 1$["79k
mov dx,bx ^e9aD9
mov ah,09h (wL3 +
int 21h 5d
5t9+t
Ee?;i<u
lea bx,BlockNumL i-13~Dk
call dispqword a&5g!;.
zHFTCL>"
lea di, packetsize dK
# h<q1
mov dl,80h V<0$xV1b|=
mov ah,42h $pu3Ig$^
int 13h (Pz8iz
jnc readok ofwQ:0@
nP_=GI
mov cx,5 G1_Nd2w
;出错后重试(定位0道后再重读) ep?:;98|t
retryrd: Zc\S$+PM
lea bx, msgReadErr 1i,4".h?M
mov dx,bx _g6wQdxT
mov ah,09 @\!!t{y
int 21h fA
XE~
Y+|PY?
~
fPE ?hG<x
lea di,dap0 Dc:DY:L^
mov dl,80h zzf7S%1I
mov ah,44h O)5#Fcp(
int 13h BMjfqX
[
-12]3
lea bx,BlockNumL 'Oy5e@G+?
call dispqword xii$e
^![{,o@"A
lea di, packetsize i[=C_+2
mov dl,80h b>=7B6 Aw
mov ah,42h GVObz?Z]SB
int 13h y&rY0bm
jnc readok hAa[[%wPhU
loopnz retryrd M.k|bh8
4I ,o&TK
readok: 6lU|mJ`M
lea di, packetsize =HPu{K$
mov dl,80h 7
\/u&
mov ah,43h 5'9.np F)
int 13h Y+qus
Jk*QcEE=
rwsect endp Qp 69Sk@H{
6UB6;-
code ends ;代码段结尾 A}4t9|/K6
end start ;结束汇编 SKxe3
#<}kISV0