第一个宏汇编程序 %$i
}[U
TQ5kM
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ./L)BLC i
l@ (:Q!Sk
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! MH9vg5QKp
+w"?q'SnF
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! q'TIN{\.{
kg\8 (@h]
比较长啊!所以可以自动跳过。 V Ew
| N)
_ElG&hyp
.286 %%z
lqd"0
.radix 16 0m"Ni:KEf
data segment ;定义数据段 b};o:
QHc([%oV
gga}mqMv=
msg db 0dh, "Reading sector:$" yxU9W,D v
msg1 db 0dh, "Writing sector:$" (.VS&Kv#U
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" j#Tl\S!m.I
a6 1!j>Kx
dsp db " $" JbQY{z!
-Mz [S
;DAP DUh\x>^
PacketSize db 16d; // 数据包尺寸(16字节) 1ANb=X|hig
Reserved db 0; // ==0 P{yb%@I~J
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ivyaGAF}+o
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) QodWUbi'&
BlockNumL Dw 0,0; // 磁盘起始绝对块地址
'2ZvK
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 j4+Px
%sW
]vP}K
;定位用DAP (复位到0磁道) #qpP37G
DAP0 db 16d 6U.|0mG[
db 0
v+8Ybq
dw 1 h9#)Eo
buff1 dw 0,0 UGj |)/
dw 0,0,0,0 n.z,-H17
$mh\
`
_(I6o
;DiskParameters 7D4tuXUq2
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) v^vi *c
falgs dw 0; WORD Flags; // 信息标志 @BF1X.4-+
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 j<k6z
Heads DW 0; DWORD Heads; // 磁盘磁头数 |"I)1[7
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 py+\e"s
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 S(?A3 H
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) o]<9wc:FZ
/
*PHX@
cmpsect dw 0 ZfK[o{9>
9 <{C9
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 32j}ep.*
msgHds db 0dh,0a,"Heads:$" j@D,2B;
msgspt db 0dh, 0a,"SectorsPerTrack:$" S#$Kmm
|
msgTotal db 0d,0a, "Total Sectors:$"
E)ZL+(
msgSS db 0dh,0a, "Sector Size:$" :O$bsw:3w<
9dBxCdpu
msgReadErr db 0dh,0a,"Error Reading Sectors:$" H-U_
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" p:z~>ca
msgReset db 0dh,0a, "Reseting drive to Cyl 0" w,$qsmR
XmwAYf
Y#tur`
N
buffer db 32768d dup(0); k)|.<
D79:L:
data ends ;数据段结尾 TEMxjowr
L+(ng
stack segment G\TO]c
db 400 dup(?) >%0$AW|Exu
stack ends |ns?c0rM
I[d<SHo
code segment ;定义代码段 !!H"B('m
assume cs:code ;规定cs的内容 %W)pZN}
assume ds:data ;规定ds的内容 ]bY]YNt{7]
assume ss:stack ovBmo2W/
H;l_;c`
start: W)/^*,
Q7
pusha kS:#|yY8%
9 fYNSr
d]"4aS
mov ax,data ;程序从start开始 4=MjyH|[Jx
mov ds,ax ;ds置初值,data的段地址 'A3skznX{
fe,6YXUf
;设置缓冲区 _]pu"hZz4
lea bx, buffer j7k}!j_O{
mov bufferaddr,bx i i-AE L
mov buff1,bx y& 1@d+Lf
mov bx,ds nS*Y+Q^9a
mov bufferaddr+2,bx #mA(x@:*
mov buff1,bx 46Sz#^y
P
XW" 0:}`J
lea di,infosize [!-gb+L
mov dl,80h V?1 $H
mov ah,48h 1/2cb-V
int 13h Z>Mv$F"p:
2R.LLE
lea bx,msgcyl 5UO+c(T
mov dx,bx e)g&q'O
mov ah,09 VL$
T
int 21h
NX.xEW@
mov dx,cylinders %&|
uT
call dispdx %kjG[C
bAGKi.
lea bx,msghds Cul=,;pkB
mov dx,bx MA6
Vy
mov ah,09 .
yg#
int 21h f$ xp74hw3
mov dx,heads W%
-XN
call dispdx Xa?O)Bq.
4]ni-u0*
lea bx,msgspt 5;U Iz@BJ
mov dx,bx "8{A4N1B5
mov ah,09 q1( [mHZ
int 21h O9(z"c
mov dx,spt+2 EZ]4cd/i
call dispdx )J}v.8
mov dx,spt e12QYoh
call dispdx k[;)/LfhS
O'mcN*
lea bx,msgtotal MmR6V#@:
mov dx,bx ]myRYb5Z
mov ah,09 oDz|%N2s|
int 21h .Dr!\.hL
lea bx,sectors 8
Auek#[
call dispqword R=lw}jH [Z
{YzCgf
lea bx,msgss yJq< &g
mov dx,bx
'#V@a
mov ah,09 [eDrjf3m
int 21h @wI>0B
mov dx,sectorsize 7RL J
call dispdx /[.V( K
D
JfIXv
sbb word ptr sectors, 63d )ffaOS!\
jnc subok :~vodh
sub word ptr sectors+2,1 _9
]:0bDUo
jnc subok 7GYf#} N
sub word ptr sectors+4,1 o
g5VB
jnc subok ehr-o7](
sub word ptr sectors+6,1 {E
:`
2Lf,~EV
subok: EIg~^xK
:_~.Nt
3k`Q]O=OU
|Ev|A9J!
xor ax,ax z
Vq!M-e
mov blocknumL, ax f
+{=##'0
mov blocknumL+2, ax '|[V}K5m/f
mov blocknumL+4, ax 2@<_,'
mov blocknumL+6, ax J**(7d
=cS&>MT
startread: l<f9$l^U
-A
dDPWn
call rwsect Z~~6y6p
}kqh
[`:
adc word ptr blocknuml,63d Zj2 si
jnc addok o$sD9xx
adc word ptr blocknuml+2,1 *9^8NY]
jnc addok [-])$~WfW
adc word ptr blocknuml+4,1 si]VM_w6
jnc addok 6]?mjG6
adc word ptr blocknuml+6,1 z'EQdQ)
jnc addok ]?tRO
P1Hab2%+
addok: 6 dRhK+|
mov ax, word ptr sectors+6 Q&eyqk
cmp ax, blocknuml+6 sFTAE1|
jg complete g<W]NYm
jl startread E EDF
yZ
mov ax, word ptr sectors+4
,Vhve'=*2
cmp ax, blocknuml+4 rPaJ<>Kz
jg complete $3^M-w
jl startread ?e$&=FC0;
mov ax, word ptr sectors+2 <+oh\y16
cmp ax, blocknuml+2 Lt't
jg complete L0fe
jl startread )!2@v@SQ
mov ax, word ptr sectors GfE>?mG
cmp ax, blocknuml CUu
Owx6%
jg complete -e/}DGL
jl startread wUv?;Y$C
""0Y^M2I
complete: q!y. cyL
aDF@AS
lea bx,msgready @:C)^f"
mov dx,bx }qn>#ETi
mov ah,09 e= IdqkJ%
int 21 $[>{s9E
,a?)O6?/
popa gyw=1q+
mov ax,3100h WigtTAh4
int 21h ]y_:+SHc
@7twe;07r
; !p
&<.H_
dispdx proc near ~~W.]>f
pusha bY" zK',m
lea bx, dsp+3 xsZG(Tz
mov cx,4 d4S4
e
e*7O!Z=
O
repeat0: .<%tu 0
mov al,dl ,|A^ <R`
and al,0fh >1j#X
A8
cmp al,09h D$hQ-K
jg add40 o08WC'bX
add al, 30h tO M$'0u
jmp okadd jIubJQR~
add40: <=M5)#
add al,37h atTR6%!6
okadd: 8;@y\0
mov byte ptr [bx],al E(~7NRRm
dec bx =!'9TS
shr dx,4 *7xcwjeP
loopnz repeat0 3ZXAAV
lea bx,dsp z9aR/:W}
mov dx,bx l=CAr
mov ah,09h pU7;!u:c4%
int 21h 4YfM.~
6
sgfqIe1
popa \sNgs#{7E7
ret J4T"O<i$58
dispdx endp &=g3J4$z
Hd~g\
dispqword proc near cRLw)"|
pusha 0=$/
mov cx ,4 Y)sB]!hx
add bx,6 Lh[0B.g<
repeatdecbx: tvI<Why\p
mov dx,[bx] ,1sbY!&ekL
call dispdx YEu+kBlcQ
sub bx,2 os/h~,=
loopnz repeatdecbx f
sL9d}
popa #
e?B
ret f24W*#IX
dispqword endp 9\Jc7[b
x%viCkq
rwsect proc near Cn~VJ,l
g
LYDiqOrx
lea bx,msg Bb/if:XS
mov dx,bx c
MY}Y
[2c
mov ah,09h <?.eU<+O`S
int 21h 1Wpu
vB7Gx>BQd
lea bx,BlockNumL \zBi-GI
7
call dispqword <P h50s4
&-=~8
lea di, packetsize dn
6]qW5
mov dl,80h 7{m>W!
mov ah,42h ^*ZaqMA
int 13h xX<f4H\'
jnc readok <:9ts@B
5P!ZGbG
mov cx,5
W.j^
L;
;出错后重试(定位0道后再重读) w-K A~
retryrd: *K/K97
lea bx, msgReadErr #[prG
mov dx,bx <=.6Z*x+
mov ah,09 dA)T>
int 21h qO>UN[Y
\?n6l7*t>
wn[)/*(,$(
lea di,dap0 [MIgQ.n
mov dl,80h *Jsb~wta
mov ah,44h 2IB{FO/
int 13h 05wkUo:9
<x}wy+SG
lea bx,BlockNumL a=MN:s?Fc0
call dispqword ; J W]b]
Q!l(2nva
lea di, packetsize ]o] VS
mov dl,80h 2.v{W-D[
mov ah,42h /8l-@P.o
int 13h &|Gg46P7
jnc readok jEBn"]\D
loopnz retryrd UR'[?
r2RJb6
readok: q;eb
lea di, packetsize M/o?D <'
mov dl,80h ?|5
M'o|9
mov ah,43h 7KI
ekL
int 13h y0xBNhev
~0PzRS^o
rwsect endp |S8$NI2
wkp2A18n
code ends ;代码段结尾 eo]nkyYDP
end start ;结束汇编 FyEKqYl
YiZk|K_