第一个宏汇编程序 G{4~{{tI
F0&BEJBkU
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ^;KL`
C}})dL;(
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! >pS@;t'
B
kZmE,
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! T[$! ^WT
EUVB>%P
比较长啊!所以可以自动跳过。 #zRT
-Odk'{nW
.286 =%wwepz6
.radix 16 _b ~XBn
data segment ;定义数据段 *{/L7])gm
L%3m_'6QP
;JNI$DR
msg db 0dh, "Reading sector:$" ,{KjVv<
msg1 db 0dh, "Writing sector:$" k3:8T#N>!O
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 9!aQ@ J^
$
N7J:Q
dsp db " $" 4^? J BpBZ
'yrU_k,h
;DAP GQU9UXe
PacketSize db 16d; // 数据包尺寸(16字节) Dg:2*m_!j{
Reserved db 0; // ==0 MV+S.`R
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ;p$KM-?2D
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) >_ )~"Ra
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 !a(#G7zA
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 Y~R['u,
IV#kF}9
$
;定位用DAP (复位到0磁道) dcK7Dd->
DAP0 db 16d g%Yw Dr=0t
db 0 GpW5)a
dw 1 )isJ^ *6y
buff1 dw 0,0 Obd};&6Q
dw 0,0,0,0 vai.w-}Z
i/Nd
ZO^Y9\L
;DiskParameters 8Gw0;Uu8D
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) uU7s4oJ|
falgs dw 0; WORD Flags; // 信息标志 *58`}]
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 4sj:%%UE
Heads DW 0; DWORD Heads; // 磁盘磁头数 h3 Bs
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 5)}3C_pmW
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ~-1!?t/%
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) CB76
X={n9*Sd8
cmpsect dw 0 pO2Y'1*
}!^/<|$=
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" d|nJp-%V
msgHds db 0dh,0a,"Heads:$" jl!rCOLt4
msgspt db 0dh, 0a,"SectorsPerTrack:$" 7<'4WHi;@s
msgTotal db 0d,0a, "Total Sectors:$" _t9@
vVQ
msgSS db 0dh,0a, "Sector Size:$" e-}b]\
:RYh@.
msgReadErr db 0dh,0a,"Error Reading Sectors:$" )v4?+$g
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" %Q)3*L
msgReset db 0dh,0a, "Reseting drive to Cyl 0" m/2LwN
a0s6G3J+9
>9h@Dj[|!
buffer db 32768d dup(0); (3H'!P7|~
_A8x{[$
data ends ;数据段结尾 3,7SGt
r
[CCj5N1/
stack segment 3I rmDT
db 400 dup(?) 0Q2P"1>KT/
stack ends zsQhydTR
*2$I,
~(P
code segment ;定义代码段 |'C{nTX
assume cs:code ;规定cs的内容 0cd`. ZF
assume ds:data ;规定ds的内容 p
=tj>{
assume ss:stack 3L;GfYr0
'CTvKW
start: 2J^jSgr50d
pusha 4bT21J37
s@WF[S7D
]A;{D~X^w
mov ax,data ;程序从start开始 [c{/0*
mov ds,ax ;ds置初值,data的段地址 >o#5tNm
o0f{ePZ=
;设置缓冲区 -ZmccT" 8
lea bx, buffer \~3g*V
mov bufferaddr,bx n+C,v
.X
mov buff1,bx ~6:<OdQ
mov bx,ds ~"oxytJ
mov bufferaddr+2,bx 3C=|
mov buff1,bx eyx;8v cM
W6b5elH@
lea di,infosize U\_-GS;1
mov dl,80h rPk=9I
mov ah,48h ]3+xJz~=
int 13h H;&^A5
qyfw$$X
lea bx,msgcyl 5CSihw/5
mov dx,bx _N.N?>
mov ah,09 ?1r>t"e5
int 21h i2PPVT
mov dx,cylinders
>&1MD}
call dispdx O<@S,/Q4
hXvg<Rf
lea bx,msghds kF09t5Lr
mov dx,bx UR/lM,N;
mov ah,09 m{U+aqAQK
int 21h "y %S.ipWG
mov dx,heads U~,~ GU=X
call dispdx
^'UJ&UfX
$
LS$:%i4
lea bx,msgspt J9tQ@3{f
mov dx,bx r%*UU4xvB
mov ah,09 fgb%SIi?
int 21h AWp{n
mov dx,spt+2 ]cz*k/*0
call dispdx o6 FSSKM
mov dx,spt *?k~n9n5U
call dispdx /Dn,;@ZwAi
oGK 1D
lea bx,msgtotal ?A[q/n:K
mov dx,bx lP4A?J+Q
mov ah,09 7TTU&7l~
int 21h YKjm_)8]w
lea bx,sectors r A/jNX@S
call dispqword xB1Oh+@i
:r<uH6x|
lea bx,msgss Ha U6`IP
mov dx,bx [OH9/"
mov ah,09 M_o<6C
int 21h '>GZB
mov dx,sectorsize s|Hrb_[;l
call dispdx qR
D]Q
LK
"47
sbb word ptr sectors, 63d (s/hK
jnc subok DI P(
sub word ptr sectors+2,1 wKjL}1.k
jnc subok XJ3 5Z+M
sub word ptr sectors+4,1 t@a2@dX|
jnc subok rtl|zCst
sub word ptr sectors+6,1 U!GG8;4
ZDmBuf
q
subok: ]F,mj-?4x
:{iS0qJ
^%^~:<N
X[ERlw1q4Q
xor ax,ax }CR@XD}[
mov blocknumL, ax i
+I%]
mov blocknumL+2, ax CS:"F) at
mov blocknumL+4, ax XO*|P\#^
mov blocknumL+6, ax rek89.p
a88(,:t
startread: {b|:q>Be8
A4}6hG#
call rwsect B2QC#R
REyk,s2"6
adc word ptr blocknuml,63d sqAZjf
y@
jnc addok {X=gjQ9
adc word ptr blocknuml+2,1 B&l5yI
b
jnc addok _uvRC+~R
adc word ptr blocknuml+4,1 {x3"/sF
jnc addok
aY^_+&&G
adc word ptr blocknuml+6,1 vJX3fE}F
jnc addok 1-@[th
;C1
]gJZ,
addok: {Z>OAR#
mov ax, word ptr sectors+6 E!d;ym
cmp ax, blocknuml+6 &cty&(2p
jg complete 8 |2QJ
jl startread Ig&=(Kmr
mov ax, word ptr sectors+4 F_m[EB
cmp ax, blocknuml+4 ;QT.|.t6
jg complete O-rHfIxY
jl startread 3SRz14/W_R
mov ax, word ptr sectors+2 &