第一个宏汇编程序 a[!d)Y:zx
{p\KB!Y-
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ;lEiOF+d
;5l|-&{@*
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! UmuFzw^
SYwNx">Bq
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! !Yf0y;e|:
bDNd
m-
比较长啊!所以可以自动跳过。 aRwBxf
dEp=;b s
.286 Yt'o#"R)
.radix 16
vJ'
93h
data segment ;定义数据段 !{XO#e
&ivIv[LV
-XyuA:pxx
msg db 0dh, "Reading sector:$" n 3]y$wK
msg1 db 0dh, "Writing sector:$" wz#n$W3mGf
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" qprOxP
r
tSYn
c7
dsp db " $" ou-
;k
}
u^uG_^^,/
;DAP l{AT)1;^
PacketSize db 16d; // 数据包尺寸(16字节) ]rm=F]W/n
Reserved db 0; // ==0 9|m L
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) q<8HG_
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ?yb{DZ46
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 LN^8U
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 F{+`F<r
T{M:)}V
;定位用DAP (复位到0磁道) {cI<4
><
DAP0 db 16d c
1GP3
db 0 B;Z^.3
dw 1 sJlKN
buff1 dw 0,0 BYf"l8^,
dw 0,0,0,0 gD\}CxtG
jY.%~Y1y
$gTPW,~s[
;DiskParameters ATHz~a
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) *S4P'JSY
falgs dw 0; WORD Flags; // 信息标志 jYF3u0
)
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 @$R a
Heads DW 0; DWORD Heads; // 磁盘磁头数 8(;i~f:bCW
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 f+Go 8Lg=M
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 iE`aGoA
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) *2MTx
!/zj7z
!
cmpsect dw 0 7KIQ)E'kG|
2Qj)@&zKe#
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" Uy:.m
msgHds db 0dh,0a,"Heads:$" c53`E U
msgspt db 0dh, 0a,"SectorsPerTrack:$" `ahXn
msgTotal db 0d,0a, "Total Sectors:$" hdL2`5RFF
msgSS db 0dh,0a, "Sector Size:$" AF}"
)]R?v,9*D
msgReadErr db 0dh,0a,"Error Reading Sectors:$" CQ[-Cp7
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 7A6sSfPUy
msgReset db 0dh,0a, "Reseting drive to Cyl 0" ~dLZ[6Z
Y5CE#&
S@)bl
buffer db 32768d dup(0); aB)DX
(ce NVo&
data ends ;数据段结尾 uSJP"Lw
6zWvd
stack segment s`YuH <
8
db 400 dup(?) e8 aV
qq[
stack ends IycxRig
k]iS3+nD
code segment ;定义代码段 eV0S:mit
assume cs:code ;规定cs的内容 POXn6R!mM1
assume ds:data ;规定ds的内容 bl<7[J.
assume ss:stack xn8B|axB
($W 5fbu
start: lg+g:o
pusha R.T-Pt ene
;I'/.gW;{
m5X=P5U
mov ax,data ;程序从start开始 aO%FQ)BT
mov ds,ax ;ds置初值,data的段地址 7p$*/5fk
bn35f<+
;设置缓冲区 O;BPd:<
lea bx, buffer CK</2 w+
mov bufferaddr,bx I>#ChV)(#
mov buff1,bx uyj*v]AE'
mov bx,ds y9hZ2iT
mov bufferaddr+2,bx |Ze}bM=N
mov buff1,bx rg}kxvu
BaAb4{
lea di,infosize !e `=UZe1
mov dl,80h 1_C6KS
mov ah,48h '=.Uz3D'0
int 13h 9A(K_d-!H
[#Vr)\n
lea bx,msgcyl Q8oo5vqQ#C
mov dx,bx UD`Z;F
mov ah,09 w"i Zn
int 21h *Mc\7D
mov dx,cylinders 4?&a?*M
call dispdx OvG0UXRU
nj`qV
lea bx,msghds %U7f9
mov dx,bx E5{)d~q
mov ah,09 Wp3l>:
int 21h QB,a
d
mov dx,heads @\8gzvkt
call dispdx pe})A
-Wk"o?}q
lea bx,msgspt mU$7_7V~
mov dx,bx iXRt9)MT{
mov ah,09 qEr[fC@x
int 21h HPKyAcS\
mov dx,spt+2 x^2/jUc#B
call dispdx =_J<thp
mov dx,spt 7F:;3c
call dispdx #.YcIR)
:q
<%wLs
lea bx,msgtotal |l(lrJ{
mov dx,bx `kSCH; mwP
mov ah,09 h_yR$H&tX
int 21h KBe {
lea bx,sectors t|QMS M?s
call dispqword J)|K/W9
(Nb1R"J`
lea bx,msgss ueBoSZRWX
mov dx,bx b.*4RL
mov ah,09 ;_5
=g
int 21h E}/|Lja
mov dx,sectorsize wR4u}gb#q
call dispdx 3yB6]U
{VG[m@
sbb word ptr sectors, 63d ix @rq#
jnc subok 86F+N_>Z
sub word ptr sectors+2,1 <h51KPo^P
jnc subok jgw'MpQm{
sub word ptr sectors+4,1 >8O=^7
jnc subok c[lo
b{,
sub word ptr sectors+6,1 N-YZ0/c
em!R9J.
subok: NV4W2thYo
^X%4@,AE
N|2
'a?.X _t
xor ax,ax '|N4fb
Zd
mov blocknumL, ax (1j$*?iGA
mov blocknumL+2, ax F)kLlsp
mov blocknumL+4, ax G3^]Wwu
mov blocknumL+6, ax Vzvw/17J
RmV/wY
startread: uN3J)@;_
B^~Bv!tHWr
call rwsect =w$"wzc
vcU\xk")
adc word ptr blocknuml,63d 'OW"*b
jnc addok z2V8NUn
adc word ptr blocknuml+2,1 %P,^}h7
jnc addok m+{:
^
adc word ptr blocknuml+4,1 [W=S8>
jnc addok
A;a(n\Sy
adc word ptr blocknuml+6,1 @M^QhHs
jnc addok aEdJ ri
VhI
IW"1
addok: To%*)a
mov ax, word ptr sectors+6 %]$p ^m
cmp ax, blocknuml+6 59BHGvaF
jg complete T)tHN#6I
jl startread 6FIoWG"x
mov ax, word ptr sectors+4 Nw&}qSN
cmp ax, blocknuml+4 Lj-&TO}OZ
jg complete FXEfD"
jl startread oe|<xWu
mov ax, word ptr sectors+2 @<yc .
>
cmp ax, blocknuml+2 u
!Nfoq&'u
jg complete "d>g)rvOc
jl startread Y6?mY!
mov ax, word ptr sectors g]
C3lf-
cmp ax, blocknuml [HiTR !o*
jg complete T4Gw\Z%
jl startread 7h&`BS
R&_\&:4f
complete: O[p^lr(B7
*Q120R
lea bx,msgready A<CXd t+t
mov dx,bx x&oBO{LNK,
mov ah,09 )K%O/H
int 21 )u/
^aK53^
C{i;spc!bi
popa 02#Iip3t
mov ax,3100h KXA)i5z
int 21h ~2DV{dyj
YGV#.
; C*6)Ut '
dispdx proc near T
IWLp
pusha $RNUr
\9A
lea bx, dsp+3 'Qq_Xn
8
mov cx,4 $SGA60q
JP,(4h*
repeat0: (My$@l973
mov al,dl @&xaaqQ-
and al,0fh !Fg4Au
cmp al,09h v[DbhIXU
jg add40 )'dH}3Ba
add al, 30h o``>sBZOq
jmp okadd qq7X",s
add40: )^>XZ*eK
add al,37h >AX~c
jo
okadd: |-Esc|J(
mov byte ptr [bx],al SLjf<.S
dec bx AD%D ,l
shr dx,4 !"x7r
e
loopnz repeat0
{%~4RZA
lea bx,dsp \j})Kul
mov dx,bx ?r E]s!K
mov ah,09h #Q7x:,f
int 21h {!e ANm'
OPt;G,$ta
popa 5~%,u2
ret agU!D[M_G
dispdx endp {AL9o2
akCo+ @
dispqword proc near HGQ?(2] 8$
pusha
ZMMo6;
mov cx ,4 ck_fEF
add bx,6 3?Eoj95w!
repeatdecbx: bb/?02*)H
mov dx,[bx] ?(ls<&s{w
call dispdx $#ju?B~
sub bx,2 qM!f
loopnz repeatdecbx ,\9m At1O
popa chMc(.cN0
ret V;hwAQbF
dispqword endp ^N2M/B|0
}Wche/g`
rwsect proc near sqpOS!]
>"<k8wn
lea bx,msg )!}-\5F
mov dx,bx R~5*#r@f
mov ah,09h =Pb5b6Y@6
int 21h Ao,!z
@?7{%j*
lea bx,BlockNumL [aM'
call dispqword i$^B-
{+6D-rDw
lea di, packetsize X*9N[#wu6
mov dl,80h "3i80R\w`F
mov ah,42h PSf5p\<5
int 13h :{WrS
jnc readok -llx:
LQ(5D_yG.
mov cx,5 }B9
~X
;出错后重试(定位0道后再重读) @-&(
TRbZo
retryrd: q&Tn>B
lea bx, msgReadErr "(\)
&G
mov dx,bx uGU
v~bE
mov ah,09 Sa1z,EP
int 21h 4,F3@m:<
,WB_C\.#XN
;y~{+{{Ow
lea di,dap0 9kX=99kf[
mov dl,80h )x8;.@U
mov ah,44h D@\;@(
|
int 13h )dIfr
sId(PT^
lea bx,BlockNumL |!?WQ[
call dispqword 71.\`'
%X"m/4c8}
lea di, packetsize ^L-w(r62<
mov dl,80h D_n}p8blT
mov ah,42h -?YT Q@ W
int 13h 0+<eRR9-
jnc readok w0j/\XN2s
loopnz retryrd b~r{J5x@
4`U0">gY
readok: *fH_lG%
lea di, packetsize G]mWaA
mov dl,80h o!toO&=
mov ah,43h ,s><kHJ
int 13h ey\m)6A$
c@ZS|U*(
rwsect endp %t`SSW7I
.Y(lB=pV
code ends ;代码段结尾 8 ih;#I=q
end start ;结束汇编 VwOG?5W/
f7Df %&d