第一个宏汇编程序 Ia0.I " ,
z"=#<C
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 psgXJe$
bkLm]n3
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! e@NS=U` <
9~
K1+%!
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! R l^ENrv!]
+>44'M^Z|(
比较长啊!所以可以自动跳过。 eaYQyMv@
najd~%?Rs
.286 @m1v B!
.radix 16 Nyow:7p
data segment ;定义数据段 H2E!A2\m
R`!x<J
&N[~+"
msg db 0dh, "Reading sector:$" Y>R|Uf.o z
msg1 db 0dh, "Writing sector:$" ~ NKw
}6
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" F1w~f
<
W*}q;ub;
dsp db " $" J0C,KU(
daGGgSbh
;DAP b H?dyS6Bx
PacketSize db 16d; // 数据包尺寸(16字节) $*9h\W-)`Q
Reserved db 0; // ==0 kNd[M =%
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) lRZt))3
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) k
.KN9=o
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 B9>3xxp(by
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 $X
WJxQRUv
=HQH;c"
;定位用DAP (复位到0磁道) ]y2(ZTNTs
DAP0 db 16d >|XQfavE
db 0 `5=0f}E
dw 1 7t0\}e
buff1 dw 0,0 A_CE
pG]
dw 0,0,0,0 g5;
W6QX
Ip4CC'
M_Z*F!al<
;DiskParameters `k
a!`nfo
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) N&-d8
[~
falgs dw 0; WORD Flags; // 信息标志 H}dsd=yO
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 ?UcW@B{
Heads DW 0; DWORD Heads; // 磁盘磁头数 !3kyPoq+
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 UStZ3A'
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 6f\0YU<C&
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) 0 #VH=p ga
UyEyk$6SU
cmpsect dw 0 8ooj)
9bNjC&:4/]
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" " <m)Fh;
msgHds db 0dh,0a,"Heads:$" eH(8T
msgspt db 0dh, 0a,"SectorsPerTrack:$" r2M._}bF
msgTotal db 0d,0a, "Total Sectors:$" )?K3nr
msgSS db 0dh,0a, "Sector Size:$" UqsVqi
h(
hGcOk[m 4
msgReadErr db 0dh,0a,"Error Reading Sectors:$" IT'~.!o7/
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" O)Nj'Hcu
msgReset db 0dh,0a, "Reseting drive to Cyl 0" &t+03c8g!
NyeGa
\2L%%M
buffer db 32768d dup(0); <&t^&6k
.px*.e s
data ends ;数据段结尾 t(\d;ybyx
m!$"-nh9
stack segment 4
u"V52
db 400 dup(?) ])7t!<
stack ends c03A_2%
OzA"i y
code segment ;定义代码段 k8GcHqNHx
assume cs:code ;规定cs的内容 .%M=dL>
assume ds:data ;规定ds的内容 V`l.F"<L
assume ss:stack z<m,Xj4w
p*-o33Ve
start: M9fAv
pusha =xS(Er`r
r[Qk-}@vp
'2WYbcU
mov ax,data ;程序从start开始 iKv{)5
mov ds,ax ;ds置初值,data的段地址 kK16+`\+
o/CSIvz1
;设置缓冲区 s~Ni\SF
lea bx, buffer vM
RM/.
mov bufferaddr,bx oi::/W|A+
mov buff1,bx uV#/Lgw{M
mov bx,ds i(a2FKLy
mov bufferaddr+2,bx ZgcA[P
mov buff1,bx 7M<7^)9
Yih^ZTf]O?
lea di,infosize )z=`,\&p:
mov dl,80h z%hB=V!~91
mov ah,48h @j K7bab:
int 13h ]mn(lK
TMhUo#`I|
lea bx,msgcyl -9UQs.Nv
mov dx,bx kgEGL]G>
mov ah,09 wbUpD(
int 21h *QG>U [
mov dx,cylinders ",B92[}Ar
call dispdx VWI|`O.w
7 1z$a
lea bx,msghds 5
dXC
mov dx,bx ${8 1~
mov ah,09 (=j]fnH?
int 21h W&A22jO.1
mov dx,heads q-KN{y/
call dispdx ullq}}
3R
!Mfz*
lea bx,msgspt Aq^1(-g
mov dx,bx S"!nM]2L
mov ah,09 fM]zD/ g
int 21h l=Jbuc
mov dx,spt+2 erdWGUfQOe
call dispdx B;SYO>.W
mov dx,spt WID4 {>G2
call dispdx x&8HBF'
Gm}ecW
lea bx,msgtotal JrQd7
mov dx,bx jI_TN5
mov ah,09 %i]q} M
int 21h 6w0/;8(_m
lea bx,sectors XTG*
56IzL
call dispqword 0vqXLFf
h:Q*T*py
lea bx,msgss B+ud-M0
mov dx,bx Co4QWyt:
mov ah,09 c]P`U(q9TV
int 21h $*Njvr7
mov dx,sectorsize
'&I.w p`^
call dispdx Be68 Fu0
^*C8BzcH
sbb word ptr sectors, 63d |dsd5Vdr
jnc subok xx
)egy_
sub word ptr sectors+2,1 ' &^:@V
jnc subok m;>HUTj
sub word ptr sectors+4,1 /(bPc12
jnc subok K=;z&E=<c
sub word ptr sectors+6,1 ?i>.<IPOq
GO.mT/rB
subok: 5)wz `OS
~]*P/'-{#
Q0Y0Zt,h
?dl7!I@<E<
xor ax,ax u%Bk"noCa
mov blocknumL, ax c*'D
mov blocknumL+2, ax ~gNa<tg"1
mov blocknumL+4, ax +?),BRCce
mov blocknumL+6, ax HpiP"Sl
ULIbVy7Y
startread: m*6C *M
y[UTuFv~Q
call rwsect 4N[8LC;MH
k#_B^J&d
adc word ptr blocknuml,63d yEJ}!/
jnc addok bJ*jJl x
adc word ptr blocknuml+2,1 |bk.gh
jnc addok ^%@(>:)0
adc word ptr blocknuml+4,1 nbj &3z,
jnc addok "~:o#~F6
adc word ptr blocknuml+6,1 c`yLn%Of%
jnc addok VC:.ya|Z
<S:SIaf0
addok: ZZL.&Ho
mov ax, word ptr sectors+6 QeuIAs* _
cmp ax, blocknuml+6 :EJ+#
jg complete ^w5`YI4<
jl startread _ n,Ye&m
mov ax, word ptr sectors+4 h\Ck""&
cmp ax, blocknuml+4 th}Q`vg0
jg complete 02g}}{be8
jl startread U;<07
aMj
mov ax, word ptr sectors+2 I dgha9K
cmp ax, blocknuml+2 T\eOrWt/
jg complete EJ;:O1,6H
jl startread P3jDx{F
mov ax, word ptr sectors +/'3=!oyd
cmp ax, blocknuml qgbp-A!2zF
jg complete h.gj4/g
jl startread oyZ}JTl(Q
Wf^6:
complete: Ob$|IH
8.
FX
`SaY>D
lea bx,msgready 3R1v0
mov dx,bx (]n^_G#-$
mov ah,09 Kr3L~4>
int 21 EtjN :p|$
dE=4tqv-r
popa aF7" 4^ P
mov ax,3100h ^31X-}tv
int 21h _w/w~;7
(, Il>cR4
; rK;F]ei
dispdx proc near ma)Y@Uw M
pusha 494"-F 6
lea bx, dsp+3 ]mYT!(}
mov cx,4 I,OEor6%R(
w[~O@:`]<o
repeat0: ~4S@kYe{3K
mov al,dl <t>"b|
fW
and al,0fh Nih8(pbe
cmp al,09h GD<xmuo
jg add40 Z&e_yl
add al, 30h QCIH1\`jW
jmp okadd wWB-P6
add40: `h*)PitRa
add al,37h "a
%5on
okadd: ~Wp>tnl
mov byte ptr [bx],al 5(R ./
dec bx u=I \0H
shr dx,4 ZT:&j4A|0
loopnz repeat0 78&jaw*1A
lea bx,dsp ~:~-AXaMT
mov dx,bx 'gHa3:US
mov ah,09h o(Yj[:+m
int 21h <)ozbv Xk
8Ux3,X=
popa PzbLbH8A
ret >0z(+}]3z
dispdx endp f'` QW@U
RoCX*3 d
dispqword proc near 7SO i9JU_
pusha B~K@o.%
mov cx ,4 ^vPM\qP#g
add bx,6 &sleV5V
repeatdecbx: jHBzZ!<
mov dx,[bx] I]t ",s/j
call dispdx {gT2G*Ed^Z
sub bx,2 x?v/|
loopnz repeatdecbx T2|dFKeWG
popa pT\>kqmj
ret %;$zR}
dispqword endp ;WxE0Q:!~
,)^4H>~V
rwsect proc near ;L (dmx?
'o;>6u<u
lea bx,msg BO)K=gl;8
mov dx,bx ^}vL ZA
mov ah,09h ejP273*ah
int 21h W9nmTz\8
c@!%.# |y
lea bx,BlockNumL H/n3il_-I
call dispqword b2]1Dfw
[(Ss^?AJW
lea di, packetsize Loo48
mov dl,80h ^EY^.?Mg
mov ah,42h wN'Q\l+
int 13h ANh7`AUuO
jnc readok BM9J/24
e=S51q_0
mov cx,5 Khp`KPxz%
;出错后重试(定位0道后再重读) N) D;)ZH
retryrd: h8OmO5/H
lea bx, msgReadErr }{/3yXk[G
mov dx,bx P/uk]5H^
mov ah,09 VL4ErOoZ
int 21h uf4C+ci
]w ^9qS
f'._{"
lea di,dap0 I*8i=O@0T
mov dl,80h ,)-7f|
mov ah,44h WfYu-TK*
int 13h Sxo9y0K8-
X/Umfci
lea bx,BlockNumL AG/?
LPJ
call dispqword =g)|g+[H
<d!_.f}v
lea di, packetsize F*Lm=^:
mov dl,80h #Duz|F+%
mov ah,42h &}%rZU
int 13h }j9V0`Q
jnc readok #;,dk(URo
loopnz retryrd ?[{_*qh
J<J_yRg2
readok: ^UTQcm
lea di, packetsize yU'Fyul
mov dl,80h zQvp<IUq
mov ah,43h }Fy~DsQ
int 13h fy&vo~4i;
+
q@kRQY;n
rwsect endp X.TsOoy
LA?h +)
code ends ;代码段结尾 v53qpqc
end start ;结束汇编 (0Buo#I
Bs7/<$9K/