第一个宏汇编程序 W#wC
): r'IR
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 Bu{%mm(
|Z$)t%'
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! N'|9rB2e
6^FUuj.
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! maV*+!\
U;gy4
rj
比较长啊!所以可以自动跳过。 XHY,;4
SL_JA
.286 HDz"i
.radix 16 "\M3||.!
data segment ;定义数据段 jtqU`|FSQ
=S\
pI
SK_N|X].
msg db 0dh, "Reading sector:$" ~c\2'
msg1 db 0dh, "Writing sector:$" u:,B&}j
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" [kPl7[OL
qVds
2
dsp db " $" w2K>k/v{-
$us7fuKE
;DAP P_gai7Xg
PacketSize db 16d; // 数据包尺寸(16字节) t~Ic{%bdA
Reserved db 0; // ==0 1W9uWkk_d
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) 18y'#<X!
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) t,kai6UM
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 lvUWs
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 lO}I>yo}\
yzX S{#\
;定位用DAP (复位到0磁道) KnK\X>:
DAP0 db 16d 2 ,.8oa(
db 0 |1T[P)Q
dw 1 3v)``
n@
buff1 dw 0,0 7qdB
dw 0,0,0,0 lnV!Xuf
CZ(fP86e
e C&!yY2g
;DiskParameters cWI7];/d;
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 2F ~SH
falgs dw 0; WORD Flags; // 信息标志 )=0@4
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 mH'om
SCz
Heads DW 0; DWORD Heads; // 磁盘磁头数 $@[Mo
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 xI
~ c~KC
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 cOP%R_ak?
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) |s!n7%|,7
%y)LBSxf
cmpsect dw 0 !ed0
=':B
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" B5]nP
.R
msgHds db 0dh,0a,"Heads:$" _ n4C~
msgspt db 0dh, 0a,"SectorsPerTrack:$" }w)wW1&
msgTotal db 0d,0a, "Total Sectors:$" mf2Qu
msgSS db 0dh,0a, "Sector Size:$" YH-W{].
}jg,[jw_"X
msgReadErr db 0dh,0a,"Error Reading Sectors:$" XZ/cRE
z^s
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" \u 6/nvZ]N
msgReset db 0dh,0a, "Reseting drive to Cyl 0" qi8~bQ{rH
i\RB KF
jYW-}2L
buffer db 32768d dup(0); {65_k
&VVvZ@X;
data ends ;数据段结尾 !'=<uU-
gyCXv0*z
stack segment ,4(m.P10
db 400 dup(?) >
}86#^F
stack ends ''.\DC~K
?nf4K/IjZ!
code segment ;定义代码段 P>7PO~E.
assume cs:code ;规定cs的内容 %O>_$
4q
assume ds:data ;规定ds的内容 Ko
FWI_(b
assume ss:stack )N&95\u
"}<baz
start: Wix4se1Ac
pusha L0ZAF2O
Lvn+EM
85+w\KuEY
mov ax,data ;程序从start开始 =8DS~J{
mov ds,ax ;ds置初值,data的段地址 #?bOAWAwLh
U#4>GO;A
;设置缓冲区 r<"k
/
lea bx, buffer nB%[\LtZ?
mov bufferaddr,bx 1c$ce+n~
mov buff1,bx ~B`H5#
mov bx,ds IZxr;\dq6
mov bufferaddr+2,bx kX:8sbZ##4
mov buff1,bx d*:J0J(
=AeOkie
lea di,infosize ~8[`(
/hj
mov dl,80h \%.&$z3wz
mov ah,48h oCB#i~|>a
int 13h RNX>I,2sh
. 3xf!E*
lea bx,msgcyl <@qJsRbhK
mov dx,bx wd
Di5-A4
mov ah,09 ?lIh&C8]X
int 21h Ia>~ph#]{`
mov dx,cylinders &lB>G[t
call dispdx T?D]]x
wgZ6|)!0
lea bx,msghds F>5)Clq
mov dx,bx &"X1w $
mov ah,09
$XrX(l5
int 21h t;lK=m|
mov dx,heads S2$r 6T
call dispdx
e:6mz\J
44UN*_qG
lea bx,msgspt =n MAw&`
mov dx,bx cUU"*bA#
mov ah,09 prVqV-S6TY
int 21h
=#vU$~a
mov dx,spt+2 fyv S1_
call dispdx <;dFiI-GO#
mov dx,spt SdJk
no
call dispdx E_K32)J-
* YTv"
lea bx,msgtotal <J^94-[CF
mov dx,bx gq)uv`3
mov ah,09 ~gOdK-SV*
int 21h }kk[lvhJ
lea bx,sectors ;-kg3fGB1Q
call dispqword }9L;|ul6
`W4Is~VVv
lea bx,msgss <rNz&;m}
mov dx,bx h ?+vH{}j
mov ah,09 #M:Vwn
JX
int 21h ^~m}(6
mov dx,sectorsize 5K$d4KT
call dispdx HH^yruP\}
<J!?eH9f
sbb word ptr sectors, 63d vNAQ/Q
jnc subok "^Vfo$q
sub word ptr sectors+2,1 4pFoSs?\
jnc subok Qr[".>+
sub word ptr sectors+4,1 a.SxMF
jnc subok \0^Je>-:U
sub word ptr sectors+6,1 ;x4yidb6
<*
djtO
subok: ^L's45&_
*0%G`Q
x c$jG?83#
Z]^O=kX
7k
xor ax,ax X1%_a.=VF
mov blocknumL, ax +\MGlsMK@.
mov blocknumL+2, ax t` zPx#])
mov blocknumL+4, ax p 4l B#
mov blocknumL+6, ax =|q@Q`DB
a8Z{-=)
startread: 4J2C#Cs
D;X/7 p|>
call rwsect *g 2N&U
HQrx9CXE
adc word ptr blocknuml,63d 'k9 1;T[
jnc addok R,W
w/D
adc word ptr blocknuml+2,1 (EOYJHZB!
jnc addok }zHG]k,j
adc word ptr blocknuml+4,1 2sT\+C&H
jnc addok ngH_p>
adc word ptr blocknuml+6,1 ?,*KA Gg%
jnc addok 2Xp?O+b#"O
r1|;V~a$~
addok: qjLFgsd
mov ax, word ptr sectors+6 Us8nOr>5
cmp ax, blocknuml+6 THnZbh4#)
jg complete DgC;1U'
jl startread l~GcD
mov ax, word ptr sectors+4 (Bu-o((N@0
cmp ax, blocknuml+4 ((]Sy,rdk
jg complete 4G=KyRKh
jl startread stlkt>9
mov ax, word ptr sectors+2 'V:ah38
cmp ax, blocknuml+2 I sB=G-s
jg complete 5=P*<Dnj
jl startread +rOd0?
mov ax, word ptr sectors CrEC@5j
cmp ax, blocknuml /1LQx>1d
jg complete b'G!)n
jl startread 9AZpvQ
Z<
$y)bf
complete: "A&