第一个宏汇编程序 BN,>&1I
<:|3rfm#
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 Z"s|]K "
~LQ[4h<J !
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! C}5M;|%3)
eb|i3.
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! S.|FL%;
#?B%Ja%
;W
比较长啊!所以可以自动跳过。 ueG|*[
d^|0R
.286 `8\Ja$ =
.radix 16 ^ZTGJ(j7~
data segment ;定义数据段 *Ul*%!
?D
T5O _LCIws
[4J6iF
msg db 0dh, "Reading sector:$" @InZ<AW>|
msg1 db 0dh, "Writing sector:$" bY~@}gC**@
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" V#q}Wysft
OU7 %V)X5
dsp db " $" 4Tct
e &9F\e
;DAP 0D~ C
5}/4
PacketSize db 16d; // 数据包尺寸(16字节) OJ4
SbI
Reserved db 0; // ==0 _DP|-bp D
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) 4l8BQz}sb
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) xdy^^3"
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 Vc3mp;6"
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 9F;S+)H4
_;RVe"tR#
;定位用DAP (复位到0磁道) H0"= Vs,n
DAP0 db 16d ]+H?@*b`
db 0 $ex!!rqN|
dw 1
8%RI7Mg
buff1 dw 0,0 /( 6|{B
dw 0,0,0,0 Tx%VU8\?n
OVk~N)
r gcWRt
;DiskParameters pe&UQ C^
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节)
StYzGJ
falgs dw 0; WORD Flags; // 信息标志 Bf4%G,o5
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 vf~`eT
Heads DW 0; DWORD Heads; // 磁盘磁头数 O3NWXe<
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 nF)uTk
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 AAUyy
:
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) as"N=\N
T{vR,
cmpsect dw 0 $WW)bP
d4^
=wq;@' U
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" YW;
Hk1
msgHds db 0dh,0a,"Heads:$" #:ns64|
msgspt db 0dh, 0a,"SectorsPerTrack:$" $A<ESfrs
msgTotal db 0d,0a, "Total Sectors:$" ]|:uU
msgSS db 0dh,0a, "Sector Size:$" {w^uWR4f
)fU(AXSP
msgReadErr db 0dh,0a,"Error Reading Sectors:$" _U)%kY8
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" E&~nps8e
msgReset db 0dh,0a, "Reseting drive to Cyl 0" v$w++3H
iz"3\{aN
7 boJ*
buffer db 32768d dup(0); Z%gx%$
KbxR
Lx]w
data ends ;数据段结尾 %|XE#hw
f0Hq8qAF;^
stack segment H]#Rg`~n
db 400 dup(?) ;9uRO*H?T
stack ends {fSfq&o
.>6 Wv0
code segment ;定义代码段 !#? kWAU
assume cs:code ;规定cs的内容 mE#nU(+Ta
assume ds:data ;规定ds的内容 +K6szGP
assume ss:stack UmK X*T9
Ov9Q?8KzM
start: dX
)W0
pusha X21dX`eMN
w36(p{#vp
s.jO<{
mov ax,data ;程序从start开始 ~y0R'oi
mov ds,ax ;ds置初值,data的段地址 8)0L2KL'
RM*f|j
;设置缓冲区 u2sR.%2U<
lea bx, buffer ~0-
g%C?R
mov bufferaddr,bx /owO@~G
mov buff1,bx mxqG-*ch-
mov bx,ds RHNk%9
mov bufferaddr+2,bx ]y1fM0
mov buff1,bx 8}BB OD
$;D*
n'8Fx
lea di,infosize Q* O<@
mov dl,80h Bo\D.a(T
mov ah,48h X,v4d~>]
int 13h K3p@$3hQ
q'(z #h,cv
lea bx,msgcyl V{Q kN7-
mov dx,bx Q1tpCT
mov ah,09 p/]s)uYp$
int 21h =7ydk"xM*
mov dx,cylinders "<l<&
qp
call dispdx Ygkv7>?,
)%JD8;[Jq
lea bx,msghds W."f8ow
mov dx,bx b7h+?!H]R
mov ah,09 E(L<L1:"
int 21h :mv`\
mov dx,heads &:#m&,tQ
call dispdx E,*&BDW
Nf?\AK!
lea bx,msgspt =ak7ldA=2
mov dx,bx &