第一个宏汇编程序 WK?5`|1l:x
xR
kw+
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ;!VxmZ:j[
JvvN>bg
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! du~V=%9
'wYIJK~1
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! L#'XN H
"
YL!{oHs4
比较长啊!所以可以自动跳过。 N.q*jY=X|
32HF&P+0%
.286 smQl^
6a
.radix 16 !&b|
[b
data segment ;定义数据段 i5Sya]FN
Lj GZp"&{
o
o'7
msg db 0dh, "Reading sector:$" |By[ev"Kh%
msg1 db 0dh, "Writing sector:$" X=1o$:7
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" uh.;Jj;
$mAC8a_Zu
dsp db " $" __7}4mA
\\13n4fAv
;DAP f@J
rbg
PacketSize db 16d; // 数据包尺寸(16字节) 9,JM$ Y
{
Reserved db 0; // ==0 G9Kck|50
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) {irc~||4
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ?aWVfX!+G5
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 A/:_uqm4
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 l"+8>Mm
'nM4t
;定位用DAP (复位到0磁道) ![Gn0X?]
DAP0 db 16d %x{kd8>u!
db 0 sCt)Yp+8}B
dw 1 i\^4EQ
buff1 dw 0,0 {PxFG<^U
dw 0,0,0,0 ]&P\|b1*g
R ai
04
P%Vq#5
;DiskParameters H"UJBO>$
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) (p12
=EB<
falgs dw 0; WORD Flags; // 信息标志 vR!g1gI23
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 7$g$p&,VX
Heads DW 0; DWORD Heads; // 磁盘磁头数 ZB)R4
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 FP=27=
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 "@hd\w{.
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) Nc4;2~XwRp
u_+iH$zA
cmpsect dw 0 _A!Fp0}`
&)+H''JY
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" Z|x|8 !D
msgHds db 0dh,0a,"Heads:$" b+:J?MR;}
msgspt db 0dh, 0a,"SectorsPerTrack:$" ^vT!2
4sK
msgTotal db 0d,0a, "Total Sectors:$" /RqWrpzx@
msgSS db 0dh,0a, "Sector Size:$" w< Xwz`O
>w7KOVbN3
msgReadErr db 0dh,0a,"Error Reading Sectors:$" -@_v@]:
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" [PUu9rz#
msgReset db 0dh,0a, "Reseting drive to Cyl 0" Xj{fM\,"9
V7nOT*N:Q
E X'PRNB,
buffer db 32768d dup(0); (57!{
[J
NZ i3U
data ends ;数据段结尾 ! #!
MTk
$Z;/Sh
stack segment ,e9M%VIu6[
db 400 dup(?) qF`6l(
stack ends 7p]Izx8][
Ic_NQ<8
code segment ;定义代码段 %c\kLSe
assume cs:code ;规定cs的内容 (?t}S.>g
assume ds:data ;规定ds的内容 _h#I}uJ~
assume ss:stack ,G}i:7
of_y<dd[G
start: kD;pj3o&"2
pusha *@PM,tS;
dTK0lgkUE
sfr+W-7kx
mov ax,data ;程序从start开始 g;p}
-=
mov ds,ax ;ds置初值,data的段地址 ARf{hiV6Wt
I_z(ft.
;设置缓冲区 t>?tWSNf
lea bx, buffer vaP`'
mov bufferaddr,bx #6ePwd
mov buff1,bx MomHSv Q\
mov bx,ds hPNMp@Nm6
mov bufferaddr+2,bx m
rnPZf i
mov buff1,bx yCN_vrH
>
!YjxCx
lea di,infosize rqmb<#
Z
mov dl,80h OHpV%8
`
mov ah,48h aif;h!
?y
int 13h HLwMo&*rA
#L+:MA7H
lea bx,msgcyl xIa7F$R 0
mov dx,bx u)<s*jk
mov ah,09 r
<5}& B`
int 21h RfTGTz@H
mov dx,cylinders C[
mTVxd
call dispdx ^O+ (eA7E
z
dgS@g
lea bx,msghds
JL1A3G
mov dx,bx ;TWLo_
mov ah,09 +Z|3[#W
int 21h 1
rhZlmf[r
mov dx,heads J,CwC)
call dispdx n:`f.jG |
;H~<.QW
lea bx,msgspt Qw'905;(
mov dx,bx 7LVG0A2>7
mov ah,09 1F`jptVQ\G
int 21h BXYH&2]Q
mov dx,spt+2 9K`_P] l2z
call dispdx 6^'BTd
mov dx,spt 9|}Pf_5]%[
call dispdx I@9'd$YY
)'U0n`=
lea bx,msgtotal 6u+aP
mov dx,bx w90YlWS#
mov ah,09 ]1<
GZ`
int 21h b),fz
lea bx,sectors [DM0'4
call dispqword 3)W zX
aU_Hl+;
lea bx,msgss bqAW
mov dx,bx b@;Wh-{d
mov ah,09 *l+Dbm,u
int 21h W~ET/h
mov dx,sectorsize h.PBe
call dispdx \$wkr
p8!T)
?|
sbb word ptr sectors, 63d `nl n@ ;
jnc subok &R%'s1]o
sub word ptr sectors+2,1 \|S!g
_30m
jnc subok I!S Eb
sub word ptr sectors+4,1 OA[e}Vn
jnc subok P$z_A8}
sub word ptr sectors+6,1 JaRsm'SIk~
g5@g_~ g
subok: {jz`K1
kUgfFa#_
_5-h\RB)
Y!CUUWM
xor ax,ax R);Hd1G
mov blocknumL, ax &2`p#riAS
mov blocknumL+2, ax /!?LBtqy
mov blocknumL+4, ax LjBIRV7
mov blocknumL+6, ax /qX?ca1_4^
[^5;XD:%&l
startread:
zd=O;T;.
_2!8,MX
call rwsect ^E.
L8
%A$&9c%
adc word ptr blocknuml,63d ;[Mvk6^'R
jnc addok 1Hr}n6s
adc word ptr blocknuml+2,1 \uJRjw+
jnc addok :h{uZ,#Gi
adc word ptr blocknuml+4,1 kJ_8|
jnc addok t+8e
?="
adc word ptr blocknuml+6,1 VX$WL"A
jnc addok V9<`?[Usv
'*b]$5*p
addok: k9;^|Cm
k
mov ax, word ptr sectors+6 h<LFTYE@
cmp ax, blocknuml+6 1[SG.
jg complete aZWj52
jl startread ",$_\l
mov ax, word ptr sectors+4 ~Ba=nn8Cq
cmp ax, blocknuml+4 _VKI@
jg complete AzOs/q8O
jl startread xmvE*q"9]
mov ax, word ptr sectors+2 (jc& Fk
cmp ax, blocknuml+2 {?H5Pw>{%h
jg complete {p84fR1P
jl startread hL&$` Q
mov ax, word ptr sectors hWT
jN
cmp ax, blocknuml a]T:wUYG'
jg complete ;XurH%Mg
jl startread wfmM`4Y
v4n< G-
complete: =n5'~1?X?
"r-P[EKpL
lea bx,msgready (.ir"\k1(
mov dx,bx PW5]+ |#
mov ah,09 #s\@fp7A
int 21 {rUg,y{v
P0n1I7|
popa QJVbt
mov ax,3100h @&ZQDi
int 21h n:
%4SZn
Dw%'u'HG
; 5G f@n/M"
dispdx proc near /kb
U<
pusha u=.8M`FxP
lea bx, dsp+3 -!j6&
mov cx,4 f82%nT
ef7{D
P
repeat0: OM*c7&
mov al,dl nF,F#V8l
and al,0fh CF '&Yo
cmp al,09h Tnp
P '
jg add40 P]43FPb
add al, 30h Y_JQPup
jmp okadd hO=L|BJ?I
add40: e7RgA1
add al,37h G#n 4g:K
okadd: c1yRy|
mov byte ptr [bx],al VVas>/0qr
dec bx <&3P\aM>
shr dx,4 SO$Af!S:bB
loopnz repeat0 $a M5jH<
lea bx,dsp U)/.wa>
mov dx,bx 6Wu*zY_+
mov ah,09h ]4l2jY
int 21h JLoF!MK}
8W\yM;'
popa <q'l7S
ret hx:q@[ +J/
dispdx endp zt(lV
*q=T1JY
dispqword proc near /;*_[g5*i
pusha fST.p|b7
mov cx ,4 q>$MqKWM
add bx,6 [IL*}M!
repeatdecbx: O[Vet/^)
mov dx,[bx]
d y HC8
call dispdx Jb QK$[z"
sub bx,2
<\^0!v
loopnz repeatdecbx 8s1nE_3
popa K~TwyB-h
ret v'W{+>.
dispqword endp !D#"+&&G8
C^J<qq&
rwsect proc near h_%q`y ,
Jka>Er
lea bx,msg cS;3,#$
mov dx,bx VeYT[Us"
mov ah,09h ngo> ^9/8
int 21h g+ c*VmY
V?uT5.B2
lea bx,BlockNumL nkW})Ly
B\
call dispqword O3} JOv_
J}#gTG( '
lea di, packetsize (pxH<k=Ah
mov dl,80h ?QOU9"@+B
mov ah,42h $DL}jH^S
int 13h yLnQ9BXB&
jnc readok b@Ej$t&
-s3`mc}*
mov cx,5 3uLG$`N
;出错后重试(定位0道后再重读) kxM
vOB$
retryrd: &93{>caf+
lea bx, msgReadErr u m9yO'[C
mov dx,bx *N">93:
mov ah,09 0k]ApW
int 21h 0:$}~T9T
F]a
oTy
tT}b_r7h(1
lea di,dap0 xXe3E&
mov dl,80h S,m
(
mov ah,44h uX_H;,n
int 13h @^{`!>Vt
5Gz!Bf@!!
lea bx,BlockNumL ~g{j)"1
call dispqword mUBy*.
Er;/zxg9p
lea di, packetsize PG&t~4QM`
mov dl,80h Vrt$/ d
mov ah,42h nip6|dN
int 13h JrzPDb`m
jnc readok 5,"c1[
`-
loopnz retryrd $1yO Zp5
RM;a]g*
readok: fiGTI}=P
lea di, packetsize Rx-\B$G
mov dl,80h }"D;?$R!
mov ah,43h u]yy%@U1
int 13h Bs "D<r&ro
G:AA>t
rwsect endp
(dy(.4W\
uo#1^`P
code ends ;代码段结尾 p*;!5;OUR
end start ;结束汇编 >q"dLZ
aA
g Qv*