第一个宏汇编程序 yE} dj)wd
$Q+s
/4\
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 k6Cn"2q <
^JR;epVJ
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! T$=4O9G
tMj1~
R
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! :|1.seLQ
pA4*bO+
比较长啊!所以可以自动跳过。 q_Lo3|t i
_e!F~V
.
.286 ;
"3+YTtp
.radix 16 2ij#
H
;
data segment ;定义数据段 *xR
2)u
^S#t|rN
1=2^90
msg db 0dh, "Reading sector:$" A-ZmG7xk
msg1 db 0dh, "Writing sector:$" },[;O^Do^{
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" UMN*]_'+;b
yGpz,X4x
dsp db " $"
st'D
s4H2/EC
;DAP H@uE>
PacketSize db 16d; // 数据包尺寸(16字节) !SsHAE|
Reserved db 0; // ==0 rx :z#"?I
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) A`6ra}U<
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) 4@;-%H&7
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 0D~ C
5}/4
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 OJ4
SbI
_DP|-bp D
;定位用DAP (复位到0磁道) 4l8BQz}sb
DAP0 db 16d xdy^^3"
db 0 Vc3mp;6"
dw 1 +2C?9:bH
buff1 dw 0,0 +{53a_q
dw 0,0,0,0 ,572n[-q
Qju`e Eo
iGXBqUQ:
;DiskParameters 4F MAz^
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) -p-0;Hy
falgs dw 0; WORD Flags; // 信息标志 V
ga-@
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 Zt E##p
Heads DW 0; DWORD Heads; // 磁盘磁头数 (
ozb%a#B
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 R \s!*)
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 P6U%=xaC
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) 9TxyZL
SNT5Am z!
cmpsect dw 0 efz&@|KR
4O{Avt7C
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" )$x_!=@1
msgHds db 0dh,0a,"Heads:$" lnbmo Hv
msgspt db 0dh, 0a,"SectorsPerTrack:$" B
?%L
msgTotal db 0d,0a, "Total Sectors:$" ] q~
<=
msgSS db 0dh,0a, "Sector Size:$" ;,OfJ'q^
!~-6wN"k
msgReadErr db 0dh,0a,"Error Reading Sectors:$" SJgY
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" RD<75]**{
msgReset db 0dh,0a, "Reseting drive to Cyl 0" h?,\(KjP#
;2giZ\
Z"I/ NGiU
buffer db 32768d dup(0); !Ngw\@f
KbxR
Lx]w
data ends ;数据段结尾
y~<@x.
R,@g7p
stack segment H]#Rg`~n
db 400 dup(?) ;9uRO*H?T
stack ends 99 wc
(S^ck%]]a!
code segment ;定义代码段 o!&WsD
assume cs:code ;规定cs的内容 Cef:tdk7
assume ds:data ;规定ds的内容 ;Pb
8YvG1$
assume ss:stack gd^Js1Z
XT@Mzo49z\
start: s.jO<{
pusha ~y0R'oi
8)0L2KL'
o`r(`6@
mov ax,data ;程序从start开始 t0m*PJcF
mov ds,ax ;ds置初值,data的段地址 v+1i=s2$
+iF
1sC_
;设置缓冲区 'qv;sB.
lea bx, buffer D>wZ0p b-
mov bufferaddr,bx 1x >iz
`A
mov buff1,bx ^O%9yEo
mov bx,ds u@.>WHQN
mov bufferaddr+2,bx :]eb<J
mov buff1,bx $(HjI
\%l^
PK rek
lea di,infosize 2>hz_o{5',
mov dl,80h RB3 zHk%
mov ah,48h (xyS7q]m
int 13h (%<' A
"2Op[~V
lea bx,msgcyl Lu>H`B7Q"
mov dx,bx %c6E-4b
mov ah,09 %
"Db?
int 21h 0-2"FdeQU
mov dx,cylinders NO>k
call dispdx s\0K o1
B/eaqJ
lea bx,msghds fUcLfnr
mov dx,bx Yr&Ka:
mov ah,09 =K$,E4*
int 21h et$uP
mov dx,heads +2T!z=
call dispdx :%-,Fxl4
[>w%CY<Fd
lea bx,msgspt IjZ@U%g@;
mov dx,bx LP`CS849z2
mov ah,09 r[HT9
int 21h 0\a8}b||
mov dx,spt+2 O]nT>;PXX
call dispdx E8/rZ~0O~
mov dx,spt KAb(NZK
call dispdx h[=nx^
^b53}f8H
lea bx,msgtotal YL5>V$i
mov dx,bx LD55n%|0`H
mov ah,09 .RRlUWu
int 21h .2X2b<%)
lea bx,sectors vD=%`G[m
call dispqword Q_}/ Pn$1
j Selop>N
lea bx,msgss `Q9+k<
mov dx,bx }e=e",eAT
mov ah,09 ^,7=X8Su
int 21h T{-2fp8r[
mov dx,sectorsize yr4ou
call dispdx d\Jji 6W
W^xZ+]
sbb word ptr sectors, 63d J_ V,XO
jnc subok !dv-8C$U
sub word ptr sectors+2,1 |Cf
mcz(56
jnc subok +Z+ExS<#z
sub word ptr sectors+4,1 Y%IJ8P^Y
jnc subok #/WAzYt{
sub word ptr sectors+6,1 ]C *10S`
%2yAvGa1
subok: 8wF#e\Va0
`fW{yb
D<nxr~pQ
9e5gy
xor ax,ax 1!/-)1t
mov blocknumL, ax u@D.i4U
mov blocknumL+2, ax KU2$5[~j
mov blocknumL+4, ax /PC` 0/b
mov blocknumL+6, ax yDtOpM8<{
$!`L"szqD*
startread: F 1}
ex phe+b
call rwsect o=9'
.xpmp6-
adc word ptr blocknuml,63d oBw}hH,hp
jnc addok k|#Zy,
adc word ptr blocknuml+2,1 r'd/qnd
jnc addok ?~)Ak`=
adc word ptr blocknuml+4,1 aJ2H.
E
jnc addok ~n]NyVFP
adc word ptr blocknuml+6,1 Vj!WaN_
jnc addok
R{<Y4C2~
K/Jk[29"\
addok: t:9
ZCu ay
mov ax, word ptr sectors+6
!0dX@V'r
cmp ax, blocknuml+6 FaWl,} ]
jg complete k!1
3=Gh
jl startread ;E's4jWq
mov ax, word ptr sectors+4 T}2:.Hk:N
cmp ax, blocknuml+4 3'@&c?Fye
jg complete NW De-<fQ
jl startread $-w5o`e
mov ax, word ptr sectors+2 pbdF]>\
cmp ax, blocknuml+2 [.U^Wrd
jg complete k5X b}@
jl startread ]<X2AO1
mov ax, word ptr sectors ^/{4'\p
cmp ax, blocknuml &"AQ;%&N
jg complete l;5`0N?QO
jl startread 9Dq.lr^
;o >WXw
complete: AM?Ec1S
#a
yqBa_XPV8
lea bx,msgready 6z]`7`G
mov dx,bx MOLO3?H(
mov ah,09 >a9l>9fyY
int 21 ~'[jBn)
[|<EDR
popa S.]MOB dt
mov ax,3100h kJeu40o
N
int 21h B"[{]GP BY
1(pjVz&
; +:y&{
K
dispdx proc near (txt8q
pusha Ps 7_-cH
lea bx, dsp+3 &(0N.
=R
mov cx,4 *+~D+_,
s7|3zqi
repeat0: VIYV92[
mov al,dl x-4J/tm
and al,0fh LT(?#)D
cmp al,09h H%~
Q?4
jg add40 +3HPA#A
add al, 30h &oc_a1R
jmp okadd U6a zhi&,
add40: @tQ2E}psP,
add al,37h 5m3'Gt4
okadd: *2#FRA#q
mov byte ptr [bx],al
b_mWu@$
dec bx '
^B3pR:
shr dx,4 7*g(@d
loopnz repeat0 :}y| 4*z
lea bx,dsp zP|*(*
mov dx,bx 2MT_#r_
mov ah,09h :f]!O@.~
int 21h {]@Qu" M
um}N%5GAa
popa 2mq%|VG'
ret &%}6q]e
dispdx endp _r7=&oL.Q
?N2X)Y@yi
dispqword proc near 1!f2*m
pusha neIy~H_#!
mov cx ,4 H8<m9zDvl
add bx,6 V^ Y*xZ
repeatdecbx: hy=u}^F.C
mov dx,[bx] 7 BK46x
call dispdx h=Oh9zsz8
sub bx,2 b_l.QKk
loopnz repeatdecbx dv[\.T`LY
popa x{2o[dK4}
ret *G9
[j$
dispqword endp 3z$HKG
1>yha
j(K
rwsect proc near `~|DoSi^d
#Wq#beBb
lea bx,msg -Y2
&A$cM
mov dx,bx -7,vtd[h
mov ah,09h 3f,u}1npa*
int 21h i&1U4q
?d#Lr*m
lea bx,BlockNumL o6/Rx#A
call dispqword L-MiaKc L
F\Y,JUn[G
lea di, packetsize ^^'[%ok
mov dl,80h # a.\P.{L
mov ah,42h
sxt`0oE
int 13h CHg]U l
jnc readok S8vx[ <
9g4QVo|
mov cx,5 ,NDxFy;d
;出错后重试(定位0道后再重读) UMv"7~
retryrd: 7Qt2gf
lea bx, msgReadErr H}(=?}
+
mov dx,bx <
)Alb\Z
mov ah,09 $Llvp bl
int 21h .oEFX8
I=K[SY,]9
CR.bMF}
lea di,dap0 (}6wAfGo
mov dl,80h xV?*!m$V%R
mov ah,44h Gk{W:866
int 13h 3^'#ny?l
]|;7R^o3|
lea bx,BlockNumL ]}/mFY?7
call dispqword *|sxa#
IF& PGo
lea di, packetsize z,M'Tr.1|
mov dl,80h B6(h7~0(<
mov ah,42h Sr-|,\/O
int 13h nxD'r
jnc readok (UXv,_"nU
loopnz retryrd wd
"TM
FBcm;cjH
readok: `)LIVi"(D
lea di, packetsize Plb}dID"
mov dl,80h ?C
FS}v
mov ah,43h 7<fL[2-
int 13h CN-4-
I>d I[U
rwsect endp $e>/?Ss
vs+We*8H
code ends ;代码段结尾 |}%(6<
end start ;结束汇编 9y;y7i{>?
p[_Yi0U