第一个宏汇编程序 0
HGM4[)=
Y-kt.X/Z-
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 Wk~WOzr}^
~ELNyI11
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! ;&<{ey
HePUWL'
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! GPkmf%FJ
iHeN9 cl
比较长啊!所以可以自动跳过。 |^: cG4e
E7t+E)=8
.286 c`J.Tm[_u
.radix 16 FQu8vwV6>
data segment ;定义数据段 EYtL_hNp}I
o3Yb7h9
7C,&*Ax,9
msg db 0dh, "Reading sector:$" wQqb`l7+
msg1 db 0dh, "Writing sector:$" E27vR 7
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Yw4n-0g
jF ^~p9z
dsp db " $" aoMqSwF=
fol,xMc&
;DAP UtPLI al
PacketSize db 16d; // 数据包尺寸(16字节) S^-DK~Xt4
Reserved db 0; // ==0 \Jx04[=
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) x2OaPlG,&V
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) aC$B2
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 "'c
A2~
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 \|H!~) h$1
RN$1bxY
;定位用DAP (复位到0磁道) f,h J~
DAP0 db 16d E@@5BEB ~
db 0 x'+T/zw
dw 1 "$#xK |t
buff1 dw 0,0 ',Y.v"']4
dw 0,0,0,0 3
LAI
l913
Dd'm U
xbdN0MAU
;DiskParameters 5's87Z;6
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) YLqGRE`W
falgs dw 0; WORD Flags; // 信息标志 iq8GrdL"
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 .u*
0[N
Heads DW 0; DWORD Heads; // 磁盘磁头数 Sh/T ,
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ]JCvyz
H
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 <v)1<*I
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) < Wfx+F
KC/=TSSXd.
cmpsect dw 0 JLnH&(O
D?;"9e%
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" r[2ILe
msgHds db 0dh,0a,"Heads:$" (KFCs^x7wG
msgspt db 0dh, 0a,"SectorsPerTrack:$" :}5j
##N
msgTotal db 0d,0a, "Total Sectors:$" gRCdY8GH
msgSS db 0dh,0a, "Sector Size:$" iX0i2e
k
*^g:P^4
msgReadErr db 0dh,0a,"Error Reading Sectors:$" *!q1Kr6r
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 4lr(,nPRD
msgReset db 0dh,0a, "Reseting drive to Cyl 0" )Ub_@)X3%l
#r#1JtT
H\h3TdL
buffer db 32768d dup(0); !k6K?xt
d;zai]]
data ends ;数据段结尾 1;C+$
&+cEV6vb+
stack segment G/b^|;41
db 400 dup(?) NG--6\
stack ends ~D<IB#C
3vuivU.3
code segment ;定义代码段 hlV=qfc
assume cs:code ;规定cs的内容 .n#@$
nGZ
assume ds:data ;规定ds的内容 !Fca~31R'
assume ss:stack 1Yq?X:
5*+!+V^?X
start: A#Iyb){Y
pusha e5* ni/P
C>-aIz!y
W=j[V
Oq
mov ax,data ;程序从start开始 gW^VVbB'L
mov ds,ax ;ds置初值,data的段地址 BcL{se9<
CLRiJ*U
;设置缓冲区 w$+&3t
lea bx, buffer Jy)KqdkX+
mov bufferaddr,bx 4 8:>NW
mov buff1,bx q;R],7Re
mov bx,ds kO,zZF&
mov bufferaddr+2,bx +fC=UAZ
mov buff1,bx J#w
J4!
<vUbv
lea di,infosize /RNIIY~w
mov dl,80h q"%_tS
mov ah,48h U}6B*Xx'
int 13h tQ8.f
zDw5]*R
lea bx,msgcyl 4A8;tU$&
mov dx,bx v'U{/ ,x
mov ah,09 rm5bkJcg~
int 21h syWG'(>
mov dx,cylinders fa++MNf}3
call dispdx ",
^Mxm{
4,sJE2"[9
lea bx,msghds gYNjzew'
mov dx,bx
]^Qn
mov ah,09 Q3
u8bx|E
int 21h 9`1O"R/
mov dx,heads oI=fx Sjd
call dispdx ,I7E[LU
$CY~5A `l9
lea bx,msgspt q@Zn|NR
mov dx,bx mR&H9NG
mov ah,09 43|XSyS
int 21h v>$'iT~ l
mov dx,spt+2 ;1:Js0=;
H
call dispdx j"}*T
mov dx,spt x.f]1S7h[
call dispdx ,VCyG:dw
ZG>PQA
lea bx,msgtotal tasIDoo+!J
mov dx,bx {1IfU
mov ah,09 lhYe;b(
int 21h ,24p%KJ*X
lea bx,sectors %6t2ohO"
call dispqword HW=C),*]cR
u -;_y='m
lea bx,msgss d*jMZ%@uS
mov dx,bx VRI0W`
mov ah,09 H| 8Qp*
int 21h 8 7BHq)
mov dx,sectorsize [Grxw[(_:
call dispdx Z1 Bp+a3
6{"$n
F]
sbb word ptr sectors, 63d mp=z
jnc subok b6Wq
r/
sub word ptr sectors+2,1 vK9E
jnc subok 7uKNd
*%
sub word ptr sectors+4,1 ;*Ivn@L
jnc subok ePr&!Tz#
sub word ptr sectors+6,1 X#*JWQO=
{l>yi
subok: o9JMH.G
N"" BCh"
Of"
CS@FYO
xor ax,ax H7d/X
mov blocknumL, ax -&3hEv5
mov blocknumL+2, ax 8dO!
mov blocknumL+4, ax mzeY%A<0^
mov blocknumL+6, ax 8.XoVW#
YpH&<$x:
startread: Jll-`b 1
/JHc! D
call rwsect A Y*e@nk\
}])oM|fgO
adc word ptr blocknuml,63d <g1hxfKx5
jnc addok XiL~TCkx4
adc word ptr blocknuml+2,1 s!?`T1L
jnc addok F $ #U5}Q
adc word ptr blocknuml+4,1 j7jCm:
jnc addok ~rDZ?~%
adc word ptr blocknuml+6,1 p^Ak1qm~e
jnc addok @ o3T
,u+PyG7 cb
addok: rf>0H^r
mov ax, word ptr sectors+6 {)BTR %t
cmp ax, blocknuml+6 3on7~*
jg complete _J Hd9)[
jl startread iH/6M
mov ax, word ptr sectors+4 f|B=_p80
cmp ax, blocknuml+4 `+o2DA)#(
jg complete :+qF8t[L
jl startread LS7, a|
mov ax, word ptr sectors+2 5_- (<B
cmp ax, blocknuml+2 pm_`>3
jg complete `-(|>5wWS
jl startread `Gn50-@
mov ax, word ptr sectors HkO7R
`
cmp ax, blocknuml Ove<mFI\
jg complete "t(p&;d
jl startread h-G)o[MA
7s/u(~d)
complete: t"=
E^r
YE|SKx@
lea bx,msgready cd
(
GvX'
mov dx,bx mVVD!
mov ah,09 F({HP)9b
int 21 V!lZ\)
D)j(,vt
popa ]^lw*724'>
mov ax,3100h >Db;yC&
int 21h }|g\ 8jq
A/u)# ^\
; $6mX
dispdx proc near Y
zh"1|O
pusha ?AJKBW^
lea bx, dsp+3 43mP]*=A
mov cx,4 2 lj'"nm
EB2w0a5
repeat0: y9x w
9l'
mov al,dl `8AR_7i
and al,0fh d/BM&r
cmp al,09h K
P Oa|$
jg add40 ~\Hc,5G
add al, 30h -o!$tI&
jmp okadd <kGU,@6PF
add40: ) L#i%)+
add al,37h M%ICdIc'
okadd: h| ,:e;>}
mov byte ptr [bx],al 77\]B
dec bx _H j!2 '
shr dx,4 P(+&OoY2
loopnz repeat0 LIcM3
_.
lea bx,dsp 2w["aVr
=
mov dx,bx <eQj`
HL
mov ah,09h 3~uW I%I`
int 21h Nv(9N-9r
%p2Sh)@M
popa ldiD2
Q
ret XZ^^%*ew
dispdx endp )iYxt:(,
"uaMk}[ <!
dispqword proc near v2B0q4*BS?
pusha ]j`c]2EuP
mov cx ,4 9y<*8bI
add bx,6 p-Kz-+A [
repeatdecbx: v^#~98g]
mov dx,[bx] L<ue$'
call dispdx ti
I.W
sub bx,2 wE? 'Cl
loopnz repeatdecbx sg$rzT-S4
popa GBRa.;Kk
ret 7R6ry(6N
dispqword endp j!U-'zJ
Q36q
Iq_0e
rwsect proc near [co% :xJu
5]AC*2(
lea bx,msg ~GL]wF2#
mov dx,bx Bj1
?x
mov ah,09h
%= fHu+
int 21h aqj@Cjk4Z
L&u$t}~)
lea bx,BlockNumL L*&p!
call dispqword (NF~Ck$#q
(C@m Lu)
lea di, packetsize G/7cK\^u
mov dl,80h ";3zXk[#
mov ah,42h ioYGZ%RG#
int 13h xx#zN0I>-y
jnc readok 3NqN\5B:
X*{2[+<o
mov cx,5 "|q qUKJZ
;出错后重试(定位0道后再重读) L)@?e?9
retryrd: VXR>]HUF
lea bx, msgReadErr 7ccO93Mz
mov dx,bx ?}kG`q
mov ah,09 C~o7X^[R\
int 21h >`A9[`$n
X]wRwG
J
l#%uU/sx
lea di,dap0 ;c4gv,q@
mov dl,80h whi`Z:~
mov ah,44h e[&L9U6GW-
int 13h s'%R
\$*7 >`k
lea bx,BlockNumL *X+79vG:
call dispqword mP0yk|
5N/%v&1
lea di, packetsize -uMSe~
mov dl,80h :lf+W
mov ah,42h ^/\Of{OZ-
int 13h #~C]ZrK
jnc readok `$W_R[
loopnz retryrd Qo;zHZ'
D-5VC9{
readok: Exc9`
7%.
lea di, packetsize Rb%8)t
x
mov dl,80h v(ZYS']d2
mov ah,43h r76
J
N
int 13h 'VzP};
L?WFmn
rwsect endp ;/r1}tl+3>
*>n;SuT_
code ends ;代码段结尾 $5ak_@AC
end start ;结束汇编 tt0f-:#
MP_ ~<Q