第一个宏汇编程序 <,DMD
2`Bb9&ut>
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 RK@K>)"f
%S^ke`MhF
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! +On2R&m
gA=Pz[i)p
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 7d.H8C2
1CJ1-]S(3
比较长啊!所以可以自动跳过。 N=u(
3So
O_ r-(wE4
.286 jy~hLEt7
.radix 16 dUB;ZB7
data segment ;定义数据段 cWnEp';.
YN)qMI_`A
}'vQUGu8z
msg db 0dh, "Reading sector:$" o Tvg%bX
msg1 db 0dh, "Writing sector:$" |34k;l]E
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Jhj ]`$J
@wD#+Oz
dsp db " $" |m\7/&@<
hD#Mhy5h
;DAP
T^e
D
PacketSize db 16d; // 数据包尺寸(16字节) w)<.v+u.Y
Reserved db 0; // ==0 c@,1?q1
bv
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ,sj(g/hg
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) . ?#Q(eLj
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 F$i50s
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 `%|3c
N#-%b"(
;定位用DAP (复位到0磁道) CHS}tCfos>
DAP0 db 16d .K
^gh$z!
db 0 ~Q"qz<WO
dw 1 9+(6/<
buff1 dw 0,0 rui 8x4c
dw 0,0,0,0 B0RVtbK
EiD41N
:JBtqpo2
;DiskParameters MX*4
d{ l
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) YP!}Bf
falgs dw 0; WORD Flags; // 信息标志 0;a1 0b
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 DPY+{5q2
Heads DW 0; DWORD Heads; // 磁盘磁头数 IV&5a]j
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 V9ZM4.,OCN
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 a:P+HU:
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) dgQ<>+9]6
4NRj>y
cmpsect dw 0 nd\$Y
iaMl>ua
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" !|9@f$Jv
msgHds db 0dh,0a,"Heads:$" (Qw >P42J
msgspt db 0dh, 0a,"SectorsPerTrack:$" z
*VK{O)o
msgTotal db 0d,0a, "Total Sectors:$" `!X8Cn
msgSS db 0dh,0a, "Sector Size:$" jKcl{',
@ebY_*
msgReadErr db 0dh,0a,"Error Reading Sectors:$" "$5cKbJ
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" >G1]#'6;
msgReset db 0dh,0a, "Reseting drive to Cyl 0" k3LHLJZ#
r+Sv(KS4i^
;]R5:LbXS
buffer db 32768d dup(0); Foj|1zJS_
7lYf+&JZ
data ends ;数据段结尾 ymrnu-p o
UH&1QV
stack segment DQObHB8L
db 400 dup(?) YpZuAJm<2_
stack ends l^tRy_T:-
w[vccARQ
code segment ;定义代码段 T
g(\7Kq
assume cs:code ;规定cs的内容 BSkmFd(*
assume ds:data ;规定ds的内容 a"}ndrc*
assume ss:stack 0f_`
;{
NHU5JSlB
start: EFU)0IAL[
pusha ?!"pzDg
@@3NSKA
j7Zv"Vq@
mov ax,data ;程序从start开始 [fwk[qFa
mov ds,ax ;ds置初值,data的段地址 BQ,749^S
`}ZtK574
;设置缓冲区 ~"bBwPI
lea bx, buffer 4<<eqxI$|
mov bufferaddr,bx 9h+TO_T@F
mov buff1,bx |pknaz
mov bx,ds ?W dY{;&
mov bufferaddr+2,bx 'o=DGm2H
mov buff1,bx (3K,f4S@
3it*l-i\
lea di,infosize ~mHrgx
Q-
mov dl,80h eF0FQlMe[
mov ah,48h SPe%9J+
int 13h +i /4G.=*
v!DU ewz
lea bx,msgcyl (uHyWEHt
mov dx,bx `o{_+Li9
mov ah,09 e~he#o[%a
int 21h Ei2M~/
mov dx,cylinders C!K&d,M
call dispdx {Gh9(0,B?
sWTa;Qi
lea bx,msghds ( ?e
Et&
mov dx,bx $<VH~Q<
mov ah,09
,<7
HLV
int 21h
[g@Uc
mov dx,heads #xR=U"
call dispdx a$iDn_{
mDt!b6N/
lea bx,msgspt "Qc4v@~)
mov dx,bx _b)Ie`a.H
mov ah,09 !mVq+_7]
int 21h am'K$s
mov dx,spt+2 a&kt!%p:
call dispdx kTzO4s?
mov dx,spt O<AGAD
call dispdx 6 %`
h2Z
`S3)uV]I
lea bx,msgtotal r_8;aPL
mov dx,bx i6FJG\d
mov ah,09 `Y!8,(5#
int 21h ifl
LY7j
lea bx,sectors =Y^K
call dispqword %b h:c5
\,m*CYs`
lea bx,msgss S6JWsi4C:,
mov dx,bx L*
rCUv `
mov ah,09
+s7w@
int 21h Q"!GdKM
mov dx,sectorsize nXuy&;5TL,
call dispdx G `e
U
^IvQdVB
sbb word ptr sectors, 63d 2#qcYU
jnc subok @5??`
n
sub word ptr sectors+2,1 9%Vy,
jnc subok 1JOoICjB
sub word ptr sectors+4,1 qm9=Ga5
jnc subok n%}#e!
sub word ptr sectors+6,1 [k%u$
`PLax@]2
subok: Tqs|2at<t
SEWdhthP
&\ad.O/Q
s[7/w[&
xor ax,ax
b'4}=Xpn
mov blocknumL, ax Aj/EaIq
mov blocknumL+2, ax 44k8IYC*o
mov blocknumL+4, ax l"h6e$dP
mov blocknumL+6, ax lN"@5(5%
Fo0s<YlS-
startread: L6jwJwD
hq&9S{E
p
call rwsect .Y!dO@$:
FUL'=Xo
adc word ptr blocknuml,63d 3 l
j^I
jnc addok 1;,<UHF8N
adc word ptr blocknuml+2,1 ".pQM.T
jnc addok B<.ZW}#v
adc word ptr blocknuml+4,1 x*X{*?5@
jnc addok _K!)0p
adc word ptr blocknuml+6,1 mTL`
8hv?
jnc addok ~XXNzz]?
S s+
addok: 8F$]@0v`%
mov ax, word ptr sectors+6 [T3%Xt'4
cmp ax, blocknuml+6 >%N,F`^3
jg complete dtG>iJ
jl startread s`y
g?CR`,
mov ax, word ptr sectors+4 6Xn9$C)
cmp ax, blocknuml+4 McbbEs=)
jg complete 8"[{[<-
jl startread pFBK'NE
mov ax, word ptr sectors+2 +'w6=qI
cmp ax, blocknuml+2 E
KJ2P$
jg complete mtLiS3Nk8
jl startread [_KOU2
mov ax, word ptr sectors {XC[Ia6jtL
cmp ax, blocknuml XKOPW
/
jg complete %5n'+- XVj
jl startread E8lq2r=
Fl(j,B6Z
complete: p&2d&;Qo0
W%MS,zkAE
lea bx,msgready Lv)1
)'v0
mov dx,bx E2=vLI]
mov ah,09 LOwd mj
int 21 !X[7
m
]Ee$ulJ02
popa L|'B*
mov ax,3100h pz{ ]O_px
int 21h s I 0:<6W
zG%'Cw)8
; J9J/3O
Q=
dispdx proc near m,5?|J=
pusha ssH[\i
lea bx, dsp+3 ExFz@6@
mov cx,4 v4X ` Ul*
oe=1[9T"
repeat0: F{
C2%
s#
mov al,dl Uu Zjf9}
and al,0fh CLuQ=-[|
cmp al,09h xNRMI!yv
jg add40 OeZ"WO
add al, 30h #B!M,TWf9s
jmp okadd Z;;A#h'%e
add40: JZ>
(h
add al,37h wT,=C'
okadd: T}"[f/:N/
mov byte ptr [bx],al s._,IW;
dec bx 2
P=~6(
shr dx,4 4~;M\h
loopnz repeat0 ZP0D)@8
lea bx,dsp Vhe$vH
mov dx,bx ]T.+(\I
mov ah,09h ]1[:fQF7/L
int 21h [4yw? U
]{t!J^Xn
popa MlbcJo3
ret :+?rnb)N
dispdx endp *
]D{[hV
<<Z, 1{3F
dispqword proc near q(2ZJn13f
pusha Jt}#,I,B
mov cx ,4 \lwLVe
add bx,6 \zDs3Hp
repeatdecbx: D'% O<.m
mov dx,[bx] _ib
@<%
call dispdx N>)Db
sub bx,2 "kVzN22
loopnz repeatdecbx Ue>{n{H"y
popa i{Du6j^j
ret ZhC,nbM
dispqword endp ,.|/B^jV
ttBqp|.?S
rwsect proc near R`Hy0;X
U+["b-c
lea bx,msg :FmH=pI!=
mov dx,bx 8WKY 4nkj
mov ah,09h 6 =G=4{q
int 21h bFH`wLW
Z@>kqJ%
lea bx,BlockNumL >V\^oh)t]t
call dispqword Y%}N@ ,lT
<qI!Dj{
lea di, packetsize 5-&"nn2*}1
mov dl,80h Pj!f^MN
mov ah,42h x2OAkkH\]i
int 13h $e u
I
jnc readok Cm"S=gV
xm=$D6O:
mov cx,5 Qf'g2
\
;出错后重试(定位0道后再重读) f'M([gn^_
retryrd: `z7,HJ.0c
lea bx, msgReadErr z'"Y+EWN
mov dx,bx i;juwc^n}
mov ah,09 Zdfh*MHMg
int 21h :"@-Bcln
"-rqL
#veV {,g
lea di,dap0 kN#3HI]8
mov dl,80h zXbA$
c
mov ah,44h H9!q)qlK
int 13h M7&G9SGZ
k7cY^&o
lea bx,BlockNumL T)ISDK4>S"
call dispqword <:8Ew
zW)Wt.svP
lea di, packetsize )ac!@slb^7
mov dl,80h Ua=r24fy
mov ah,42h U9
mK^
int 13h /f AAQ7
jnc readok <zAYq=IU
loopnz retryrd 59+KOQul6
vF[ 4kDHk
readok: N8J(RR9O
lea di, packetsize dB:c2
mov dl,80h h b8L[ 4
mov ah,43h 2Je]dj4
int 13h uW!saT5o
;=6E
BP%
rwsect endp i1bmUKZ8'L
;&O *KhLH
code ends ;代码段结尾 B^ddi
end start ;结束汇编 |WOc0M[U
ki1j~q