第一个宏汇编程序 U3R`mHr0
sMpC4E
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 e+[J[<8
di
P4]/%1
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! TKs@?Q,J
p]IhQnj2
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! M97p.; ;
@42lpreT
比较长啊!所以可以自动跳过。 7-0twq
FYE9&{]h
.286 ~}9H<K3V
.radix 16 Q9'V&jm
data segment ;定义数据段 6'lT`E|
v lnUN
L08;z
msg db 0dh, "Reading sector:$" #mFAl|O
msg1 db 0dh, "Writing sector:$" ,i((;/O6
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" T!eh?^E
>IydXmTy
dsp db " $" 0$dNrq
5r}(|86O/
;DAP P`Wf'C^h
PacketSize db 16d; // 数据包尺寸(16字节) V?=zuB?'
Reserved db 0; // ==0 L\'qAfR Z
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) nhaoh!8A6
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) -<^Q2]PE;
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 s/'h LkxI
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 (DaP~*c3cC
aRb:.\ \zc
;定位用DAP (复位到0磁道) FXwK9
%
DAP0 db 16d eOnl
sx/
db 0 B(T4nH_k
dw 1 {*P7)
buff1 dw 0,0 \kRJUX
!s
dw 0,0,0,0 \\pyu]z
|^9ig_k`
{_gj>n (1
;DiskParameters MM)/B>c Qt
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) [tw
<TV"\
falgs dw 0; WORD Flags; // 信息标志 /P:WQ*
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 ENF@6]
Heads DW 0; DWORD Heads; // 磁盘磁头数 K{|dt W&
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 DB=cc
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 U=?"j-wN
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) uN^qfJ'@
>
vT<wd#
cmpsect dw 0 {qdhp_~^l
?ut juMdl
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" `U>b6{K
msgHds db 0dh,0a,"Heads:$" rVW'KN
msgspt db 0dh, 0a,"SectorsPerTrack:$" 38S&7>0@|q
msgTotal db 0d,0a, "Total Sectors:$" Vy*Z"k
msgSS db 0dh,0a, "Sector Size:$" v7I*W/
S{|)9EKw
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 5v-;*
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" ,rPyXS9Sa{
msgReset db 0dh,0a, "Reseting drive to Cyl 0" BGYm]b\j[
YVV $g-D}
4Tw1gas.
buffer db 32768d dup(0); P\4o4MF@K
5oy MR_yl
data ends ;数据段结尾 \$Qm2XKrK
7^e
}|l
stack segment 03jBN2[!
db 400 dup(?) ;,hoX6D$
stack ends 1Owk
Ly,P
0'2{[xF
code segment ;定义代码段 2Mi;}J1C{
assume cs:code ;规定cs的内容 e:D9;`C
assume ds:data ;规定ds的内容 &!aLOx*3`
assume ss:stack *bC^X'
jWmBUHCb
start: yXQ;LQ;
pusha 3 AF]en
B{i;+[ase
Qvg"5_26v
mov ax,data ;程序从start开始 w!k4&Rb3
mov ds,ax ;ds置初值,data的段地址 49kia!FR
. T>}O
0L"
;设置缓冲区 ">^]^wa08
lea bx, buffer J]YN2{(x
mov bufferaddr,bx q2pao?aa
mov buff1,bx 2gI_*fG1
mov bx,ds <Q~7a
hF
mov bufferaddr+2,bx C3h!
?5
mov buff1,bx
gMMd=
q`K-T_<
lea di,infosize !d@`r1t
mov dl,80h VNot4 62L
mov ah,48h 8$olP
:d
int 13h H%gD
[!^
5"]2@@b4
lea bx,msgcyl s3%8W==rBW
mov dx,bx r:Tb{cA
mov ah,09 `lOoT
int 21h ]ZATER)jq
mov dx,cylinders V zx(J)
call dispdx KPcuGJ
&H>dE]Hq,
lea bx,msghds rNO;yL4)ey
mov dx,bx =_:L
wmI
mov ah,09 c&W.slE6
int 21h C)kQi2T
mov dx,heads (:muxby%
call dispdx 8-l Y6M\R\
x5Pt\/ow
lea bx,msgspt :QSW^x
mov dx,bx 'a[|}nJ3
mov ah,09 ty=?SZF
int 21h K:Go%3~,
mov dx,spt+2 [|Pe'?zkf
call dispdx \<>%_y'/)h
mov dx,spt +Y[+2=lO
call dispdx b:&$x (|
+W4g:bB1
lea bx,msgtotal 2=
mD
mov dx,bx U2?gODh'
mov ah,09 ?b$zuJ]
int 21h UAO#$o(
lea bx,sectors @S:/6__
call dispqword [\F,\
*\vc_NP]
lea bx,msgss AWNd(B2o
mov dx,bx Eqlux
D=
mov ah,09 U.0/r!po
int 21h ;MI<J>s
mov dx,sectorsize LP_F"?4
call dispdx }}Uv0g8D
o/
5Fg>d
sbb word ptr sectors, 63d G* 6<pp
jnc subok 1"6k5wrIA
sub word ptr sectors+2,1 RN|..zml
jnc subok [63;8l}
sub word ptr sectors+4,1 '$^ F.2
jnc subok pa73`Ca]
sub word ptr sectors+6,1 :*nBo
>Tx;<G
subok: #|i{#~gxM
rT) R*3
;~;St>?\R\
]~ M
-KT
xor ax,ax r8.v0b"1
mov blocknumL, ax dfcG'+RU}
mov blocknumL+2, ax Bb`^,?m
mov blocknumL+4, ax :wAB"TCt0
mov blocknumL+6, ax DV"ri
A UV$ S2
startread: (RS:_]
Nf'9]I
call rwsect A6L}5#7-
rXX|?9'
adc word ptr blocknuml,63d (Mh\!rMg
jnc addok =h;!# ZC
adc word ptr blocknuml+2,1 #"JU39e
jnc addok q Q8l8
adc word ptr blocknuml+4,1 YPEd
XU8}
jnc addok ~MOCr
adc word ptr blocknuml+6,1 =SnR9In
jnc addok b2%[9)"I.
<`q o*__1
addok: ,oe{@z{*@
mov ax, word ptr sectors+6 /XB1U[b
cmp ax, blocknuml+6 C%>7mz-v5
jg complete 7A-rF U$
jl startread uy{KV"%"^g
mov ax, word ptr sectors+4 PBv43uIL
cmp ax, blocknuml+4 w (-n1oSo
jg complete W'$~mK\
jl startread WG{/I/bJ_
mov ax, word ptr sectors+2 mY(
_-[
W
cmp ax, blocknuml+2 #!Fs[A5%
jg complete cf'
Z#NfQ
jl startread N-]n>E
mov ax, word ptr sectors d:''qgz`
cmp ax, blocknuml V:J6eks_
jg complete
n9Yk;D2
jl startread I:"`|eHxv
'3->G/Pu
complete: N!,l4!M\N
5?MvO]_
lea bx,msgready P|U>(9;P,
mov dx,bx k:xV[9ev:
mov ah,09 ')V5hKb^
int 21 +s}28U!
RI;RE/Z
popa B=Os?'2[
mov ax,3100h Vba}RF[b
int 21h 78-:hk
`-\"p;Hp0
; m+"%J
d{q
dispdx proc near Yw<:I&
pusha ja2]VbB
lea bx, dsp+3 ) b8*>k
mov cx,4 o*xEaD
c`QsKwa
repeat0: 0oMMJ6"i
mov al,dl wP9C\W;
and al,0fh zOw]P6Gk
cmp al,09h '3VrHL@@g
jg add40 NU[{oI<a
add al, 30h
(~oPr+d
jmp okadd uzsN#'7=
add40: IuF-bxA
add al,37h c[$oR,2b13
okadd: :u0433z:
mov byte ptr [bx],al L\[jafb_`
dec bx 6dUP's_
shr dx,4 MC@cT^Z^
loopnz repeat0 ='j
lea bx,dsp JGe;$5|q8
mov dx,bx < lrw7 T
mov ah,09h V'$
eun
int 21h FzIA>njt
~k3r$e@
popa {cA )jW\'
ret =$Z'F<|d
dispdx endp x{}m)2[ Y
K3^2R-3:8
dispqword proc near ?6bE!36
pusha .R,8<4
mov cx ,4 s>X;m
.<
add bx,6 Me>'QVr
repeatdecbx: n6}1{\
mov dx,[bx] s@|?N+z
call dispdx 9P$'ON'"
sub bx,2 t}
nRW o
loopnz repeatdecbx %XeU4yg\e
popa 2srz) xEe
ret 3a0C<hW
dispqword endp >Z%^|S9
D 4wB
&~U
rwsect proc near 6eD[)_?]y
K\q/JuDfc
lea bx,msg 67eo~~nUtg
mov dx,bx ;`+,gVrp
mov ah,09h SccU@3.X~
int 21h 4o8!p\a
{TNAK%'v
lea bx,BlockNumL H
NPr|
(
call dispqword Yy}aQF#M
AUK7a
lea di, packetsize ov~m?Y]h
mov dl,80h ajAEGD2Zq
mov ah,42h GZw<Y+/V"5
int 13h ')+EW"
e
jnc readok )94R\
f
lI 8"o>-~
mov cx,5 = DgD&_
;出错后重试(定位0道后再重读) 2i)y'+s
retryrd: /Kvb$]F+!
lea bx, msgReadErr ;V
GrZZ
mov dx,bx QI-3mqL
mov ah,09 r4s R5p]|
int 21h l
O^h)hrR
*)1,W+A5L
83a
Rq&(R
lea di,dap0 @b
zrJ7$
mov dl,80h b/EvcN8 }
mov ah,44h A@]
n"
int 13h a#1X)ot
Q7\Ax0
lea bx,BlockNumL M: 6cma5
call dispqword WA/\x
\Mi< ROp5
lea di, packetsize &,/T<V
mov dl,80h `6A"eDa
mov ah,42h ,]MX&]
int 13h 82vx:*Ip!}
jnc readok c2nZd.SD|
loopnz retryrd bCF63(0
i@RjG
readok: ZS-9|EA<
lea di, packetsize 4$^=1ax
mov dl,80h \WTg
0b[
mov ah,43h L0Cf@~k
int 13h weOMYJO;8
[Dhc9
rwsect endp ZttL*KK
U
uysG\
code ends ;代码段结尾 b<8h\fR#'
end start ;结束汇编
rW^&8E[
#E1*1E