第一个宏汇编程序 KL]@y!QU
fDo )~t*~
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 2lw0'
$0rSb0[
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! \&6
,]e!OZ[$m
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! XjpFJ#T*$A
|1`|E-S=
比较长啊!所以可以自动跳过。 M~Tq'>Fn
oWGtKtDhH
.286 8E`rs)A
.radix 16 |n-NK&Y(o
data segment ;定义数据段 Cg NfqT0
kb>:M.
S[!-M\b
msg db 0dh, "Reading sector:$" !$ikH,Bh
msg1 db 0dh, "Writing sector:$" 6AgevyVG
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Lc;4 Hg
=8`,,=P^
dsp db " $" hamn9
=VkbymIZ4y
;DAP r5::c= Cl
PacketSize db 16d; // 数据包尺寸(16字节) XYD}OddO
Reserved db 0; // ==0 gf6<`+/
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) $Oa}U3
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) V[>MKB(
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 /YYI
4
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 ;c"T#CH.
(hTe53d<S?
;定位用DAP (复位到0磁道) 7B
GMG|
DAP0 db 16d fk%r?K 6K
db 0 09y%FzV
dw 1 (JS1}T
buff1 dw 0,0 L1#z'<IO
dw 0,0,0,0 WlnmW(uahW
mx s=<
|}paa
;DiskParameters H:x=v4NgsU
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) :AYp{"{
falgs dw 0; WORD Flags; // 信息标志 IDbqhZp(
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 +o)o4l%3
Heads DW 0; DWORD Heads; // 磁盘磁头数 =\7o@ 38
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 l v]TE"
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 >jU.
R;H5
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ]Bw2> 6W
Tvr2K84l
cmpsect dw 0 FJl#NOp&
OgjSyzc
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" R.Xh&@f`
msgHds db 0dh,0a,"Heads:$" (C/2shr 8
msgspt db 0dh, 0a,"SectorsPerTrack:$" N(0G!sTI
msgTotal db 0d,0a, "Total Sectors:$" DYlu`j_ux
msgSS db 0dh,0a, "Sector Size:$" 9J%
~?k
}9[E+8L1
msgReadErr db 0dh,0a,"Error Reading Sectors:$" WXP=U^5Si
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 2<Lnfc<^k
msgReset db 0dh,0a, "Reseting drive to Cyl 0" wowv>!N!X-
F"xD^<i
G"&9u2 k
buffer db 32768d dup(0); ]8*#%^
YUdCrb9F
data ends ;数据段结尾 4[t1"s~Wg
L~fxVdUz
stack segment 1au1DvH
db 400 dup(?) UCzIOxp}
stack ends ^`NU:"
MKS
iOM
code segment ;定义代码段 Y9fktg.
assume cs:code ;规定cs的内容 E[bJ5o**#
assume ds:data ;规定ds的内容 ]c,ttS_
assume ss:stack \nM$qr'`B
L 1=HD
start: [4'C4Zl
pusha CqQ>"Y
\vbU| a
.XR`iXY
mov ax,data ;程序从start开始 !kZ9Ox9^
mov ds,ax ;ds置初值,data的段地址 D}59fWz@
Ndq|Hkd
;设置缓冲区 a[iuE`
lea bx, buffer cA_77#<8
mov bufferaddr,bx uev$5jlX
mov buff1,bx T-pes1Wu
mov bx,ds _gZ8UZ)
mov bufferaddr+2,bx )`?Es8uW
mov buff1,bx dD@k{5
KWIH5* AM
lea di,infosize 47s
<xQy
mov dl,80h 6tXx--Nh
mov ah,48h <oG+=h
int 13h .-t#wXEi
%(h-cuhq
lea bx,msgcyl iK{ a9pt
mov dx,bx i_?";5B"
mov ah,09 -miWXEe@l
int 21h 7(B|NYq
mov dx,cylinders 7)sEW#d!
call dispdx YnC7e2
"HTp1
lea bx,msghds Gqvnc8V&
mov dx,bx Fl\X&6k
mov ah,09 ](yw2c;me
int 21h lquY_lrri
mov dx,heads jO\29
(_
call dispdx i{zg{$ U
FWqnlK#
lea bx,msgspt *x3";%o
mov dx,bx '3B`4W,
mov ah,09 $PA=7`\MP/
int 21h ed$g=qs>
mov dx,spt+2 J+IQvOn_|
call dispdx (h> Jz
mov dx,spt "X~ayn'@w,
call dispdx BU-+L}-48
.R
ocENO0
lea bx,msgtotal ZGrjb22M
mov dx,bx
S\2QZ[u
mov ah,09 %O-RhB4q
int 21h y&T(^EA;
lea bx,sectors sU"D%G
call dispqword 1'tagv?
6@kKr
lea bx,msgss MJ sz
mov dx,bx ],vUW#6$N
mov ah,09 ?eD,\
G
int 21h 9{bG @g
mov dx,sectorsize ^b=] =w
call dispdx K2PV^Y
w8E6)wF=7
sbb word ptr sectors, 63d yNVuSj
jnc subok 6v7H?4
sub word ptr sectors+2,1 @cNBY7=
jnc subok 5&]|p'"W\
sub word ptr sectors+4,1
:Z|lGH
=
jnc subok J9J[.6k8
sub word ptr sectors+6,1 }Th":sin},
| _/D-m*
subok: Zp~2W
JQ
(as'(+B
tpw0j
CVu
VP^Yph 8R
xor ax,ax
5zXw0_
mov blocknumL, ax a86m?)-c
mov blocknumL+2, ax kgfOH.P
mov blocknumL+4, ax t]1j4S"pm
mov blocknumL+6, ax csZIBi
N\XZ=t^h(
startread: MJ^NRT0?b
hM
call rwsect ,|SO'dG
yyZ}qnbx]
adc word ptr blocknuml,63d |/K+tH
jnc addok OU+oS,
adc word ptr blocknuml+2,1 k{>rI2;
jnc addok +tFm DDx=
adc word ptr blocknuml+4,1 kb<
Nuw
jnc addok UBoN}iR
adc word ptr blocknuml+6,1 \5UwZx\
jnc addok 9An_zrJ%i
kGhWr M
addok: WS6pm6@A*!
mov ax, word ptr sectors+6 GFd~..$
cmp ax, blocknuml+6 qGG
jg complete K$_ Rno"
jl startread *xB9~:
mov ax, word ptr sectors+4 0&$+ CWSM
cmp ax, blocknuml+4 MK"PCE5^i6
jg complete JJJlgr]#
jl startread gbNPD*7g9
mov ax, word ptr sectors+2 u,<I%
cmp ax, blocknuml+2 bZ c&uq_
jg complete ct='Z E
jl startread weCRhA
mov ax, word ptr sectors -FA]%Pl<'
cmp ax, blocknuml .-[uQtyWW
jg complete DueQ1+ P
jl startread nnLE dJ}n
q]Gym 7o
complete: x]umh{H~
DE3>F^ j
lea bx,msgready DArEIt6Q
mov dx,bx 3vTX2e.w
mov ah,09 K|$Dnma^n
int 21 K%9PIqK?4
'@'~_BBZP
popa ;EstUs3
mov ax,3100h WtF
int 21h pVe@HJy6G
envu}4wU=e
; )%p.v P'p
dispdx proc near yP2[!vYw
pusha "-JJ6Bk
lea bx, dsp+3 S%n5,vwE
mov cx,4 :_v/a+\n
5P_%Vp`B2
repeat0: 3f9J!B`n
mov al,dl N\b%+vR
and al,0fh xzF@v>2S+
cmp al,09h rq'Cj<=Zj
jg add40 b%>vhj&F
add al, 30h pQr `$:ga
jmp okadd V~-<VM6
add40: \.p{~Hv
add al,37h 5^'PjtW6
okadd: "orZje9AC
mov byte ptr [bx],al V#jFjObTN
dec bx F[/Bp>P7
shr dx,4 `[\*1GpAo
loopnz repeat0 l{wHu(1
lea bx,dsp WHxq
-&=
mov dx,bx v{4K$o
mov ah,09h Qj(q)!Ku
int 21h 9Mo(3M
a.)Gd]}g
popa oj*5m+:>a
ret :@KU_U)\
dispdx endp
K
d}cf0
w6>'n
}
dispqword proc near 1GB$;0 W),
pusha S N_!o2F2
mov cx ,4 Q`ERI5b6
add bx,6 +T:F :X`
repeatdecbx: )qs>Z?7
mov dx,[bx] m#Rgelhk.
call dispdx #I[tsly}
sub bx,2 W j2
]1A
loopnz repeatdecbx q%8%J'Fro
popa p~1
,[]k
ret -E~pCN(E
dispqword endp zt{?Ntb
b*=eMc
d
rwsect proc near F-Mf~+=Dn
dK|6p_
lea bx,msg %.,-dV'
mov dx,bx HrQB
zS
mov ah,09h clK3kBh~&
int 21h ]0P-?O:
l]RO'
lea bx,BlockNumL z VleJ!d
call dispqword N}x\Ll
q:N"mp<%
lea di, packetsize un|+YqLf
mov dl,80h m@o/ W
mov ah,42h >-rDBk
;K
int 13h FNlzpCT~L
jnc readok xvP<
~
N-
v,w/g|
mov cx,5 "e62g
;出错后重试(定位0道后再重读) [ 9)9>-
retryrd: +^$FA4<~
lea bx, msgReadErr SPKGbp&
mov dx,bx E>~DlL%
mov ah,09 w J
FEua
int 21h 4L#q?]$
NN1d?cOn
[?uiM^&
lea di,dap0 J$6tCFD
mov dl,80h -;=0dfC(
mov ah,44h g2L^cP>2
int 13h @dE|UZ=(
\/,54c2
lea bx,BlockNumL (UWP=L1
call dispqword FyY
D7E
v3
4!rL
lea di, packetsize bTB/M=M
mov dl,80h cE[B
(e
mov ah,42h nWpqAb
int 13h @? 4-
jnc readok vum6O3
loopnz retryrd v!(BS,
2= FGZa*.
readok: 2\&uO
lea di, packetsize L?!*HS7m
mov dl,80h B4AV ubMbe
mov ah,43h mmP>Ji
int 13h O o9 ePw7
*FyBkG'
rwsect endp 0/?V _
mKY}+21!Q
code ends ;代码段结尾 hnha1
f
end start ;结束汇编 @czNiWU"4;
>0kn&pe7#T