第一个宏汇编程序 >=U n=Q%
E&RK My)
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 _zj}i1!E"
C$$lJ=>
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! p[-buB]
|Xl,~-.
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! }c*6|B@f
l=<
:
比较长啊!所以可以自动跳过。 1PJ8O|Zt8
| (a<b
.286 KcX] g*wy
.radix 16 Wtwh.\Jba
data segment ;定义数据段 AZYu/k
cLe659 &
t6O/Q0_
msg db 0dh, "Reading sector:$" H?axlRmw3
msg1 db 0dh, "Writing sector:$" uia-w^F e
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" mEe JK3D[
DcQsdeuQ
dsp db " $" n,N
KJ
t
d.uJ}=|
;DAP iw^(3FcP@C
PacketSize db 16d; // 数据包尺寸(16字节) c~+l|
r=u?
Reserved db 0; // ==0 |^E#cI
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) Q
A&BNG
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) bI~(<-S~K
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 q#N8IUN}4
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 ?yt"
Nbnu
QPb'
;定位用DAP (复位到0磁道) KBo/GBD]|
DAP0 db 16d )fz<n$3|$#
db 0 h $}&N
dw 1 hUy\)GsT
buff1 dw 0,0 38T2IN
dw 0,0,0,0 I 0}+}{M:
u9"1%
YkLEK|d
;DiskParameters t,K_!-HX+
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) r z%=qY
falgs dw 0; WORD Flags; // 信息标志 Ym*Ed[S
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 ,-*oc>
Heads DW 0; DWORD Heads; // 磁盘磁头数 za20Y?)[
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 n.$wW
=
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 #b4Pn`[
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) 9L'R;H?L
n
AJ<@a
cmpsect dw 0 u;*Wc9>sU
k;pTOj
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" sX,oJIt
msgHds db 0dh,0a,"Heads:$" 0@ 9em~
msgspt db 0dh, 0a,"SectorsPerTrack:$" bqAv)2
msgTotal db 0d,0a, "Total Sectors:$" T6ajWUw
msgSS db 0dh,0a, "Sector Size:$" Vee`q.
#:?vp
V#i
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 4#m"t?6!
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 'WG%O7s.
msgReset db 0dh,0a, "Reseting drive to Cyl 0" RHGs
(d7-
skn`Q>a
wDV%.Cc
buffer db 32768d dup(0); 9RoN,e8!
S:GX!6>
data ends ;数据段结尾 g2WDa'{L
+;Jb)8
stack segment D-B
WgK
db 400 dup(?) I)Dd"I
stack ends w|>O!]K]
VL/%D*
code segment ;定义代码段 "p~1|?T
assume cs:code ;规定cs的内容 |:i``gFj
assume ds:data ;规定ds的内容 *gC6yQ2?
assume ss:stack s:y=X$&M
cz
f|c
start: K?q1I<94
pusha Svo gvn
.^S#h
(A
{uRnZ/m
mov ax,data ;程序从start开始 b;O|-2AR
mov ds,ax ;ds置初值,data的段地址 AtN=G"c>_
Y&k6Xhuao
;设置缓冲区 +SSF=]4+
lea bx, buffer "[(I*
mov bufferaddr,bx iS^IqS
mov buff1,bx tF<|Eja*
mov bx,ds 5h^U ]Y#
mov bufferaddr+2,bx .)>DFGb>H
mov buff1,bx FU|c[u|z
KS/1ux4x
lea di,infosize K
N;b+`x;M
mov dl,80h 6*/o
mov ah,48h PXk+Vi,%k
int 13h OIa=$l43C
{%5tqF
lea bx,msgcyl }w&+H28.#
mov dx,bx (!U5B
Hnd
mov ah,09 u"\HBbBx
int 21h ?2;r#)
mov dx,cylinders )0P>o]fWI
call dispdx f`?Y+nu}
i!30f^9D-S
lea bx,msghds 3!0Eh8ncI
mov dx,bx L
s=2!
mov ah,09 4#Fz!Km
int 21h ~)#JwY
mov dx,heads v(\kSlJ
call dispdx &zr..i4O
6t|FuTC
lea bx,msgspt c"3 a,&
mov dx,bx ZgL4$%
mov ah,09 *1}'ZEaJ
int 21h [*O#6Xu
mov dx,spt+2 Fa$ pr`
call dispdx &41=YnC6
mov dx,spt {<a(1#{
call dispdx zR_#c3o
b<B|p|
lea bx,msgtotal &LO<!WKQ
mov dx,bx D^Bd>Ey4
mov ah,09 99}n%(V
int 21h |:s4#3
lea bx,sectors p-zWfXn!P
call dispqword a(Bo.T<2@
:mU,g|~55
lea bx,msgss XU Hu=2F
mov dx,bx mB.kV Ve0
mov ah,09 D84`#Xbi
int 21h c ZN+D D
mov dx,sectorsize 88
*K
call dispdx wY2#xD
"]ow1{
sbb word ptr sectors, 63d xoD5z<<
jnc subok dIG(7~
sub word ptr sectors+2,1 [g_Cg=J
jnc subok 8]Xwj].^C
sub word ptr sectors+4,1 ki#O ^vl
jnc subok O1Gd_wDC/i
sub word ptr sectors+6,1 gd6We)&
w<<G}4~u|
subok: mKwhd} V
EAcJ>
%QUV351H
x )wI
Go
xor ax,ax DT_HG|
mov blocknumL, ax MX 2UYZ&
mov blocknumL+2, ax sH(AsKiNKe
mov blocknumL+4, ax ANy=f-V
mov blocknumL+6, ax EnJAHgRV;e
UDHk@M
startread: SxYX`NQ
4Wq{ch
call rwsect 5rqjqfFa
CE>RAerY
adc word ptr blocknuml,63d !Jw
jnc addok ~l%Dcp
adc word ptr blocknuml+2,1 #_}lF<k
jnc addok y(B~)T~e@
adc word ptr blocknuml+4,1 #~54t0|Cd>
jnc addok nKJJ7'$'3
adc word ptr blocknuml+6,1 q79)nhC F
jnc addok 9N|O*h1;u
&_
Ewu@4
addok: xQC.ap
mov ax, word ptr sectors+6 $Xw .iN]g
cmp ax, blocknuml+6 u2^oXl
jg complete w8*+l0
jl startread BlS0I%SN
mov ax, word ptr sectors+4 +d6/*}ht
cmp ax, blocknuml+4 m&DDz+g
jg complete
AA9OElCa
jl startread Pq~"`-h7:
mov ax, word ptr sectors+2 `?PZvGi
cmp ax, blocknuml+2 inavi5.
jg complete .}6 YKKqS
jl startread '}*5ee](S
mov ax, word ptr sectors Rx*T7*xg{
cmp ax, blocknuml DNdwMSwp
jg complete |lIkmW{
jl startread z]> 0A
P$Y<
g/s4
complete: XB-pOtVm
o_p//S#q
lea bx,msgready FS r
`Y
mov dx,bx A+3@N99HeH
mov ah,09 P@:#NU[
int 21 >~I~!i3
e
=Vu;
popa 2 As 4}
mov ax,3100h G6xdGUM
int 21h ]`&EB~K&NY
J4h7]
qt
; eP-q[U?$n
dispdx proc near ho2o/>Ef3
pusha FfN==2:b
lea bx, dsp+3 8w~I(2S:#
mov cx,4
&(\z
!}^c.<38Q
repeat0: !'Xk=+
mov al,dl b7{)B?n
and al,0fh YMwMaU)K,
cmp al,09h
GWgjbp
jg add40 Dg/&m*Yl
add al, 30h B3u5EgZr
jmp okadd .e5GJAW~9
add40: *KF:
add al,37h I+w3It
okadd: 0ANqEQX
mov byte ptr [bx],al _/ZIDIn
dec bx q[Hxy
shr dx,4 |Sy|E
loopnz repeat0 8zGe5Dn9
lea bx,dsp ?@l9T)fF
mov dx,bx ZVJbpn<lo)
mov ah,09h
"/6(
int 21h "?V4Tl~uu
:k075Zr/#D
popa B5u06
O
ret D Y($
dispdx endp ;VM/Cxgep
l/`<iG%
dispqword proc near JQ'NF
l9<
pusha {%@zQ|OO0
mov cx ,4 `f}c 1
add bx,6 umYq56dw
repeatdecbx: Lw?4xerLsb
mov dx,[bx] >fI<g8N D
call dispdx q(e&{pbM)
sub bx,2 8Vv"'CU#
loopnz repeatdecbx @D-l_[
popa |x
2>F
ret &}VGC=F;d
dispqword endp mQBq-;
@"-<m|lM
rwsect proc near ;14[)t$
Q3\j4;jI(
lea bx,msg 4s~YqP{K
mov dx,bx ^<$dTr'
mov ah,09h oL#^=vid"
int 21h ~" B0P>7
RG[3LX/
lea bx,BlockNumL Ot(U_rJCi
call dispqword Yva^JB
C',D"
lea di, packetsize XQ-
-8G
mov dl,80h \&]'GsfF
mov ah,42h dl@
int 13h 9zEO$<e o
jnc readok m;lwMrY\7>
"8J$7g@n@
mov cx,5 I)V2cOrXM
;出错后重试(定位0道后再重读) I 6a{'c(P
retryrd: +q"d=
lea bx, msgReadErr =U!'v X d
mov dx,bx ^Qrdh
0j
mov ah,09 =;0#F&
int 21h xZjD(e'
\szx.IZT
V#^~JJW^
lea di,dap0 fzRzkn:=
mov dl,80h MZZ4
mov ah,44h *f$mSI=
int 13h ?C//UN;
=-~82%
lea bx,BlockNumL /K:M
,q
call dispqword x:O
?Fj
NTuS(7m
lea di, packetsize rAwq$!x x
mov dl,80h bgqN&J)Jr)
mov ah,42h zht^gOs
int 13h tXcc#!'4C
jnc readok \CM(
loopnz retryrd wt[MzpR P
u }D.yI8
readok: `&b8wF
lea di, packetsize g}@_
@
mov dl,80h 2J^6(vk
mov ah,43h 1[C,*\X8v
int 13h 41mg:xW(J
}XWic88!~
rwsect endp ~K 8eRT
GptJQ=pV
code ends ;代码段结尾 BbA>1#i5]
end start ;结束汇编 3_B .W
#QQ
\
xj