第一个宏汇编程序 ^:^8M4:
n4DKLAl
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ,<]~/5-f
jmn<gJ2Of
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! .=/TT|eMS
o=I.i>c
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! Ab:+AC5{
ew|e66Tw$
比较长啊!所以可以自动跳过。 [Qn$i/`J
5>S)+p
.286 Ydh+iLjhx
.radix 16
Aiqn6BX{
data segment ;定义数据段 ECLQqjB
7H_*1_%ZQ
Tu}?Q.pKo
msg db 0dh, "Reading sector:$" unAu8k^
msg1 db 0dh, "Writing sector:$" yMK VF`D*
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" }/.GB5Ej
i-`J+8|d
dsp db " $" OEXa^M4x
sx@%3j
;DAP V})b.\"F
PacketSize db 16d; // 数据包尺寸(16字节) [D<"qT^*z6
Reserved db 0; // ==0 p JM&R<i:
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) 1YvE/<6
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) 2D'$
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 fzW!-
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 ac#I$V-
,];QzENw
;定位用DAP (复位到0磁道) E6s)J -a
DAP0 db 16d ?m:,hI
db 0 *dX
7
dw 1 #0 eop>O
buff1 dw 0,0 G
q2@37U
dw 0,0,0,0 U$=#yg2
:
xcE<|0N
:
vALH!Kh
;DiskParameters LAU\.d
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) )|E
617g
falgs dw 0; WORD Flags; // 信息标志 ] 5:0.$5
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 |)b:@q3k+n
Heads DW 0; DWORD Heads; // 磁盘磁头数 )o_Pnq9_
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 m 9.BU2.
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 b'
fcWp0
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) `z?h=
&N
Vae=Yg=fw
cmpsect dw 0 pij%u<
.dTXC'
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" k/2TvEV3=
msgHds db 0dh,0a,"Heads:$" |,WP)
msgspt db 0dh, 0a,"SectorsPerTrack:$" Xx
e07J~
msgTotal db 0d,0a, "Total Sectors:$" 4-~S"T8<u
msgSS db 0dh,0a, "Sector Size:$" tY!GJusd
W&;,7T8@
msgReadErr db 0dh,0a,"Error Reading Sectors:$" oS#PBql4
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" G^qt@,n$;
msgReset db 0dh,0a, "Reseting drive to Cyl 0" +VRM:&
4ZrRgx2MD
l1ViUY&Z
buffer db 32768d dup(0); 2HF_kYZ
Hm
17El68
data ends ;数据段结尾 tQmuok4"d
y}GFtRNG
stack segment @XN|R
db 400 dup(?) hmr 2(f%U
stack ends )^LiALh
+$
0wBU
code segment ;定义代码段 @$!rgLyL[
assume cs:code ;规定cs的内容 \??20iz
assume ds:data ;规定ds的内容 /=S\v<z
assume ss:stack bDT@E,cSi
3u~V&jl
start: o' Kl+gw4
pusha
)6:1`&6
G)3Q
|Vc
#Mrc!pT]xy
mov ax,data ;程序从start开始 tqwAS)v=
mov ds,ax ;ds置初值,data的段地址 -5d^n\CDK
7~m[:Eg6[s
;设置缓冲区 &^(4yw(~
lea bx, buffer tu5T^"BqO
mov bufferaddr,bx %>!$eCX
mov buff1,bx {P!1VYs
5
mov bx,ds 4-JyK
%m,0
mov bufferaddr+2,bx I7Xm~w!{qk
mov buff1,bx @"O|[%7e
!]t5(g_
lea di,infosize JNxrs~}
mov dl,80h c,FZ{O@
mov ah,48h =.ReM_.
int 13h 0vrx5E!
9y{R_
lea bx,msgcyl #-8%g{
mov dx,bx #(G"ya
mov ah,09 tM3Q;8gB!
int 21h o&:'MwU
mov dx,cylinders nIf~ds&TT
call dispdx F6gU9=F1<
i.0.oy>
lea bx,msghds IT:8k5(L5j
mov dx,bx /xw}]Fa5
mov ah,09 kKz>]t"A
int 21h u{%dm5
mov dx,heads r74'
_y
call dispdx 7)dCdO
*dPG[ }
lea bx,msgspt MWJ}
mov dx,bx
o3(
:R0
mov ah,09 f yhBfA:u
int 21h OI^sd_gkZ
mov dx,spt+2 Tga%-xr+
call dispdx qw6i|JM%
mov dx,spt {YF(6wVl
call dispdx x|GkXD3
[K""6D
lea bx,msgtotal OZ6:u^OS]
mov dx,bx vX<^x2~9(
mov ah,09 s|!lw
int 21h pmgPBiU>
lea bx,sectors A#8J6xcSrL
call dispqword jAak,[~;
T*jQzcm~?
lea bx,msgss <KBS ;t="1
mov dx,bx Y4{/P1F
mov ah,09 )8*}-z
int 21h $tB `dDj
mov dx,sectorsize k\KI#.>
call dispdx L-[A1#n
hkl9EVO)
sbb word ptr sectors, 63d XNQPyZ2@|b
jnc subok }0AoV&75
sub word ptr sectors+2,1 =;~*YD(%/
jnc subok \%|%C
sub word ptr sectors+4,1 DAf0bh"
jnc subok g<g$c<sm
sub word ptr sectors+6,1 #&K? N
3#N`n |UgC
subok: -
`{T ?
UOn:@Qn
A\ r}V-
aI_[h
v
xor ax,ax `CY c>n"
mov blocknumL, ax *NCkC
~4
mov blocknumL+2, ax x,LYfy"0
mov blocknumL+4, ax dry>TXG*
mov blocknumL+6, ax tui5?\
KtD
XB>
startread: UT_kw}1
o
qijQRxS
call rwsect |./{,",
#MUY!
adc word ptr blocknuml,63d (CInt_dBw~
jnc addok 7\[)5j
adc word ptr blocknuml+2,1 K8RV=3MBLD
jnc addok xv~Sk2Z+d
adc word ptr blocknuml+4,1 i $lp8Y2ih
jnc addok
=B0AG9Fz
adc word ptr blocknuml+6,1 qFN`pe,
jnc addok uP$C2glyz
6 l7iX]
addok: d9q`IZqee
mov ax, word ptr sectors+6 tP4z#0r2
cmp ax, blocknuml+6 g9@H4y6fe=
jg complete G>,43S!<
jl startread :pvB}RYD
mov ax, word ptr sectors+4 <kKuis6h
cmp ax, blocknuml+4 ;$'D13
jg complete {JQCfs
jl startread &X#6jTh+
mov ax, word ptr sectors+2 k|`Qk!tr
cmp ax, blocknuml+2 00/ RBs5
jg complete 2hsRYh
jl startread 2B
b,ZC*
mov ax, word ptr sectors W5Vh+'3
cmp ax, blocknuml A$70!5*
jg complete
z-_$P)[c
jl startread QB;jZpF
qi$nG_<<Z
complete: ~-
eB
SA%uGkm:e
lea bx,msgready >f70-D28
mov dx,bx m2
[]`Ir^@
mov ah,09 5QP`2I_n
int 21
*JF7 B
mwO9`AU;
popa < b-OdOg
mov ax,3100h pU1miA '
int 21h sq{=TB{
'Lh nl3
; u4h.\ul8%
dispdx proc near :QIf0*.O
pusha VI]~uTV
lea bx, dsp+3 Vp&"[rC_z
mov cx,4 =rA]kGx
Y 2[ik<
repeat0: a%r( F
mov al,dl KzQuLD(e
and al,0fh -f["1-A
cmp al,09h Zmm6&OZ%
jg add40 kQD~v+u
{`
add al, 30h S/dj])g
jmp okadd @*BVS'\
add40: B*:W`}G]_c
add al,37h Mh]4K"cs
okadd: lC@wCgc
mov byte ptr [bx],al m=rMx]k
dec bx *#83U?
shr dx,4 OV
|n/~
loopnz repeat0 v^aI+p6
lea bx,dsp `#4q7v~>oe
mov dx,bx Zi{vEI ]
mov ah,09h Rk#p zD
int 21h y+h/jEbM</
i?861Hu
popa sKC(xO@L;`
ret m-]F]c=)w<
dispdx endp }kSP p
~d-Q3n?zR
dispqword proc near 80K"u
[
pusha 9r>iP L2H
mov cx ,4 %k @4}M>
add bx,6 `=%G&_3_<
repeatdecbx: #J^ >7v
mov dx,[bx] E+cx8(
call dispdx |?
rO
sub bx,2 =!u]t&
yv
loopnz repeatdecbx \%_sL#?
popa >Se-5QtLcf
ret l ;S_ J^S
dispqword endp N?IdaVLj
EQ]>^VE2B
rwsect proc near YmD~&J
wRg[Mu,Q5
lea bx,msg W@RD
bsc
mov dx,bx IV~5Y{(l
mov ah,09h qtuT%?wT@Z
int 21h gfiFRwC`v
!X`cNd)0Xo
lea bx,BlockNumL dF7`V J2
call dispqword Hi^Z`97c
39A|6>-?
lea di, packetsize 08/Tk+
mov dl,80h +I +RNXR/{
mov ah,42h T?CQgVR
int 13h 0{/'[o7
jnc readok o1thGttVDg
q"Sja!-;|
mov cx,5 BmaY&?
;出错后重试(定位0道后再重读) ;
W$.>*O
retryrd: PZj}]d `
lea bx, msgReadErr Z%JAX>v&B
mov dx,bx ;H9 W:_ahE
mov ah,09 0E9 lv"3o
int 21h =
u&dU'@q
>0?ph<h1[q
SgkW-#
lea di,dap0 ZB]234`0
mov dl,80h eoJ*?v
mov ah,44h Bf;<3k)5.
int 13h <?%49
J;ycAF ~
lea bx,BlockNumL 8S5Q{[ !
call dispqword %4})_h?j
8X/SNRk6p
lea di, packetsize MzF,is
mov dl,80h >:h&5@^j$
mov ah,42h =.l>Uw
!
int 13h *;T'=u_lR
jnc readok bnN&E?{hF1
loopnz retryrd yji>vJHu
B<ZCuVWH:
readok: >sQf{uL
lea di, packetsize ni6zo~+W]
mov dl,80h qe/5'dw
mov ah,43h iD/+#UTY
int 13h N'0nt]&a
P!gY&>EU
rwsect endp N{<5)L~Y
h6?o)Q>N
code ends ;代码段结尾 Y.kc,~vYL
end start ;结束汇编 3xgU=@!;
G=l:v