第一个宏汇编程序 U,lO{J[T
)6%a9&~H
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ,hZ?]P&
(+}44Ldt
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! g>g*1oS
4 ]ko
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! UgD)O:xaU
So=
B cX-
比较长啊!所以可以自动跳过。 k\RS L
jhkXU+4
.286 CSH*^nk':O
.radix 16 R5\|pC
data segment ;定义数据段 @k\,XV`T~t
I|Mw*2U
>3}N;
msg db 0dh, "Reading sector:$" 'wWuR@e#&
msg1 db 0dh, "Writing sector:$" .*Z#;3
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" [
~kS)
q3`~uTzk
dsp db " $" `/9I` <y
4wWfaL5"
;DAP a`zHx3Yg
PacketSize db 16d; // 数据包尺寸(16字节) 4ves|pLET
Reserved db 0; // ==0 1B
eh&pl^
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) 39d$B'"<1
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset)
&_-3>8gU
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 a*t>Ks'C
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 iba8G]2
nW`] =
;定位用DAP (复位到0磁道) h+S]C#X,}
DAP0 db 16d ?J-D6;
db 0 `XM0Mm%
dw 1 30
<_`
buff1 dw 0,0 -j@IDd7
dw 0,0,0,0 6!8uZ>u%Vg
]]y4$[|L
\odns
;DiskParameters {Es1bO
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) NN5G
'|i
falgs dw 0; WORD Flags; // 信息标志 1kD1$5
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 v5&W)F
Heads DW 0; DWORD Heads; // 磁盘磁头数 ],{M``]q
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 E,fbIyX
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 Ua4P@#cU
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ce*?crOV
mex@~VK
cmpsect dw 0 7`e<H 8g
P<;Puww/
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" %/BBl$~ji
msgHds db 0dh,0a,"Heads:$" ^gkKk&~A5?
msgspt db 0dh, 0a,"SectorsPerTrack:$" -J0OtrZ
msgTotal db 0d,0a, "Total Sectors:$" Htfq?\ FD
msgSS db 0dh,0a, "Sector Size:$" N4b{^Jk
F
D&pp
<
msgReadErr db 0dh,0a,"Error Reading Sectors:$" yZ]?-7
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" pD
}b $
msgReset db 0dh,0a, "Reseting drive to Cyl 0" "'XYW\bI
m*\LO%s]E
?
A04qk
buffer db 32768d dup(0); *?VB/yO=0
x3F94+<n{
data ends ;数据段结尾 $ab{GxmX'4
QU(Lv(/O
stack segment _#uRKy<`N
db 400 dup(?) z2Z}
mktP
stack ends HBs
6:[q
YN~1.!F
code segment ;定义代码段 B1]FB|0's
assume cs:code ;规定cs的内容 ,1]VY/
assume ds:data ;规定ds的内容 1^ iLs
assume ss:stack )|#ExyRO
",' Zr<T
start: 1~j,A[&|<
pusha ]:m4~0^#-(
Wys$#pJ
1bHQB$%z
mov ax,data ;程序从start开始 Kjpsz] ;
mov ds,ax ;ds置初值,data的段地址 rV2>;FG
x![
G
'I
;设置缓冲区 FC
lea bx, buffer U[:=7UABU?
mov bufferaddr,bx L0w2qF
mov buff1,bx d[*NDMO
mov bx,ds [&l+V e(
mov bufferaddr+2,bx L">m2/ HG
mov buff1,bx "ZA`Lp;%w
@Y<fj^]k
lea di,infosize j,Qb'|f5
mov dl,80h ~f( #S*Ic
mov ah,48h O&}R
int 13h ~M1T
@Mv
T5}5uk9
lea bx,msgcyl KuEM~Q=
mov dx,bx t3C#
$>
mov ah,09 Z_7TD)
int 21h l@]Fzl
mov dx,cylinders 9$}>O]
call dispdx 1lJ^$U
b@sq}8YD|z
lea bx,msghds
;F"Tu
mov dx,bx Do5{t'm3
mov ah,09 AP8J28I
int 21h .y0u"@iF
mov dx,heads 54/ZGaonz
call dispdx ;iJ}[HUo
>h~>7i(A
lea bx,msgspt kBY#=e).
mov dx,bx j&b<YPZ
mov ah,09 *~w?@,}
int 21h _X@ Q`d
mov dx,spt+2 <p +7,aE_
call dispdx ]mjKF\
mov dx,spt L(X}37
call dispdx R/ x-$VJ
e@&2q{Gi=
lea bx,msgtotal 9;rZ )QD
mov dx,bx uaxkGEXr
mov ah,09 2wgcVQ
Awa
int 21h O2fFh_\
lea bx,sectors ,d
FY]
call dispqword \&U"7gSL
aC<fzUD;
lea bx,msgss dj}P|v/;z
mov dx,bx 8ZJ6~~h
mov ah,09 $$*0bRfd4=
int 21h `6LVXDR
mov dx,sectorsize K6@ %@v
call dispdx ldc`Y/:{
jS5K:yx<
sbb word ptr sectors, 63d !!mGsgnW
jnc subok Yp8XZ3
sub word ptr sectors+2,1 E.-2 /'i
jnc subok yVJ)JhV
sub word ptr sectors+4,1 gKgdu($NJ
jnc subok u'gsIuRJ
sub word ptr sectors+6,1 sDu&9+
Q8]S6,pt
subok: |uX&T`7?-
f9hH{(A
''k}3o.K[
AJ6O>Euq
xor ax,ax ;!OME*?m<
mov blocknumL, ax @V+KL>Qw
mov blocknumL+2, ax I*mBU^<9V
mov blocknumL+4, ax 5bsv05=e
mov blocknumL+6, ax ,4}s 1J#
Tb*Q4:r"
startread: +eop4 |Z
IxY!.d_s|~
call rwsect IVeA[qA0
A2I
qn5
adc word ptr blocknuml,63d ! \5)!B
jnc addok 4 XGEw9`3
adc word ptr blocknuml+2,1
ZS@R ?
jnc addok `8TL*.9
adc word ptr blocknuml+4,1 fSGaUBiq}
jnc addok JD AX^]
adc word ptr blocknuml+6,1 z5sKV7&\[n
jnc addok }VVtv1
f917F.1I
addok: 2d<`dQY{l3
mov ax, word ptr sectors+6 nE:Wl
cmp ax, blocknuml+6 e`)zR'As
jg complete |>-0
q~
jl startread 1KJ[&jS ]
mov ax, word ptr sectors+4 %;J$ h^
cmp ax, blocknuml+4 db3.X~Cn#s
jg complete @v.?z2h
jl startread 1 -R4A7+3
mov ax, word ptr sectors+2 W;U<,g
'
cmp ax, blocknuml+2 RhE|0N=
jg complete "IWL& cH3
jl startread ZJ[p7XP
mov ax, word ptr sectors d ;,C[&
cmp ax, blocknuml "c![s%
jg complete U]ZI_[\'U
jl startread (: mF+%(
W=2]!%3#
complete: '[bw7T
`[x'EJp#
lea bx,msgready 5 L-6@@/
mov dx,bx :z$+leNH\
mov ah,09 q\~D:z$+CO
int 21 nQn=zbZ3
Qr?(2t#
popa SV^[)p)
mov ax,3100h 7'@~TM
int 21h x7
xQrjE
0_t9;;y :
; +Lo,*
dispdx proc near 1W9uWkk_d
pusha ^HHT>K-m
lea bx, dsp+3 Yof]
mov cx,4 ^a#W|-:
lO}I>yo}\
repeat0: yzX S{#\
mov al,dl T'N/A9{q
and al,0fh j3>&Su>H4
cmp al,09h |1T[P)Q
jg add40 &@qB6!^
add al, 30h )1O|+m k
jmp okadd !{ORFd
add40: c{jTCkzq
add al,37h 9v7}[`^
okadd: w"
A{R
mov byte ptr [bx],al pz.fZV
dec bx 2F ~SH
shr dx,4 Tb]
h<S
loopnz repeat0 AO8%!+"_
lea bx,dsp %B| Ca&
mov dx,bx <V#]3$(S
mov ah,09h 1NK,:m
int 21h NF7+Gp6?q
]_4HtcL4
popa 4c.!^EiV
ret R5<:3tk=X
dispdx endp
"
b`3
U{HBmSR
dispqword proc near vnX~OVz2
pusha ;|oem\dKv
mov cx ,4 mrlhj8W?!
add bx,6 Nm3CeU
repeatdecbx: xJFxrG'c
mov dx,[bx]
0rc'SEl
call dispdx 'tVe#oI
sub bx,2 ]YB,K)WQ
loopnz repeatdecbx
_~!c%_
popa *C^T
CyBK;
ret :}o{<U
dispqword endp hr
g'Z5n
sT91>'&
rwsect proc near (T",6 xBSG
<In+V
lea bx,msg t\\<+^[%
mov dx,bx 0EC/l
OS
mov ah,09h D5!I{hp"
int 21h ^K^rl9
q]y{
4"=5
lea bx,BlockNumL Jz-RMX=
call dispqword >a: 6umY
MhN8'y(
lea di, packetsize c2yZvi
mov dl,80h Q?dzro4C
mov ah,42h jf&
oN]sZ
int 13h -V||1@
|
jnc readok P_M!h~
~vfPsaRh
mov cx,5 ) =|8%IrB
;出错后重试(定位0道后再重读)
_,*QJ
retryrd: ket"fXqJX
lea bx, msgReadErr N2C f(
mov dx,bx 2*zMLI0.
mov ah,09 a!;K+wL
>
int 21h ul\FZT 4
}]j#
C
AHLXmQl
lea di,dap0 *,wW
-8
mov dl,80h \Pd>$Q
mov ah,44h
L$ [1+*
int 13h =AeOkie
Wk]E6yz6
lea bx,BlockNumL
Vv>hr+e
call dispqword fc%C!^7
A&Cs
(e
lea di, packetsize t>"|~T$9
mov dl,80h RP6hw|
mov ah,42h i6E~]&~.v
int 13h qnw8#!%I
jnc readok
bWMb@zm
loopnz retryrd [Y6ZcO/-i
Qs_]U
readok: EL9JM}%0v
lea di, packetsize IZZ
$p{
mov dl,80h "T6s;'k
mov ah,43h ES
[]A&tf
int 13h
7nbaR~ZV
a,[NcdG
rwsect endp eak+8URo
lq)[
code ends ;代码段结尾 n5?7iU&JIo
end start ;结束汇编 l D]?9K29
7i9wfc h$U