第一个宏汇编程序 V4
i%|vV
R3!vS+5rR
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 /Gv$1t^a
~acK
$
.#
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! I\6<)2j/L
aZCT|M1
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! tNf" X!
:mHtK)z~
比较长啊!所以可以自动跳过。 t4c
#' y
?{P6AF-xcf
.286 +&8Ud8Q
.radix 16 =]mx"0i[
data segment ;定义数据段 Q3{&'|}^2
->9xw
Ck a]F2,
msg db 0dh, "Reading sector:$" Qi]Z)v{^
msg1 db 0dh, "Writing sector:$" Nn7@+g)
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" L;t~rW!1
6
&Aa b56
dsp db " $" T FA
k_^/
;DAP g-gBg\y{v
PacketSize db 16d; // 数据包尺寸(16字节) P&`r87J
Reserved db 0; // ==0 %~(i[Ur;
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) l5nDt$Ex
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) [MP:Eeg
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 oi4Wxcj
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 [)0 k}
g*imswj7
;定位用DAP (复位到0磁道) 'm? x2$u8
DAP0 db 16d exKmK!FT
db 0 x#VUEu]8
dw 1 u`2k6.-
buff1 dw 0,0 v!9Imf
dw 0,0,0,0 '*Mb
.s"
__%E!*m"<_
9
+Hb`
;DiskParameters JJ3JULL2
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 5VoiDM=\c
falgs dw 0; WORD Flags; // 信息标志 myX0<j3G5
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 yC*B OJS
Heads DW 0; DWORD Heads; // 磁盘磁头数 wz)9/bL
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 5&Kn #
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 'yjH~F.
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) eyjUNHeh#
(uc)^l
fX
cmpsect dw 0 r:rJv
p+D6Z'B
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" ;@s~t:u
msgHds db 0dh,0a,"Heads:$" |^{" 2l"j
msgspt db 0dh, 0a,"SectorsPerTrack:$" Ou,_l
msgTotal db 0d,0a, "Total Sectors:$" TN_$E&69I
msgSS db 0dh,0a, "Sector Size:$" -{SiK
|CqJ2
msgReadErr db 0dh,0a,"Error Reading Sectors:$" d+ko"F|
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" L
umD.3<
msgReset db 0dh,0a, "Reseting drive to Cyl 0" -)+DVG.t
{
S(T1ua
<&Xq`i/(
buffer db 32768d dup(0); <s3(
7V``f:#d
data ends ;数据段结尾 Dx)XC?'xO
9?,.zc^
stack segment *lF%8k"Al
db 400 dup(?) m6<0 hP
stack ends U {!{5l:
Q8:
ocEhR
code segment ;定义代码段 fOervo
assume cs:code ;规定cs的内容 ]arskmB]
assume ds:data ;规定ds的内容 g$LwXfg
assume ss:stack ,X6j$YLWp
@&yj7-]
start: }Cg~::,"
pusha oF^hq-xcP
agD.J)v\
I
omJo
mov ax,data ;程序从start开始 cBf{R^>Fd
mov ds,ax ;ds置初值,data的段地址 Q
kpmPQK
kovzB]
;设置缓冲区 _oVA0@#n
lea bx, buffer a/#,Y<kJ
mov bufferaddr,bx ha~s<
I
mov buff1,bx =@
mov bx,ds BQg]$Tr?
mov bufferaddr+2,bx shZ<j7gqI
mov buff1,bx N\&;R$[9:
@!O{>`
lea di,infosize MoHvXp;X
mov dl,80h xhS/X3<th
mov ah,48h |:[vpJFK
int 13h )KQum`pO
zD-8#H35X"
lea bx,msgcyl >AFp
O*q"
mov dx,bx Ih"
Ol(W
mov ah,09 'A2"&6m)28
int 21h U#
B
mov dx,cylinders rcT<OiYuig
call dispdx VbR.tz
e[!>ezaIY
lea bx,msghds u)pBFs
<dn
mov dx,bx KIJ[ cIw
mov ah,09 )>p6h]]a
int 21h AFED YRX
mov dx,heads ;d40:q<
call dispdx }iAi`_\0;
&N ;6G`3
lea bx,msgspt c Zr4
mov dx,bx itvdzPO
mov ah,09 _"V0vV
int 21h KZNyp%q
mov dx,spt+2 rd{(E
call dispdx &0`7_g7G
mov dx,spt s&</zU'
call dispdx X_l,fu^C#$
UC@ "<$'C
lea bx,msgtotal $0t
%}DE
mov dx,bx
(5_(s`q.
mov ah,09 [NcOk,
int 21h g2q=&eI"
lea bx,sectors t57b)5{FM
call dispqword 9Z
4R!Q
(J*0/7
eX
lea bx,msgss s'I$yJ)@2E
mov dx,bx XU7bWafy
mov ah,09 ] plC
int 21h V.1sZYA9
mov dx,sectorsize q4=RE
call dispdx 8{u01\0}
p6)UR~9Rs
sbb word ptr sectors, 63d -AQX-[B
jnc subok k#n=mm'N9
sub word ptr sectors+2,1 A[bxxQSP\H
jnc subok X9HI@M]h
sub word ptr sectors+4,1 XQ8Imkc
jnc subok dz 2d`=`3
sub word ptr sectors+6,1 pnU
g:R@
R&0l4g-4>
subok: lR!$+atW
9n7d
"XD2
2Oa-c|F
,L G&sa"
xor ax,ax B"v=Fr[
mov blocknumL, ax *93 N0m4Rl
mov blocknumL+2, ax M-g
jS6c\3
mov blocknumL+4, ax 8 Hn{CJ~'
mov blocknumL+6, ax 9n'p 7(s%
u'p J9>sC
startread: k~ue^^r}
3F1Z$d(
call rwsect Y)`+u#`
R
%*nZ,r
adc word ptr blocknuml,63d ND>}t#^$
jnc addok }^q#0`e(y
adc word ptr blocknuml+2,1 p'*UM%@SIY
jnc addok 0*^Fk=>ej
adc word ptr blocknuml+4,1 |z%,W/Ef
jnc addok :83"t-O8[
adc word ptr blocknuml+6,1 n21J7;\/+
jnc addok Zpmy)W]1
D~:fn|/Brp
addok: e)kf;Hkf
mov ax, word ptr sectors+6 Apn#o2
cmp ax, blocknuml+6 8h97~$7)
jg complete 9@06]EI_
jl startread )EoG@:[
mov ax, word ptr sectors+4 9':$!Eoq
cmp ax, blocknuml+4
f/ZE_MN2
jg complete ~7
TzUb
jl startread KX`,7-
mov ax, word ptr sectors+2 }UrtDXhA
cmp ax, blocknuml+2 *$
!LRmp?
jg complete |.A>0-']M
jl startread "K<