第一个宏汇编程序 qT
U(]O1
3F/05}d`
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 G|WO
IIn0w2:i
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 86.LkwlqoH
@I`X{oAA
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! f{]eb1
D'dE!CAUs
比较长啊!所以可以自动跳过。 _'g'M=E
G'*_7HD
.286 QEUr+7[
.radix 16 H[K(Tt4<&
data segment ;定义数据段 [8T
z%
ln}
JjH#,@'.
msg db 0dh, "Reading sector:$" 3
M/iuu
msg1 db 0dh, "Writing sector:$" v&.`^O3W
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" -]!m4xvK
b7X-mkF
dsp db " $" IYJS>G%*
J|ni'Hb
;DAP *""JE'wG
PacketSize db 16d; // 数据包尺寸(16字节) 0)c9X[sG
Reserved db 0; // ==0 (6Ss
k4
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) CTqAhL 4}
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) \dIc_6/D1
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 >,ThIwRN
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 Y+ZQN>
]6PX4oK_t
;定位用DAP (复位到0磁道) #1>DV@^F
DAP0 db 16d n9qO;X4&
db 0 UIpW#t
dw 1 vSu|!Xb]
buff1 dw 0,0 :j sa.X
dw 0,0,0,0 ^iWcuh_n
iti~RV,
~S5wfx&
;DiskParameters kPh;SCr{
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) pI__<
falgs dw 0; WORD Flags; // 信息标志 aFZu5-=x
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 CA0SH{PdW&
Heads DW 0; DWORD Heads; // 磁盘磁头数 '/Y
D$*,
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 XET'XJWF%
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 /U|>
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) $}{u6*u.,
pP1|/f5n`
cmpsect dw 0 HkG
A$
7N@4c
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" .I6:iB
msgHds db 0dh,0a,"Heads:$" 35 Y#eU2]
msgspt db 0dh, 0a,"SectorsPerTrack:$" $]&0`F
msgTotal db 0d,0a, "Total Sectors:$" N
k~Xz
msgSS db 0dh,0a, "Sector Size:$" zvvF9
gH{X?
msgReadErr db 0dh,0a,"Error Reading Sectors:$" a!`b`r-4
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" Cfizh@<
msgReset db 0dh,0a, "Reseting drive to Cyl 0" .
Pp;%
RC[b+J,q
\,U#^Vr
buffer db 32768d dup(0); D)yCuw{M:
SAuZWA4g[
data ends ;数据段结尾 P>*g'OK^!G
pHW
Qk z(
stack segment M7$ h
db 400 dup(?) k>W5ts2+
stack ends uVO*@Kj+
|*~=w J_
code segment ;定义代码段 $jLJ&R=?]
assume cs:code ;规定cs的内容 1x\Vz\
assume ds:data ;规定ds的内容 kG =nDy
assume ss:stack =44hI86
.GJl@==~1
start: OokBi 02b
pusha xB&kxW.;
y:FxX8S$'e
a6UW,n"n
mov ax,data ;程序从start开始 L&C<-BA/
mov ds,ax ;ds置初值,data的段地址 fB\+.eN
,I(PDlvtM
;设置缓冲区 /(`B;?
lea bx, buffer 9t`Z_HwdCb
mov bufferaddr,bx 6$]p;}#
mov buff1,bx M?61g(
mov bx,ds 8 *Fr=+KN
mov bufferaddr+2,bx Hh/Z
4`&yi
mov buff1,bx W{0gtT0
-c^/k_n
lea di,infosize ?DN4j!/$
mov dl,80h {nyQ]Nu"
mov ah,48h P)7_RE*gY
int 13h R@h@@lSf
GCw<jHw
lea bx,msgcyl <"SDU_<xG
mov dx,bx "E? 8.`T
mov ah,09 UfE41el:
int 21h IEi E6z]L(
mov dx,cylinders MNy)= d&<P
call dispdx .EOHkhn
oiG@_YtR
lea bx,msghds P'4oI0Bw
mov dx,bx (kECV8)2
mov ah,09 UV ?.KVD~
int 21h o6@Hj+,,
mov dx,heads (-lu#hJ`&r
call dispdx w(lxq:>"
f8>S<:
lea bx,msgspt c0lVt)pr/
mov dx,bx /0w?"2-
mov ah,09 k\:f2%!!
int 21h D$sG1*@s-
mov dx,spt+2 ?*I
_'2
call dispdx |]qwD,eiH,
mov dx,spt ;$ot,mH?T
call dispdx =:fFu,+{
u )'l|Y
lea bx,msgtotal a59l"b
mov dx,bx (h"Yw
mov ah,09 njz:7]>e
int 21h c)N&}hFYC
lea bx,sectors EYwDv4H,g
call dispqword j( *;W}*^
\
\j98(i
lea bx,msgss
i- Le&
mov dx,bx In-W,
mov ah,09 i.4L;(cg
int 21h #3:;&@#
mov dx,sectorsize N9W\>hKaeh
call dispdx &hK5WP6whW
W]
8tp@
sbb word ptr sectors, 63d Z;/"-.i
jnc subok VrV* -J'
sub word ptr sectors+2,1 S-FoyID\H
jnc subok QK+s}ny
sub word ptr sectors+4,1 W#pA W
jnc subok <K8$00lm
sub word ptr sectors+6,1
eRlJ
u>~G)lx%
subok: kg2?I L
Z19d Ted33
` ]*KrY
8&AHu
xor ax,ax $N7:;X"l
mov blocknumL, ax .3(=UQ
mov blocknumL+2, ax fk(l.A$
mov blocknumL+4, ax $,vZX u|Qw
mov blocknumL+6, ax /]/3)@wT
w|6;Pf~1y)
startread: l)PEg PSRV
)~hsd+ 0t
call rwsect 69Y>iPRU
uUAib<wdPL
adc word ptr blocknuml,63d Y(>]7
jnc addok x;RjLI 4h
adc word ptr blocknuml+2,1 Vt_NvPB`
jnc addok G\ twx ;
adc word ptr blocknuml+4,1 7=.}484>J
jnc addok ;pU#3e+P8
adc word ptr blocknuml+6,1 |"[[.Adw9"
jnc addok fo"dX4%}
]rEFWA
addok: 5 =Os
sAr
mov ax, word ptr sectors+6 S9sFC!s1g
cmp ax, blocknuml+6 #y~`nyg%|
jg complete cZ(7/Pl
jl startread "s']@Qv
mov ax, word ptr sectors+4 O/gBBTB
cmp ax, blocknuml+4 _8Si
8+j
jg complete gnS0$kCJ:
jl startread D`r
^2(WW
mov ax, word ptr sectors+2 8aCa(Xu(H
cmp ax, blocknuml+2 oR.KtS$uh
jg complete /2,s-^
jl startread AHws5#;$6*
mov ax, word ptr sectors i8$tId
cmp ax, blocknuml N=)
E$h
jg complete F,CQAgx
jl startread ~jd:3ip+!
3r=IO#
complete: `jR
= X
>+v)^7c
lea bx,msgready JwzA'[tM
mov dx,bx &hmyfH&S
mov ah,09 MC5M><5\
int 21 tS2 P|fl
C9-90,
popa *iSsGb\M%
mov ax,3100h v=b`kCH}
int 21h z
3IQPl^
H79|%@F"
; %m'd~#pze
dispdx proc near uJ S+;H
pusha ]Y|Y ?
lea bx, dsp+3 MKd{y~'
mov cx,4 q#v&&]N=
(h0i2>K
repeat0: )J/,-p
mov al,dl ojO<sT:by
and al,0fh <De29'},y
cmp al,09h ArBgg[i
jg add40 A[lkGQtS4
add al, 30h ~+VIELU<%
jmp okadd e_6@oh2s-
add40: dZ UB
add al,37h &~
g||rq
okadd:
C\7qAR\
mov byte ptr [bx],al YaTJKgi"0
dec bx ;9,<&fe
shr dx,4 <Bc J;X/
loopnz repeat0 ?YY'-\h?
lea bx,dsp f\oB/
mov dx,bx w'q}aQS
mov ah,09h ffGiNXCM
int 21h %YhZ#>WT
~ifo7,
popa A_: Bz:
ret EthnI7Y
dispdx endp ?i*kwEj=
E<>Ev_5 >
dispqword proc near *Yk3y-
pusha \NbMS C&H
mov cx ,4 #UH|,>W6
add bx,6 pCSR^ua>
repeatdecbx: WU-.lg'c'
mov dx,[bx] v&}mbt-
call dispdx /}?"O~5M"
sub bx,2 i(q%EMf
loopnz repeatdecbx [((P,v*
popa #!\g5 ')mC
ret /H+j6*}r
dispqword endp (o_w[jv
Mn(:qQo^&`
rwsect proc near }Vw"7
PTe8,cD>
lea bx,msg oDp!^G2A"
mov dx,bx ya]CxnKR3
mov ah,09h dBY,&=T4p
int 21h d$<HMs:o@
uX@RdkC
lea bx,BlockNumL y\Z7]LHCqw
call dispqword rlYAy5&
^{8
r(1,
lea di, packetsize |+//pGx
mov dl,80h C=}YKsi|R|
mov ah,42h Oy$*ZG )
int 13h 3O<:eS~
jnc readok *]%{ttR~
k<uC[)_
mov cx,5 +Io^U
;出错后重试(定位0道后再重读) x$9UHEb kM
retryrd: x72bufd
lea bx, msgReadErr 1btQ[a6j
mov dx,bx H kDT14 `&
mov ah,09 '+BcPB?E
int 21h QK-_~9V
W:{1R&$l
}<w/2<