第一个宏汇编程序 np|S
y;:
h]5(].
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 +qN>.y!Y
Ye%~I`@?
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! &~cBNw|
S3C]AhW;
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 2"v6
>b%
?>9/#Nv
比较长啊!所以可以自动跳过。 j.[.1G*("
+)AG*
.286 x;O[c3I
.radix 16 d(ZO6Nr Q
data segment ;定义数据段 C!O0xhs
7(1|xYCx$
z#9aP&8 Q
msg db 0dh, "Reading sector:$" R+
hU8 pu
msg1 db 0dh, "Writing sector:$" (q/e1L-S
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Po+.&7F
~p6 V,Q
dsp db " $" i'<[DjMDlm
~Py`P'+
;DAP dM.f]-g
PacketSize db 16d; // 数据包尺寸(16字节) F@D`N0Pte
Reserved db 0; // ==0 A7{\</Z
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) GhAlx/K
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ''cInTCr
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 L?b~k=
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 B&M%I:i
3oj' ytxN
;定位用DAP (复位到0磁道) Qab>|eSm
DAP0 db 16d 4!{KWL`A
db 0 YsC>i`n9
dw 1 -u+vJ6EY
buff1 dw 0,0 TIqtF&@o4
dw 0,0,0,0 Gq)]s'r2
s2p\]|5
YR\fa Vk
;DiskParameters u=
*FI
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 5;Czu(iH$
falgs dw 0; WORD Flags; // 信息标志 olB.*#gA
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 *g "Nq+i@
Heads DW 0; DWORD Heads; // 磁盘磁头数 )N{Pw$l_
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 soB,j3#p'*
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ~Y[r`]X`"m
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) G<zwv3
@f>-^
cmpsect dw 0 /obfw^
AG
nxYV"p
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" oi7@s0@
msgHds db 0dh,0a,"Heads:$" JJ-( Sl
msgspt db 0dh, 0a,"SectorsPerTrack:$" @Rze|
T.
msgTotal db 0d,0a, "Total Sectors:$" zy?|ODM
msgSS db 0dh,0a, "Sector Size:$" d UE,U=
6xmZXpd!
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 0(}t8lc
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 98c(<
msgReset db 0dh,0a, "Reseting drive to Cyl 0" F} yW/
PA{PD.4Du
)bL'[h
buffer db 32768d dup(0);
[-1^-bb
R{`(c/%8
data ends ;数据段结尾 4&lv6`G `
h%na>G
stack segment q4h]o^ +
db 400 dup(?) GRIti9GD
stack ends oN~&_*FE
8.1c?S
code segment ;定义代码段 )2KF}{
assume cs:code ;规定cs的内容 caR<Kb:;*
assume ds:data ;规定ds的内容 _IHV7*u{;
assume ss:stack H\" sgoJ
IxN9&xa
start: >0y'Rgfe
pusha qCC.^8
f1RWP@iar
wYXQlxd y
mov ax,data ;程序从start开始 wD}l$& +
mov ds,ax ;ds置初值,data的段地址 5J.bD)
yrP
Vi$~-6n&
;设置缓冲区 IVnHf_PzF
lea bx, buffer #<"~~2?
mov bufferaddr,bx
IZ-1c1
mov buff1,bx |fJ};RLI"
mov bx,ds BQHVQs
mov bufferaddr+2,bx PCee<W_%YE
mov buff1,bx m,_Z6=I:
dh\'<|\K
lea di,infosize \[i1JG
mov dl,80h S"QWB`W2
mov ah,48h .[KrlfI
int 13h [ZwjOi:)
se2!N:|R!G
lea bx,msgcyl A/$QaB,x
mov dx,bx tmYz R%i
mov ah,09 pZ{+c
int 21h ;W
)Y
OT
mov dx,cylinders ha<[bu e
call dispdx <]t%8GB2V
ea2ayT
lea bx,msghds e;q!6%
mov dx,bx .WJYQi
mov ah,09
K=Z|/Kkh
int 21h ,5p(T_V/
mov dx,heads z=\&i\>;Z+
call dispdx \fLMr\LL&
%)8}X>xq
lea bx,msgspt vkV0On
mov dx,bx Q~]uC2Mw
mov ah,09 Lnl(2xD
int 21h *!t/"b
mov dx,spt+2 c9
eM/*:
call dispdx
nsC3
mov dx,spt .k%72ez
call dispdx U[-o> W#
k/_ 59@)
lea bx,msgtotal vzAax k%
mov dx,bx 2%Ri,4SRb
mov ah,09 E?f-wQF
int 21h oUlY?x1
lea bx,sectors q'F+OQb1
call dispqword @+2=g WH
Y;M|D'y+
lea bx,msgss r.&Vw|*>
mov dx,bx Yx%Hs5}8
mov ah,09 #$07:UJ
int 21h K&]G3W%V
mov dx,sectorsize X=&ET)8-Y
call dispdx h
0Q5-EA
z (wc0I
sbb word ptr sectors, 63d {*" |#6-
jnc subok e\l7Iu
sub word ptr sectors+2,1 ibk6|pp
jnc subok /& {A!.;
sub word ptr sectors+4,1 13=AW
jnc subok K#d`Hyx
sub word ptr sectors+6,1 *I.f1lz%*
O"9\5(w
subok: CNyIQ}NJ
`cUl7 'j
zT]8KA
CAWNDl4
xor ax,ax s?}e^/"v
mov blocknumL, ax e{K 215
mov blocknumL+2, ax dt]-,Y
mov blocknumL+4, ax +.[ <%
mov blocknumL+6, ax 7t0=[i
~L\z8[<C
startread: prF%.(G2)
Z]Cq3~l
call rwsect b94DJzL1z
`p-cSxR_
adc word ptr blocknuml,63d #&aqKVY
jnc addok 9wwqcx)3(
adc word ptr blocknuml+2,1 &)ChQZA
jnc addok skVi
Mo
adc word ptr blocknuml+4,1 ~rKrpb]ow
jnc addok
Cctu|
^V
adc word ptr blocknuml+6,1 D?_Zl;bQ'^
jnc addok s Y Qk
- % h.t+=U
addok: YnAm{YyI
mov ax, word ptr sectors+6 j{A y\n (
cmp ax, blocknuml+6 nh>vixe
jg complete VA_PvL.9
jl startread DV-d(@`K
mov ax, word ptr sectors+4 'G4ICtHQ
cmp ax, blocknuml+4 <{cQM$#
jg complete }<S
Q
jl startread Om\vMd@!
mov ax, word ptr sectors+2 @o _}g !9=
cmp ax, blocknuml+2 cp7=epho
jg complete LckK\`mh
jl startread HyZqUbHa
mov ax, word ptr sectors m}t`FsB.
cmp ax, blocknuml zu{P#~21
jg complete osAd1<EIC
jl startread k$R-#f;
PiIpnoM
complete: #OD/$f_
S`0(*A[W*
lea bx,msgready K7:)nv
E
mov dx,bx & l&:`nsJ
mov ah,09 %T%sGDCV
int 21 q,|j]+9q
E,U+o $
popa 9}<ile7^
mov ax,3100h 6SkaH<-&K
int 21h +gtbcF@rx
"Og7rl
; vJ[^K
dispdx proc near ,/F~Y&1I
pusha Yujiqi]J;
lea bx, dsp+3 .j0$J
\:i
mov cx,4 ]Ie 0S~
)23H1
repeat0: v MH
mov al,dl [D4SW#
and al,0fh b9HtR -iR;
cmp al,09h <uw9DU7G
jg add40 WlC:l
add al, 30h m8hk:4Ae
jmp okadd om z
add40: ?mxMk6w
add al,37h w``ST
okadd: K`zdc`/
mov byte ptr [bx],al 6Y?|w 3f
dec bx 9IfmW^0
shr dx,4 k"zv~`i'
loopnz repeat0 0gr/<v
lea bx,dsp q ^N7I@Y
mov dx,bx
YkKi|k
mov ah,09h >W+%8e
int 21h { @{']Y
c9 _rmz8
popa Ma
Qqs=
ret mnX2a
dispdx endp P* BmHz4KL
}@q`%uzi
dispqword proc near %RRNJf}z
pusha #a,PZDaE
mov cx ,4 37.S\gO]
add bx,6 051E6-
repeatdecbx: 9-a0 :bP
mov dx,[bx] f+)L#>Gl?
call dispdx _9Te!gJ4_#
sub bx,2 L48_96
loopnz repeatdecbx 04P}-L,
popa xr Jg\to{i
ret e\zm7_+i{
dispqword endp !``,gExH
CxW>~O:
rwsect proc near {Gk1vcq
j-}O0~Jz
lea bx,msg {]@= ijjf
mov dx,bx 7#Kn8s
mov ah,09h e 2oa($9
int 21h [<yaXQxl
KBc1{adDx@
lea bx,BlockNumL fxHH;hRfv
call dispqword >jLY"
`e&Suyf4B
lea di, packetsize $Sip$\+*
mov dl,80h @:vwb\azVD
mov ah,42h Z0", !6nS
int 13h i3mcx)d@H
jnc readok ]Q3ADh
,<P
vovg_
mov cx,5 ~P**O~
;出错后重试(定位0道后再重读) %XQ(fj>
retryrd: :J&oX
<nF^
lea bx, msgReadErr #r\4sVg
mov dx,bx Jk
n>S#SZ
mov ah,09 0pd'93C
int 21h 4!yzsPJL
"JV_ 2K_i
p6Gy,C.
lea di,dap0 j>" @,B g*
mov dl,80h wc4{)qDE
mov ah,44h *P=VFP
int 13h I-(zaqp@
2eY_%Y0
lea bx,BlockNumL v$wIm, j
call dispqword flbd0NB
qqY"*uJ'
lea di, packetsize 0=1T.4+=
mov dl,80h Wt-GjxGi
mov ah,42h nMUw_7Y6
int 13h `d`T*_
jnc readok iz PDd{[
loopnz retryrd 3bH'H*2
d^
8ZeC#
readok: K
Z91-
lea di, packetsize :tg)p+KB
mov dl,80h !z3jTv
mov ah,43h c-6?2\]j@
int 13h ZKTz
,
X5$ Iyis
rwsect endp xY(*.T
9K
)F]]m#`
code ends ;代码段结尾 f46t9dxp
$
end start ;结束汇编 &n:.k}/P
>}i E(