第一个宏汇编程序 u+D[_yd^
Cd]
/
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 `cr(wdvI
?a.+j8pbGg
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 8]< f$3.
?4[H]BK
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! KJh,,xI>by
8)xt(~qF
比较长啊!所以可以自动跳过。 u3ZCT" !
otr>3a*'
.286 $/_qE
.radix 16 &mE?y%
data segment ;定义数据段 "tu*YNP\Q
.Q>!B?)
LJQJ\bT?
msg db 0dh, "Reading sector:$" :0^s0l
msg1 db 0dh, "Writing sector:$" (j&A",^^S
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 8o-bd_
C3VLV&wF
dsp db " $" E\{< ;S
Z$'IBv
;DAP ~xyw>m+o.
PacketSize db 16d; // 数据包尺寸(16字节) z`$J_Cj Y
Reserved db 0; // ==0 $-vo}k%M
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ;(6P6@+o
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) eW8[I'v_&
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 ,EEPh>cXc
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 N[U9d}Zv
o a<q /
;定位用DAP (复位到0磁道) /_\W+^fE
DAP0 db 16d Bct"X#W|&
db 0 D59T?B|BdD
dw 1 H?yE3w
buff1 dw 0,0 {6
.o=EyM{
dw 0,0,0,0 XnUO*v^]
.px:e)iW
Tby,J
B^U
;DiskParameters wW`}VKu
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) )`HA::
falgs dw 0; WORD Flags; // 信息标志 F}X0',
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 HIf{Z* mb
Heads DW 0; DWORD Heads; // 磁盘磁头数 vtxvS3
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 .ve *Vp
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ohQAA h
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) RT*5d;l0
xxa} YIe8
cmpsect dw 0 +F@_Es<6
Llz['"m
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" @Doyt{|T
msgHds db 0dh,0a,"Heads:$"
=P^wh
msgspt db 0dh, 0a,"SectorsPerTrack:$" Z=+03
msgTotal db 0d,0a, "Total Sectors:$" Xl%0/o
msgSS db 0dh,0a, "Sector Size:$" {G*QY%j^
Lz4ehWntO
msgReadErr db 0dh,0a,"Error Reading Sectors:$" H:S,\D?%2x
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" M{N(~ql
msgReset db 0dh,0a, "Reseting drive to Cyl 0" Z1,gtl ?
HGDVOJq
d^V$Z6*
]
buffer db 32768d dup(0); >q7
%UK]&
+=P@HfVfiq
data ends ;数据段结尾 9=+-QdX+0]
gPEqjj
stack segment 3qMNl>>
db 400 dup(?) 1BTIJ G w
stack ends H{fM%*w
&35|16z%@
code segment ;定义代码段 7#2j>G{?]v
assume cs:code ;规定cs的内容 $=aI"(3&
assume ds:data ;规定ds的内容 UG[e//m
assume ss:stack KMjg;!y
Fu _@!K
start: #DI$Oc
pusha smU4jh9S
t\R; < x
p25Fn`}H
mov ax,data ;程序从start开始 0 bS
A_
mov ds,ax ;ds置初值,data的段地址 TbhH&kG)1
>3D7tK(
;设置缓冲区 '$m
7ft}
lea bx, buffer MagM
ZR
mov bufferaddr,bx ;")A{tX2
mov buff1,bx N$
alUx*
mov bx,ds g+[kde;(^
mov bufferaddr+2,bx Fhj8lVvk
mov buff1,bx py<_HyJ
-{g~TUz
lea di,infosize 5lmO:G1
mov dl,80h n:#TOU1ix<
mov ah,48h raB+,Oi$G
int 13h jqcz\n d
3$p#;a:=n
lea bx,msgcyl P-Su
5F
mov dx,bx Yx)o:#2
mov ah,09 E{Vo'!LY
int 21h NHaMo*xQ
mov dx,cylinders B)=~8wsI:Z
call dispdx KCR
N}`^
%mI~
=^za
lea bx,msghds e!x6bR9EZ
mov dx,bx *\XH+/]+
mov ah,09 BWq/TG=>
int 21h %c/^_.
mov dx,heads FY#!N
L
call dispdx d;G~hVu
)]Ti>R O7
lea bx,msgspt ?nFO:N<
mov dx,bx =Hu0v}i/
mov ah,09 t#~?{i@m
int 21h BBL485`
mov dx,spt+2 #hxyOq,
call dispdx 3 <SqoJSp
mov dx,spt N{joXHCu
call dispdx 46,j9x
'K@0Wp
lea bx,msgtotal KL3<Iz]
mov dx,bx [*Ju
3
mov ah,09 r%=[},JQ
int 21h l";'6;g
lea bx,sectors Q~,YbZ-7
call dispqword +m$5a
YX
oXY Moi
lea bx,msgss jBtj+TL8
mov dx,bx mJ
mov ah,09 WjMRH+
int 21h <'m6^]:
mov dx,sectorsize e%6{ME
3
call dispdx .p@N
:)W6
:nGMtF
sbb word ptr sectors, 63d {aDFK;qG.
jnc subok 2qj{n+
sub word ptr sectors+2,1 ;j}yB
jnc subok LtKB v4
sub word ptr sectors+4,1 VcgBLkIF
jnc subok x8N|($1
sub word ptr sectors+6,1 :@. ;
-l*g~7|j
subok: }E&NPp>
TT}]wZ
^Udv]Wh
\M+L3*W
xor ax,ax +]!lS7nsW
mov blocknumL, ax 1;r69e
mov blocknumL+2, ax :pC;`iQ
mov blocknumL+4, ax ;#anZC;
mov blocknumL+6, ax Vb4;-?s_
Plo ,XU
startread: h/ep`-YaH
zQ8!rCkg4
call rwsect .YcN S%
I4e+$bU3
adc word ptr blocknuml,63d M'5'O;kn
jnc addok ^PqF<d6
adc word ptr blocknuml+2,1 mh`|=M]8E
jnc addok SN">gmY+
adc word ptr blocknuml+4,1 {]/8skov5]
jnc addok 8b&uU [
adc word ptr blocknuml+6,1 9y] J/1#
jnc addok l I-p_K
cvo[s, p
addok: (H#M<N
mov ax, word ptr sectors+6 zICI_*~
cmp ax, blocknuml+6 FxU'LN<;HY
jg complete 9`Q@'(m
jl startread 6`e@$(dfA
mov ax, word ptr sectors+4 =!.mGW-Q}
cmp ax, blocknuml+4 #G;X' BN
jg complete g1[&c+=U`P
jl startread -G`.y?
mov ax, word ptr sectors+2 SS3-+<z
cmp ax, blocknuml+2 >J>V%
7
jg complete ;u-4KK
jl startread z@h~Vb&I
mov ax, word ptr sectors .b>TK
cmp ax, blocknuml k*$3i
jg complete %|IUq jg
jl startread 8<&EvO
k
M7dU@ Ag
complete: !~ rt:Z
3#GqmhqKDk
lea bx,msgready _"N\b%CkO
mov dx,bx sa#.l% #
mov ah,09 >- Bg%J9
int 21 *e4TSqC|
$:vkX
popa ClUSrSp
mov ax,3100h S%6U~@hig
int 21h )|]dmQ-
hx!7w}[A
; E`D%PEps+
dispdx proc near =nRuY'
pusha a39h P*
lea bx, dsp+3 +!O-kd
mov cx,4 oyeG$
mpg
's%q
repeat0: .5Z_E
O
mov al,dl 1:NS}r+>3.
and al,0fh ;=;JfNnbm
cmp al,09h fE;Q:# Z.
jg add40 :L$4*8@`+
add al, 30h `/:cfP\
jmp okadd =!0I_L/
add40: D3]BTkMMS;
add al,37h c@du2ICUc
okadd: cf;Ht^M\
mov byte ptr [bx],al XD%wj
dec bx Y E1Hpeb
shr dx,4 * gqSWQ
loopnz repeat0 Z85|I.mr
lea bx,dsp $kz!zjC'
mov dx,bx j}WByaZ&
mov ah,09h <y=ovkM3
int 21h (JZ".En#X
ARB7>"
popa JLm
@Ag
ret ^Kq|ID
AP
dispdx endp kBsXfVs9
;e{5)@h$
dispqword proc near 1y[B[\
pusha v5$s#f<
mov cx ,4 Y;Y1+jt
add bx,6 !:
us!s
repeatdecbx: ?U9 /fl
mov dx,[bx] .[j%sGdKl
call dispdx m_lrPY-
sub bx,2 bhg}-dto
loopnz repeatdecbx +Ui_ O
popa =>LZ
m+P
ret zhsx&
dispqword endp 5
2Hqu>
ME+em1ZH
rwsect proc near R]L2(' B
AV4~U:vU
lea bx,msg X r_pgW
|
mov dx,bx :pZ}*?\
mov ah,09h ycpE=fso'
int 21h rla:<6tt
Spj9H ?m
lea bx,BlockNumL |E^|X!+9
call dispqword la,
h
IN !02`H
lea di, packetsize fI:H8
mov dl,80h vDE |sT
mov ah,42h b X,Siz:F
int 13h \
P/W8{
jnc readok N}
QFGX
8z T0_vw
mov cx,5 L.)yXuo4
;出错后重试(定位0道后再重读) KH<v@IJ\
retryrd: ]Yz'8uts
lea bx, msgReadErr d-$_|G+
mov dx,bx KD*O%@X5C
mov ah,09 +zO]N
&
int 21h ecFi(eMD
p:[LnL
ZBM!MSf:
lea di,dap0 >FFVY{F
mov dl,80h 3%
vis\~^
mov ah,44h m,6hee
int 13h )%j"
2P}bG>M
lea bx,BlockNumL +/cg
w,
call dispqword T.Zz;2I
==9ZFdf
lea di, packetsize gGfq6{9g
mov dl,80h JAP(|
mov ah,42h &]NZvqdj.]
int 13h uqZ3Hyb
jnc readok GU6qIz|
loopnz retryrd Bc
^4 T1
E(Gr0#8
readok: "tR}j,=S:D
lea di, packetsize 5~}!@yzc
mov dl,80h 9g@
NcJ]
mov ah,43h |]ucHV
int 13h 3M
N
0m=(W^c
rwsect endp }76.6=~
x_:hii?6V
code ends ;代码段结尾
JvJ;bFXD
end start ;结束汇编 ,wK 1=7
v33T @