第一个宏汇编程序 4!
V--
F
@u}1 S1
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 n%Gk
{h5
5 U{}A\q
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! NU?05sF
A ^wIsAxT
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! j* \gD
MehMhH
Y
比较长啊!所以可以自动跳过。 E[N3`"
V]$J&aD
.286 &>&UqWL
.radix 16 D4fHNk)kZ
data segment ;定义数据段 ,Rh6(I
\ZPmPu9^(
}Kc03Ue`%e
msg db 0dh, "Reading sector:$" 8LM 91
msg1 db 0dh, "Writing sector:$" @mB*fl?-
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" BLskUrPF
!uJDhC
dsp db " $" Q(J6;s#b
%qf ?_2v
;DAP W8R"X~!V
PacketSize db 16d; // 数据包尺寸(16字节) _R?:?{r,
Reserved db 0; // ==0 ic_q<Y}
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) G`1FD
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) J$X{4
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 "0(
_
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 bzt(;>_8
K~B@8az
;定位用DAP (复位到0磁道) CHPu$eu
DAP0 db 16d C0$KpUB
db 0 6!GO{2d"
dw 1 ySk'#\d
buff1 dw 0,0 p Y[dJxB
dw 0,0,0,0 y6*9, CF
O0VbKW0h3
3Bk_4n
;DiskParameters 2,,t+8"`
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) =6N%;2`84
falgs dw 0; WORD Flags; // 信息标志 k&h3"
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 2!+saf^-,
Heads DW 0; DWORD Heads; // 磁盘磁头数 N-O"y3W}
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 g*nh8
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 lQSKY}h
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) +7]]=e<[E
^k7`:@
z0U
cmpsect dw 0 wZ_k]{J
+jPs0?}s
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$"
-U"h3Ye^
msgHds db 0dh,0a,"Heads:$" eJ3w}"?9s
msgspt db 0dh, 0a,"SectorsPerTrack:$" R;68C6 4
msgTotal db 0d,0a, "Total Sectors:$" %kRQ9I".
msgSS db 0dh,0a, "Sector Size:$" hH|moj]
KPcOW#.T
msgReadErr db 0dh,0a,"Error Reading Sectors:$" LyB &u()
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" ,xeJf6es
msgReset db 0dh,0a, "Reseting drive to Cyl 0" e0ea2
2
97%S{_2m/
DiLZ5^`]
buffer db 32768d dup(0); N @24)g?
g_l=z`,8
data ends ;数据段结尾 2MapB
*
O-D${==
stack segment `X06JTqf:
db 400 dup(?) bm+
#OI
stack ends gLyE,1Z}u
@{|vW
code segment ;定义代码段 xy$agt>j>
assume cs:code ;规定cs的内容 lS.&>{
assume ds:data ;规定ds的内容 L(bYG0ZI5C
assume ss:stack XpLK0YI
G(~
s(r{%I
start: XpH]CF
pusha T3W?-,
muc>4!Q
/Dl{I7W
mov ax,data ;程序从start开始 \<bar ~
mov ds,ax ;ds置初值,data的段地址 Av#_cL
gh{Z=_
;设置缓冲区 )_\ZUem
lea bx, buffer `(rnD
mov bufferaddr,bx vCB0x:/
mov buff1,bx tXgsWG?v[H
mov bx,ds >*A"tk#oR
mov bufferaddr+2,bx W".: 1ov#B
mov buff1,bx XsVp7zk\
y@ 'm D*z
lea di,infosize _4]GP3`
mov dl,80h *
)6:yn
mov ah,48h 5#|f:M]Bo|
int 13h X_6h8n}i
).BZPyV<
lea bx,msgcyl y p}a&Dg
mov dx,bx 6!e I=h2P
mov ah,09 #:yh2y7a%
int 21h EqV]/0-\
mov dx,cylinders lLb"><8a
call dispdx (rM-~h6g
:Rq>a@Rp
lea bx,msghds #H;yXsR`
mov dx,bx C{r Sq
mov ah,09 (")IU{>c6
int 21h *}hx9:9\B
mov dx,heads ;6T>p
call dispdx ^s_BY+#
iIe\m V
lea bx,msgspt ve [*t `
mov dx,bx ,1}c% C*,Q
mov ah,09 +NH#t}.
int 21h U;l!.mze
mov dx,spt+2 ?Z]5
[
call dispdx "5+x6/9b
mov dx,spt /R2K3E#
call dispdx 9F
&s9(=\
yJj$ir i
lea bx,msgtotal 1I{^]]qw
mov dx,bx P}AfXgr
mov ah,09 gg-4ce/
int 21h z)Is:LhS
lea bx,sectors ,'KQF C
call dispqword VKjDK$
t=IpVl!
lea bx,msgss _h=kjc}[.O
mov dx,bx V@QWJZ"
mov ah,09 Aw3
8Tw
int 21h d'4^c,d
mov dx,sectorsize yMQZulCWE
call dispdx wstH&^
_wC4n }J
sbb word ptr sectors, 63d Vh WF(*
jnc subok ]CFh0N|(L
sub word ptr sectors+2,1 h]6"~ m
jnc subok <)vjoRv
sub word ptr sectors+4,1 b xU13ESv
jnc subok m3cO{
1I
sub word ptr sectors+6,1 '_nJ DM
`H_.<``>
subok: 01 vEt
[M7&
`pHlGbrW
]
X9e|
xor ax,ax 2Op\`Ht&
mov blocknumL, ax uEK9
mov blocknumL+2, ax Hkcr+BQ
mov blocknumL+4, ax w;RG*rv
mov blocknumL+6, ax
}3"FQ/6C
o]#M8)=
startread: u;[*Z
b R6g^Yf
call rwsect E7_)P>aS5
$!(J4v=X
adc word ptr blocknuml,63d Dd(#
jnc addok Vz"Ja
adc word ptr blocknuml+2,1
JwkMRO
jnc addok %(c5T)B9
adc word ptr blocknuml+4,1
)N8[@
jnc addok WxN@&g(
adc word ptr blocknuml+6,1 8b^v@|)N
jnc addok AS}
FRNIVx
eC9nOwp]xH
addok: A 11w{`EM
mov ax, word ptr sectors+6 !OVTs3}
cmp ax, blocknuml+6 2W}f|\8MX
jg complete <rO0t9OH
jl startread
~s
:Ml
mov ax, word ptr sectors+4 FXHcy:)}G
cmp ax, blocknuml+4 KNkVI K
jg complete 8hTtBa
jl startread zjzW;bo( d
mov ax, word ptr sectors+2 tKnvNOhn
cmp ax, blocknuml+2 y?t2@f]!XK
jg complete |\1!*Qp
jl startread x"n!nT%Z
mov ax, word ptr sectors N^G:m~>
cmp ax, blocknuml %
|6t\[gn
jg complete dW32O2@-
jl startread v-V#?+#
PWwz<AI+
complete: 6
3J_u-o
t3~ZGOn
lea bx,msgready !zhg3B#p
mov dx,bx O[N}@%HMW
mov ah,09 Qj?qWVapA
int 21 )4[Yplo
$*%ipD}f
popa Au q)
mov ax,3100h Yt 9{:+[RK
int 21h "|2|Vju%
|
JmEI9n2
; RS$!TTeQ
dispdx proc near * 5H
pusha w4:
lea bx, dsp+3 \Bg;^6U
mov cx,4 [>B`"nyNQ
syEWc(5
repeat0: 5pOb;ry")`
mov al,dl sd@JQ%O
and al,0fh rNdeD~\
cmp al,09h :V(+]<
jg add40 5$v,%~$Xds
add al, 30h pwiXA{
jmp okadd 4QK~qAi
add40: +YL9gNN>P
add al,37h V/=NIeSE
okadd: "Y9PS_u(~
mov byte ptr [bx],al Po%+:0oX
dec bx :GXD-6}^|
shr dx,4 cGevFlnh
loopnz repeat0 >O{U4_j@(
lea bx,dsp KxEy
N (n
mov dx,bx x6, #Jp
mov ah,09h
H%!ED1zpA
int 21h B=>:w%<Ii
*1}UK9X;
popa D!K){E
ret zyznFiE
dispdx endp i; 8""A
Fp)+>oT
dispqword proc near y+ZRh?2
pusha Ca SoR
|
mov cx ,4 Ft7{P.g
add bx,6 :YZqrcr}
repeatdecbx: 6' 9ITA
mov dx,[bx] ?B)
jnBh|
call dispdx F__(iXxC
sub bx,2 O4Wn+$AN
loopnz repeatdecbx Fq]ht*
popa (8[et m
ret v<*ga7'S
dispqword endp 1;; is
l5> H\
rwsect proc near CXb-{|I}d
$.a4Og2
lea bx,msg =F(fum;zH
mov dx,bx M^i^_}~S;
mov ah,09h j89C~xP6
int 21h eV?._-G
6;LM1
_
lea bx,BlockNumL .{cka]9WJz
call dispqword 2wHvHH!
"T*
Sg
lea di, packetsize SJYy,F],V"
mov dl,80h j}0W|*
mov ah,42h o\_@4hXf
int 13h `zr%+
jnc readok X*Ibk-PUM
9t
3mU:
mov cx,5 So?ScX\lG
;出错后重试(定位0道后再重读) a/9R~DwN
retryrd: jTo-xP{lC
lea bx, msgReadErr .
6wyu7oK
mov dx,bx
aOS:rC
mov ah,09 px@:t}
int 21h g]'Rw
I
$ekB+
t:cj
[D]9M"L,vQ
lea di,dap0 TRQ@=.
mov dl,80h EcBJ-j6d
mov ah,44h 3DNw=Ic0k
int 13h 9?VyF'r=
(+@
Lnz\
lea bx,BlockNumL t0[H_
call dispqword X[Lwx.Ly8
we6kV-L.
lea di, packetsize \#(3r1(
mov dl,80h eR'Df"+
mov ah,42h `Qf$]Eoft
int 13h 6x1!!X+)+
jnc readok $=7'Cm?
loopnz retryrd sh $mOy
s0}OsHAj
readok: 5t`:=@u
lea di, packetsize d)'am
3Q
mov dl,80h x%acWeV5
mov ah,43h 0P(U^rkR~
int 13h *z2G(Uac
V3<baxdE
rwsect endp ~16QdwK
8hx4s(1!
code ends ;代码段结尾 .hYrE5\-
end start ;结束汇编 TM|M#hMS
h$#QRH