第一个宏汇编程序 %6"b<
MAO
m!:7ur:Y
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 05MtQB
\6Ze H
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! ^F~e?^s
E `)p,{T
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! `B6{y9J6
UG>OL2m>5
比较长啊!所以可以自动跳过。 AAdRuO{l1
G1~|$X@@
.286 ^[CD- #
.radix 16 *[7,@S/<F
data segment ;定义数据段 fwRlqfi
morI'6N
+2w54X%?M
msg db 0dh, "Reading sector:$" <P5;8
msg1 db 0dh, "Writing sector:$" HJ5m5':a
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" .>?["e #,
Y(SgfWeK@1
dsp db " $" 5e,Dk0d
j78xMGKO
;DAP |7/B20
PacketSize db 16d; // 数据包尺寸(16字节) _A)<"z0E
Reserved db 0; // ==0 .VmI4V?}h
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) /)de`k"
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) "=<lPi
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 5
^iU1
\(L
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 !
o4xI?
k&DHQvfB
;定位用DAP (复位到0磁道) xM;gF2
DAP0 db 16d \sC0om,
db 0 h{sW$WA
dw 1 )
ZOmv
buff1 dw 0,0 %~ecrQ
;
dw 0,0,0,0 WytCc>oL
@6$r|:]G-
x[}e1sXXs
;DiskParameters -H`G6oMOO
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) >UJ&noUD#:
falgs dw 0; WORD Flags; // 信息标志 &u"*vG (U[
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 [ylGNuy
Heads DW 0; DWORD Heads; // 磁盘磁头数 AEnS_Q
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ?/)5U}*M0T
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 B:z -?u#B
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位)
;.W0Aa
ok\+$+$ju
cmpsect dw 0 4_N)1u !
gqD`1/
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" nHKEtKDd
msgHds db 0dh,0a,"Heads:$" gH\r# wy|
msgspt db 0dh, 0a,"SectorsPerTrack:$" }C7tlA8,7
msgTotal db 0d,0a, "Total Sectors:$" 7"xd'\c@
msgSS db 0dh,0a, "Sector Size:$" =pcj{B{qa
/@RnCjc'
msgReadErr db 0dh,0a,"Error Reading Sectors:$" n/?5[O-D]
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 2a=WT`xf?
msgReset db 0dh,0a, "Reseting drive to Cyl 0" #K!Df%,<
2,&lGyV#
0v0Y(
Mo@
buffer db 32768d dup(0); *!9/`zW
&F'v_9
data ends ;数据段结尾 2c%}p0<;|?
OqBw&zm
stack segment B0z.s+.
db 400 dup(?)
|k/; .
stack ends
OV8b~k4=
kFM'?L&
code segment ;定义代码段 Ip4NkUI3T
assume cs:code ;规定cs的内容 {u.V8%8
assume ds:data ;规定ds的内容 G>mgoN
assume ss:stack -t6d`p;dR
kM3BP&
3m1
start: 0dkM72p
pusha HxY,R^
&OhKx
L''0`a. +S
mov ax,data ;程序从start开始 .4!N#'
mov ds,ax ;ds置初值,data的段地址 qqzQKN
fe37T@
;设置缓冲区 r$v?[x>+K
lea bx, buffer {C]M]b*F6(
mov bufferaddr,bx Lf 0Hz")
mov buff1,bx ;wQWt_OtuJ
mov bx,ds 1wc
-v@E
mov bufferaddr+2,bx EJWMr`zdn
mov buff1,bx P1)
80<t
6eDIS|/
lea di,infosize D hZtiqL#_
mov dl,80h fr#lH3
mov ah,48h 4E
|6l
int 13h -;P<Q`{I
xk|$O
a
lea bx,msgcyl
GoEIY
mov dx,bx Rc6
)v
mov ah,09 FOk @W&
int 21h 3Gp4%UT&
mov dx,cylinders k) v[/#I
call dispdx LDBR4@V
)i_FU~ LRq
lea bx,msghds
Km <Wh=
mov dx,bx 5h:SH]tn8]
mov ah,09 J82{PfQ"
int 21h zK-hNDFL{
mov dx,heads %&_(IY$d
call dispdx E
tu>z+P!
D
8?$Fn=
lea bx,msgspt t^CT^z
mov dx,bx Q"hI !PO+
mov ah,09 @>9p2u)=
int 21h Q5,@P?
mov dx,spt+2 5GJ0E Z'X
call dispdx (FjgnsW
mov dx,spt R^B2J+O
call dispdx "]_|c\98
==XP}w)m
lea bx,msgtotal 3K?0PRg
mov dx,bx |O
4A+S
mov ah,09 9uS7G *
int 21h ax^${s|{-
lea bx,sectors oo Z-T>$
call dispqword Ox~'w0c,f
D`t e|K5
lea bx,msgss ~o/^=:*
mov dx,bx _).'SU)>
mov ah,09 #>v7"
<
int 21h ,#wVqBEk
mov dx,sectorsize 'hekCZZ_I
call dispdx YQ]H3GA
#Y5I_:k
sbb word ptr sectors, 63d s3+O=5
jnc subok tt^ze|*&t
sub word ptr sectors+2,1 {-Y_8@&