第一个宏汇编程序 )jwovS?V
6_8y Q
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ;=%cA#}_0
eJ[+3Wh
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧!
{a>JQW5=
kyJKai
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! }|-8-;
?3LV$S)U
比较长啊!所以可以自动跳过。 ZQR)k:k7
*XDe:A
.286 U3aM^
.radix 16 V[^AV"V
data segment ;定义数据段 %26HB
w=JF
/Re67cMQ*
k,OxGG
msg db 0dh, "Reading sector:$" Z@m5hx&
msg1 db 0dh, "Writing sector:$" zB7^L^Y
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" U1yspHiZ
l YdATM(h
dsp db " $" "a _S7K
i5WO)9Us
;DAP Ozulp(8*
PacketSize db 16d; // 数据包尺寸(16字节) taVK&ohWx
Reserved db 0; // ==0 a{;+_J3S
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) Z[RifqaBby
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) vGH]7jht
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 @VND}{j
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 4ke.p<dG
MjBI1|*
;定位用DAP (复位到0磁道) mWoN\Rwj
DAP0 db 16d <vs*aFq
db 0 BVv-1$ U^
dw 1 iN Lt4F[i
buff1 dw 0,0 ^eV K.
dw 0,0,0,0 Pr1OQbg]8
Rc@lGq9
p&xj7qwp@F
;DiskParameters \ z*<^ONq
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) %"E!E1_Sv
falgs dw 0; WORD Flags; // 信息标志 o{2B^@+Vb
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 vPZ0?r_5W
Heads DW 0; DWORD Heads; // 磁盘磁头数 ,rY}IwMw
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 z{NK(oW
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 >_\]c-~<
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) fP;I{AiN~
D!)h92CIDm
cmpsect dw 0 Q^Vch(`&P
gpb
dK?
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" : @gW3'
msgHds db 0dh,0a,"Heads:$" (Q&jp!WU
msgspt db 0dh, 0a,"SectorsPerTrack:$" bLggh]Fh
msgTotal db 0d,0a, "Total Sectors:$" !t)uRJ
msgSS db 0dh,0a, "Sector Size:$" ev7A;;
h^."wv
msgReadErr db 0dh,0a,"Error Reading Sectors:$" g p9;I*!
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 5M>SrZH
msgReset db 0dh,0a, "Reseting drive to Cyl 0" 'L1yFv
q` |E9
-G1R><8[
buffer db 32768d dup(0); {poTA+i
EcR[b@YI
data ends ;数据段结尾 m*e8j[w#
uW(
Ngcpr
stack segment k
9y/.Mu
db 400 dup(?) Vn^8nS
stack ends w(Mi?
0!c/4^
code segment ;定义代码段 .(Z^[C}
assume cs:code ;规定cs的内容 E_z,%aD[
assume ds:data ;规定ds的内容 tsB}'+!v#
assume ss:stack ldKLTO*&
4/x.qoj
start: 21?>rezJ
pusha Py9:(fdS
=xH>,-8}
aO:A pOAO
mov ax,data ;程序从start开始 Y}\3PaUa
mov ds,ax ;ds置初值,data的段地址 #)T'a
:W'.SRD
;设置缓冲区 93.L887
lea bx, buffer s,laJf
mov bufferaddr,bx -S@ ys
mov buff1,bx !cO<N~0*5x
mov bx,ds FGo)]U
mov bufferaddr+2,bx 1
!.PH
mov buff1,bx g1UQ6Oa
wC<FF2T
lea di,infosize EL
*l5!Iu
mov dl,80h Nw1 .x
mov ah,48h *z'Rl'j9[
int 13h z.t,qi$;{U
naY#`xig
lea bx,msgcyl Z 2uU'T
mov dx,bx Ac>GF
mov ah,09 2Y}A9Veb
int 21h Yk7^?W
mov dx,cylinders #KL W&A
call dispdx `1
Tg8
JS >"j d#
lea bx,msghds )qWO}]F
mov dx,bx M7gqoJM'Q
mov ah,09 4tt=u]:
int 21h (/P-9<"U
mov dx,heads {X\FS
call dispdx 1x0)mt3
:bP <H
lea bx,msgspt O4W2X@
mov dx,bx '
b,zE[Q
mov ah,09 H[/^&1P
int 21h X=k|Sa
yE8
mov dx,spt+2 9\r5&#<(I
call dispdx DY87NS*HF
mov dx,spt /5XdZu6k`h
call dispdx
-,"eN}P^
NA$ODK-
lea bx,msgtotal rsK
b9G
mov dx,bx i,y{*xBT
mov ah,09
rqM_#[Y?
int 21h w 3L+7V,!
lea bx,sectors pAtxEaXh
call dispqword
%8"
Aq
p!(]`N
lea bx,msgss I
\82_t8
mov dx,bx ehX4[j6
mov ah,09 cc3+Wx_
int 21h ?l
0WuU
mov dx,sectorsize {*Qx^e`h$.
call dispdx K+U0YMRmz
oFu( J
sbb word ptr sectors, 63d ub{Yg5{3S\
jnc subok *^%ohCUi
sub word ptr sectors+2,1 fqm6Pd{:(
jnc subok 7YU}-gi
sub word ptr sectors+4,1 ]"vpCL
jnc subok 1i|5ii*vc
sub word ptr sectors+6,1 d:n.Vp
][T>052v
subok: Ed"p|5~
)]JQlm:H
.18MMzdN
4=;`\-7!
xor ax,ax tH4+S?PI
mov blocknumL, ax Or()AzwE@
mov blocknumL+2, ax {<Vw55)#0Q
mov blocknumL+4, ax IkLcL8P^
mov blocknumL+6, ax 8rjiW#
Z@#kivcpz
startread: ,HW[l.v
sTYA
call rwsect 4p(\2?B%f
z`y^o*qc]
adc word ptr blocknuml,63d >uz3 O?z P
jnc addok 14Jkr)N
adc word ptr blocknuml+2,1 /3 ;t
&]
jnc addok &m@DK>
adc word ptr blocknuml+4,1 `HM?Fc58
jnc addok @(e/Y/
adc word ptr blocknuml+6,1 $,7Yo
nc
jnc addok safI`bw1
4
{=^J2z
addok: <~.1>CI9D3
mov ax, word ptr sectors+6 k Rp$[^ma
cmp ax, blocknuml+6 }$'T=ay&
jg complete 6.QzT(
jl startread @w
[HXb
mov ax, word ptr sectors+4 xR5zm%\
cmp ax, blocknuml+4 sMWNzt
jg complete y)+lU
jl startread -IG@v0_w
mov ax, word ptr sectors+2 H*EN199
cmp ax, blocknuml+2 NB)22 %
jg complete 8<X;
8R
jl startread ]AB4w+6!
mov ax, word ptr sectors ,S=ur%
cmp ax, blocknuml &B ^LaRg
jg complete s `
+cQ
jl startread Q2xzux~T
E$E#c8I:
complete: ~
fF;GtP
'di(5
lea bx,msgready /.[78:G\,
mov dx,bx hW-?j&yJ?
mov ah,09 e:RgCDWL
int 21 j |ZhGerp
A>J,Bi
popa N/N~>7f
mov ax,3100h um1xSf1Xv
int 21h zM|Y
X<
rTtxmw0
; i~EFRI@
dispdx proc near rW0-XLbL5H
pusha Gmh6|Dsg
lea bx, dsp+3 :0j_I\L
mov cx,4 `KmM*_a
7,Q>>%/0P
repeat0:
m3 W
mov al,dl r/mKuGa]
and al,0fh :PDyc(s{
cmp al,09h 6^"Spf]
jg add40 /gq
VXDY+`
add al, 30h XlU`jv+
jmp okadd J0x)NnWJ
add40: Meo.
V|1
add al,37h p u6@X7W"
okadd: 3 etW4
mov byte ptr [bx],al GC^>oF
dec bx o0F&
,|'
shr dx,4 5TS&NefM
loopnz repeat0 aO$I|!tl
lea bx,dsp '@,M
'H{
mov dx,bx y^hCO:`l3
mov ah,09h aqN6.t
int 21h jZ> x5 W
Bh<6J&<n
popa v_e3ZA:%
ret % (x9~"
dispdx endp }w/6"MJ[n
F>s5<pKAX
dispqword proc near zqa7!ky
pusha jq12,R2+)
mov cx ,4 qO}Q4a+
add bx,6 C{U"Nsu+1
repeatdecbx: :c`Gh< u
mov dx,[bx] FkY <I]F
call dispdx zP|^) h5
sub bx,2 S;I}:F#5
loopnz repeatdecbx 58o'Q
popa ZA6)@Mn
ret ])NQzgS
dispqword endp *t,1(Gw|7q
xv>]e <":
rwsect proc near 4
oZm0
n]fMl:77
lea bx,msg >K-S&Y
mov dx,bx Ipyr+7/zJ
mov ah,09h w>h\643
int 21h p5\B0G<m
gX!-s*{E
lea bx,BlockNumL M)j.Uu
call dispqword wOs t).
.h[yw$z6
lea di, packetsize YGf<!
mov dl,80h .FpeVjR''
mov ah,42h bOS; 1~~
int 13h 8a3h)R
jnc readok T43Jgk,
J>p6')Y6~
mov cx,5 Av_JcH
;出错后重试(定位0道后再重读) nb}rfd.
retryrd: B
42t
lea bx, msgReadErr fKOC-%w
mov dx,bx {>n\B~*,"C
mov ah,09 }GL@?kAGR5
int 21h GX;~K
|58xR.S'g
h3t);}Y}D9
lea di,dap0 6#(==}Sm+
mov dl,80h /mCE=
mov ah,44h R-J^%4U`7
int 13h 'CA{>\F$F+
2c1L[]h'
lea bx,BlockNumL |!E: [UH
call dispqword &Na,D7A:3I
_mc-CZ
lea di, packetsize $bsD'Io
mov dl,80h 2nkymEPu
mov ah,42h 0*yD
int 13h I> BGp4 AQ
jnc readok 85Red~-M
loopnz retryrd EE$\8Gx']!
/l1OC(hm
readok:
`A ^
lea di, packetsize kqQT^6S
mov dl,80h xTg=oq
mov ah,43h hU6oWm
int 13h )J{.z
_kXq0~
rwsect endp dpSNh1
'|^x[8^
code ends ;代码段结尾 &$g{i:)Z
end start ;结束汇编 zy(NJ
W!t =9i