第一个宏汇编程序 "
;o,D
KfSbm?
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 Ko!a`I2M}
,!^g8zO
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 2h)*
>J,IxRGi
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! {M23a
_t\
j'XND`3
比较长啊!所以可以自动跳过。 A&d_!u>
:4>LtfA
.286 uZP(-}
.radix 16 CHdYY7\{
data segment ;定义数据段 ?i\$U'2*z3
/GA-1cS_(
-5\.\L3y)
msg db 0dh, "Reading sector:$" :2lM7|@/
msg1 db 0dh, "Writing sector:$" !MOcF5M
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Qv
zE:]pyi
dC
Wq~[[
dsp db " $" ZC &~InN
&!*p>
Ns)e
;DAP _AiGD
PacketSize db 16d; // 数据包尺寸(16字节) .4!wp&
Reserved db 0; // ==0 [C3wjYi
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) xw*/8.Md6f
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) tbB.
n
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 OYOczb]
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 C?rb}(m
>qdRqy)DC
;定位用DAP (复位到0磁道) (#Xgfb"S3
DAP0 db 16d ZV!*ZpTe~
db 0 yg
%T{hyzH
dw 1 6f
J5Y
iQ
buff1 dw 0,0 #b1/2=PA
dw 0,0,0,0 CelM~W$=u
$cGV)[KWp@
@ 3b-
;DiskParameters `J}FSUn\
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) _z3^.QP
falgs dw 0; WORD Flags; // 信息标志 Ct0%3]<J
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数
j[w5#]&%
Heads DW 0; DWORD Heads; // 磁盘磁头数 ?`B6I!S0[
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 UFE~6"t(
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 I^QB`%v5
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) 602=qb
ab5i7@Ed
cmpsect dw 0 =/N0^
p S!N<;OWr
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" VKr
oikz@]
msgHds db 0dh,0a,"Heads:$" ,27=i>>
msgspt db 0dh, 0a,"SectorsPerTrack:$" ,`( Qs7)Xx
msgTotal db 0d,0a, "Total Sectors:$" 7D4I>N'T
msgSS db 0dh,0a, "Sector Size:$" /j:-GJb*!u
r+nhm"9
msgReadErr db 0dh,0a,"Error Reading Sectors:$" PR>%@-Vgj
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" ]Wc 2$
msgReset db 0dh,0a, "Reseting drive to Cyl 0" a]x\e{
P1ynCe
HmpV;
<t3
buffer db 32768d dup(0); FFc?Av?_
"'c
=(P
data ends ;数据段结尾 *%dWNvN4X
$t>ow~Xi
stack segment *L5L.: Ze
db 400 dup(?) n(\VP!u5r
stack ends a@-!,Hi
M,eq-MEK
code segment ;定义代码段 "oCXG`.k&
assume cs:code ;规定cs的内容 P'k`H
assume ds:data ;规定ds的内容 =l$qwcfbo
assume ss:stack p{JE@TM
.:;#[Z{-
start: o &E2ds3
pusha p|=0EWo4U
Rx4O?7;
M5B?`mTl
mov ax,data ;程序从start开始 ,)}-mu
mov ds,ax ;ds置初值,data的段地址 iu'r c/=V
%[m%QP1;p
;设置缓冲区 MLn?t^v-
lea bx, buffer BeM|1pe.
mov bufferaddr,bx ld'Aaxl&
mov buff1,bx ":
^cb =
mov bx,ds H.TPKdVX
mov bufferaddr+2,bx jhE3@c@pT
mov buff1,bx LYS[qLpf
GnW_^$Fs
lea di,infosize 1L.yh U\
mov dl,80h Y.o-e)zX
mov ah,48h V7>{,
int 13h f>+:UGmP
SG3qNM: g
lea bx,msgcyl ;<v9i#K5
mov dx,bx J]Qbg7|
mov ah,09 K/LoHWy+n*
int 21h N Z~"2~Hh
mov dx,cylinders wEIAU
call dispdx @xAfD{}f!
v&u8Ks
lea bx,msghds _+nlm5
mov dx,bx SZC1$..2T
mov ah,09 { FM:\/
int 21h $@L}/MO
mov dx,heads j=w`%nh4"f
call dispdx qCYXkZ%`
j*1O(p+
lea bx,msgspt QLyBP!X-
mov dx,bx a EqDxr6
mov ah,09 2aGK}sS6
int 21h $g)X,iQu
mov dx,spt+2 n]%yf9,w
call dispdx >l!DWi6
mov dx,spt a.g:yWL\
call dispdx L3X[; |v}
,m.IhnCV\
lea bx,msgtotal }MV=t7x9+
mov dx,bx f<( ysl1[
mov ah,09 :WdiH)Zv
int 21h n5 jzVv
lea bx,sectors J+8T Ie
call dispqword MXuiQ;./
z,=k F I
lea bx,msgss 5I@2U vV8
mov dx,bx iLG~_Ob:
mov ah,09 RLbxNn
int 21h qn@:A2ed
mov dx,sectorsize nYO4J
lNP
call dispdx (B;rjpK
2aO.t
sbb word ptr sectors, 63d }Z\PE0
jnc subok J9/}ZD^
sub word ptr sectors+2,1 V s1Z$HS`
jnc subok Qu@T}Ci
sub word ptr sectors+4,1 G |vG5$Nf
jnc subok NpY zN|W:
sub word ptr sectors+6,1
]+i~Cbj
0~j0x#
subok:
hlTM<E
ZfN%JJOz(
FG5t\!dt<
c*x5t"{
xor ax,ax EXYr_$gRs
mov blocknumL, ax k-\RdX)E
mov blocknumL+2, ax p'IF2e&z
mov blocknumL+4, ax g"L$}#iTsl
mov blocknumL+6, ax mw&)j R$&
-AxO1
qO
startread: v/WvT!6V`
OO+QH 2j
call rwsect ].<B:]:,
~!W{C_*N
adc word ptr blocknuml,63d G2}e@L0
jnc addok fP:g}Z
adc word ptr blocknuml+2,1 2:l8
RH!Y
jnc addok 6'qC *r
adc word ptr blocknuml+4,1 xA2"i2k9
jnc addok [ !#<nY/C
adc word ptr blocknuml+6,1 >~k"C,6
jnc addok ;-X5#
Q#rj>+?
addok: V3$Yr"rZ;
mov ax, word ptr sectors+6 ln6Hr^@5
cmp ax, blocknuml+6 Q{+&3KXH
jg complete cp>1b8l6?
jl startread weky
5(:
mov ax, word ptr sectors+4 Ox1#}7`0>
cmp ax, blocknuml+4 o Kfm=TbY
jg complete 2hI|]p
jl startread `V[{,!l;X
mov ax, word ptr sectors+2 Qtpw0t"
cmp ax, blocknuml+2 8z
h{?0
jg complete _}-Ed,.=
jl startread Th)Z?\8zk
mov ax, word ptr sectors $Y5m"wySZ
cmp ax, blocknuml \4OX]{
jg complete &*N;yW""f
jl startread /^<Uy3F[p
ix]t>2r
complete: [<M~6]
S(
r Fa
lea bx,msgready wR= WS',
mov dx,bx ^p433
mov ah,09 mxJ& IV
int 21 8%wu:;*]%
3ud_d>
popa 4R/cN'-
mov ax,3100h lUd;u*A
int 21h h+7THMI
fSF
b)+
; jRP9
e
dispdx proc near Vyqj)1Z8>
pusha [~<X|_LG
lea bx, dsp+3 Xn
1V1sr
mov cx,4 &{c.JDO
:v!e8kM\x
repeat0: iFy_D
mov al,dl /!mF,oR!
and al,0fh G&HCOR!h
cmp al,09h VgO:`bDF
jg add40 >3a<#s{%
add al, 30h TZk.?@s5
jmp okadd <,!e*V*U
add40: ]l
WEdf+
add al,37h Bqd'2HQd
okadd: D-tm'APq
mov byte ptr [bx],al af<R.
dec bx s8/y|HN^
shr dx,4 Xo:!U=m/#
loopnz repeat0 9zKrFqhNo
lea bx,dsp ;L458fYs
mov dx,bx [Q2"OG@Q
mov ah,09h Gd8FXk,.!
int 21h 6RLYpQ$+
bK|I
popa * Jy'3o
ret ZCAdCKX|
dispdx endp VNcxST15a
|
aovZ/b4
dispqword proc near YxUC.2V|7$
pusha AD=vYDR+
mov cx ,4 W5^m[,GU'
add bx,6 _Fz]QxO
repeatdecbx: <!s+X_^
mov dx,[bx] MM*B.y~TxZ
call dispdx +
q/ j
sub bx,2 8(Ab
NQ
loopnz repeatdecbx As;@T
$G
popa ShV#XnQ
ret D 1Q@4
g
dispqword endp U2
u\Q1
\qAg]-
rwsect proc near #Jo#[-r
Is $I;`
lea bx,msg 3S~Gi,
mov dx,bx 8i=c|k,GL.
mov ah,09h #ONad0T;
int 21h Y
nzhvE
<n)J~B^
lea bx,BlockNumL Oist>A$Z
call dispqword j[Y$)HF
5mxYzu;#]
lea di, packetsize -<[MM2
Y
mov dl,80h 1@)kNg)*$
mov ah,42h `EUufTYi
int 13h mu[:b
jnc readok 6{ql.2
Fa
oWu2}#~z_
mov cx,5 qBKRm0<W
;出错后重试(定位0道后再重读) 1yS[;
retryrd: x9s7:F
lea bx, msgReadErr 0#AS>K5
mov dx,bx ]b"Oy}ARW
mov ah,09 ur,!-t(~t
int 21h /7
CF f&4
vjcG
F'-
V kA$T8
lea di,dap0 O"$uw
mov dl,80h 2L<iIBSJwm
mov ah,44h LK}Ih@f
int 13h Sd!!1as
H<|ilL'fX
lea bx,BlockNumL ?~vVSY
call dispqword 3$u3ssOL
GxL;@%B
lea di, packetsize ^}+qd1r
mov dl,80h E*!
mov ah,42h *oC],4y~D
int 13h zF9SZ#{a
jnc readok QU]&q`GE
loopnz retryrd f.%mp$~T
L"|~,SVF
readok: 6fozc2h@x%
lea di, packetsize %MQU&H9[
mov dl,80h K/,y"DUN&
mov ah,43h ;wi}6rF%[i
int 13h gkJL=,
G^`IfF-j
rwsect endp ZH:-.2*cj
h~]G6>D9)>
code ends ;代码段结尾 Li jisE
end start ;结束汇编 *v}8n95*2
]ZD W+<