第一个宏汇编程序 P~e$iBH'
;L2bC3
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。
#Uh 5tc
tHbPd.^
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! pm\X*t}L
AvZ) 1(
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! <q\)
o_tH
moR2iyO_
比较长啊!所以可以自动跳过。 )/"7$2Aoy
2(Uz9!<V
.286 |`wsKr'
.radix 16 31& .L
nq
data segment ;定义数据段 sv"mba.J
VU9P\|c@<
Kdu\`c-lB
msg db 0dh, "Reading sector:$" #~;8#!X
msg1 db 0dh, "Writing sector:$" yipD5,TC
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" x-&v|w '
S:/RYT"
dsp db " $" Jr)`shJ"
Y)}%SP>,
;DAP t[hocl/6
PacketSize db 16d; // 数据包尺寸(16字节) m7vxzC*
Reserved db 0; // ==0 "Q{~Bj~
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) +E|ouFI
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) `aL|
qyrq#
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 &Fjilx'k
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 gqRTv_ ;
/T)n5X
;定位用DAP (复位到0磁道) S7{.liHf
DAP0 db 16d
'*u;:[73
db 0 ;
,jLtl
dw 1 nM-SDVFM
buff1 dw 0,0 yPYJc
dw 0,0,0,0 sdYj'e:N
mndl~/
#Hi]&)p_
;DiskParameters |SKG4_wGe
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) pm~;:#z7
falgs dw 0; WORD Flags; // 信息标志 3^>a TU<Z
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 J"/z?!)IB
Heads DW 0; DWORD Heads; // 磁盘磁头数 "H<#91^|
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 vN:[
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 /;6@M=6u
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) Wxau]uix
bs EpET
cmpsect dw 0 ?7)(qnbe"
o!`O
i5
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" S.|kg2
msgHds db 0dh,0a,"Heads:$" +<9
eN
msgspt db 0dh, 0a,"SectorsPerTrack:$" n
~u3
msgTotal db 0d,0a, "Total Sectors:$" <[:7#Yo
g
msgSS db 0dh,0a, "Sector Size:$" I0+wczW,^
ih |Ky+ !
msgReadErr db 0dh,0a,"Error Reading Sectors:$" o MkY#<Q}
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" %aBJ+V F
msgReset db 0dh,0a, "Reseting drive to Cyl 0" F*t_lN5{
ggc?J<Dv
ir:~*
|
buffer db 32768d dup(0);
x9"4
vp
D"4&9"C U
data ends ;数据段结尾 wI@I(r~g
puN=OX}C
stack segment ) Zo_6%
db 400 dup(?) ,Bw)n,
stack ends zL`uiZl
7G(f1Y
code segment ;定义代码段 ,M.!z@
assume cs:code ;规定cs的内容 (0#F]""\e
assume ds:data ;规定ds的内容 8sIA;r%S
assume ss:stack [ 5
2z ta
rw[ {@|)'z
start: kN|5
J
pusha U!?
gdX
,GkW. vEU
dyiEK)$h
mov ax,data ;程序从start开始 D%UZ'bHN*
mov ds,ax ;ds置初值,data的段地址 s%[GQQ-N
X2dc\v.x
;设置缓冲区 $?J+dB
lea bx, buffer Wk
#h,p3
mov bufferaddr,bx [Cj)@OC
mov buff1,bx o 7W Kh=
mov bx,ds R{uJczu
mov bufferaddr+2,bx t
Q/
#t<4D
mov buff1,bx #z!Hb&Qi\
q%k(M[
lea di,infosize lkH;N<U
mov dl,80h I9un
mov ah,48h RE
$3| z
int 13h E? eWv)//
L'XdX\5
lea bx,msgcyl D`:d'ow~KQ
mov dx,bx [~c'|E8Q
mov ah,09 xX/s1(P
int 21h D&l,SD
mov dx,cylinders :
q64K?X
call dispdx lI_Yb:
1Dya?}3
lea bx,msghds RF~Ofi
mov dx,bx 5 k%9>U%$
mov ah,09 @ Rx6 >52>
int 21h bk"k&.C^+
mov dx,heads 0T#xM( q[K
call dispdx @D~+D@i$TW
wp%FM
lea bx,msgspt N1N{Ol'
mov dx,bx _gm?FxV:
mov ah,09 $dh4T";
int 21h ~,*YmB=Z
mov dx,spt+2 )w2K&Zr0
call dispdx D"XX920$~
mov dx,spt 4 %)N(%u
call dispdx ct}%Mdg
!\-4gr?`!
lea bx,msgtotal [Z5[~gP3
mov dx,bx W.`Xm(y
mov ah,09 "WbVCT'i
int 21h ] @)!:<+
lea bx,sectors zf3:<CRX5
call dispqword gFs/012{
Np<s[dQ
lea bx,msgss Ft;u\KT
mov dx,bx sCtw30BL
mov ah,09 6Z&u
int 21h 3<Z'F}lg
mov dx,sectorsize .3&a{IxM]
call dispdx ]TBtLU3
!Wixs]od
sbb word ptr sectors, 63d mw(c[.*%
jnc subok YYE8/\+B.
sub word ptr sectors+2,1 5rml
Aq
jnc subok A,-V$[;~D
sub word ptr sectors+4,1 {!}F
:~*r
jnc subok $HBT%g@UN
sub word ptr sectors+6,1 m
io1kDq<
qfGtUkSSb
subok: tpa^k
Bhu@ 2KdA
3g0u#t{
xd|~+4
xor ax,ax E
{KS a
mov blocknumL, ax )?B~64N,+
mov blocknumL+2, ax =,4
'"
mov blocknumL+4, ax B3dA%\'
mov blocknumL+6, ax YWRE&MQ_
o)#q9Vk%b
startread: #PslrA.
E
UV']NHh
call rwsect i#RElH
FL`1yD^2
adc word ptr blocknuml,63d z^rhgs?4
jnc addok w3<"g&n|
adc word ptr blocknuml+2,1 4W!\4Va
jnc addok Ln=>@
adc word ptr blocknuml+4,1 +~
3w5.8
jnc addok | 7 m5P@X
adc word ptr blocknuml+6,1 j!x<QNNX
jnc addok sB( `[5I
=@JS88+
addok: J0Hm)*
mov ax, word ptr sectors+6 ZUXse1,
cmp ax, blocknuml+6 qcTmsMpj
jg complete R+{^@M&
jl startread Z .bit_(
mov ax, word ptr sectors+4 Zj1ZU[BEcL
cmp ax, blocknuml+4 HkdN=q
jg complete V~
T`&
jl startread f2 ydL/M,
mov ax, word ptr sectors+2 -VWCD,c
cmp ax, blocknuml+2
,v*p
jg complete 22GnbA7O
jl startread @A2/@]H Bm
mov ax, word ptr sectors #dZ/UM(u
cmp ax, blocknuml <AMb!?Obh
jg complete
VFl 1 f
jl startread 4|6&59?pnc
%6A-OF
complete: "7kge z#Y
uNe}"hs
lea bx,msgready 'h^-t^:<>b
mov dx,bx =t3vbV
mov ah,09 -@ZzG uS(
int 21 +ze}0lrEL
Ht|",1yr+
popa =a)iVXSB]
mov ax,3100h #vj#! 1
int 21h j|[(*i%7|
[,<\RviI
; _Z+jQFKJ\8
dispdx proc near tw'hh@7-Y
pusha Z
cMj=#i
lea bx, dsp+3 hdd>&?p3
mov cx,4 jby~AJf%
@7@e`b?
repeat0: D3S+LV
mov al,dl >f\zCT%cf
and al,0fh l:Dn3Q
cmp al,09h (Qk&g"I
jg add40 fJLf7+q
add al, 30h 731h
~x!u
jmp okadd Fn86E dFM
add40: H(15vlOD
add al,37h Vk-W8[W 7
okadd: bQwdgc),s{
mov byte ptr [bx],al I9}+(6
dec bx
-F"d0a,
shr dx,4 |N:MZ#};
loopnz repeat0 x
.b; +p}=
lea bx,dsp (Sth:{;
mov dx,bx {*QvC
g?
mov ah,09h w"cM<Ewu
int 21h J>=1dCK
$%g\YdC
popa $D QD$
ret Es'-wr\Hm
dispdx endp pi`;I*f/
K2cq97k,d
dispqword proc near Y*@|My`
pusha k> b&xM
!
mov cx ,4 3 ppuQQ
add bx,6 })20Zld}a
repeatdecbx: 61/)l0<;
mov dx,[bx] ;/@?6T"
call dispdx ,IIZX
l@
sub bx,2 h?0F-6z
loopnz repeatdecbx h/I@_?k+
popa 5<89Af&&K8
ret Abj97S
dispqword endp v%lv8Lar'
2GSgG.%SSM
rwsect proc near
b f
p,zs
#P(l2 (
lea bx,msg !0I
dp%
mov dx,bx },DyU
mov ah,09h >P<z |8
int 21h \F 3C=M@:
[ULwzjss#L
lea bx,BlockNumL lPY@{1W
call dispqword /Q?~Q0{)es
m@ i2#
lea di, packetsize aS,a_b
]
mov dl,80h )xB$LJM8
mov ah,42h +0]'| t F>
int 13h K`hz
t
jnc readok 2m_'z
7p)N_cJ
D
mov cx,5 :T_'n,
;出错后重试(定位0道后再重读) `Kh]x9Z
retryrd: 8+"10q-
lea bx, msgReadErr .Y!;xB/
mov dx,bx \n#]%X5c
mov ah,09 LGIalf*7
int 21h F9MR5O"
QU:EY'2
0 Tcz[$?
lea di,dap0 q*L
]
mov dl,80h NEA_Plt
mov ah,44h !\CG,E k
int 13h BwC<rOU
3 brb*gI_b
lea bx,BlockNumL Q0pzW:=s]
call dispqword 5
k69F
42fprt
lea di, packetsize kg<P t >
mov dl,80h pd d|n2q
mov ah,42h $+Vmwd;
int 13h ql^g~b
jnc readok }6).|^]\'
loopnz retryrd R
N@^j
QhsMd-v
readok: "YJ[$TG
lea di, packetsize @]f3|>I
mov dl,80h s=MT,
mov ah,43h |GtY*|
int 13h %y iD~&
\a"i7Caa
rwsect endp 8;TAb.r
Uz 0W <u3v
code ends ;代码段结尾 *p=fi
end start ;结束汇编 [s~JceUyX
SD?BM-&~