第一个宏汇编程序 uXGAcUx(
oC!z+<
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 4Dd]:2|D
*L<<S=g$2
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! &$pQ Jf
O+DYh=m*p
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! ob)c0Pz
EUPc+D3
比较长啊!所以可以自动跳过。 PC,I"l
a}k5[)et
.286 T%TO?[cN
.radix 16 &6\E'bBt
data segment ;定义数据段 3P'Wk|j
)5diX
+
k
_4lKd`
msg db 0dh, "Reading sector:$" |t58n{V.O
msg1 db 0dh, "Writing sector:$" /dR:\ffz2
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" @C~gU@F
(x[z=_I%`
dsp db " $" i Hcy,PBD
2-#&ktM%V
;DAP ]*rK;
PacketSize db 16d; // 数据包尺寸(16字节) 6099w0fR`
Reserved db 0; // ==0 Jjx1`S*i
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) >bw q
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) #("E)P
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 {|q(4(f"Iu
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 ,G$<J0R1
~P-^An^
;定位用DAP (复位到0磁道) %:-2P
DAP0 db 16d DnB :~&Dw
db 0 uH
} }z !
dw 1 dP/1E6*m
buff1 dw 0,0 0bQ"s*K
dw 0,0,0,0 .T~Oc'wGo
99Nm? $g
K>2 Bz&)
;DiskParameters I^``x+a
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) SQG9m2
falgs dw 0; WORD Flags; // 信息标志 ge&!GO
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 %$R]NL|
Heads DW 0; DWORD Heads; // 磁盘磁头数 oH
e
thk
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 p"Di;3!y!
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 CY@#_z
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) SUoUXh^!w
Is (
Ji
cmpsect dw 0 #.@D}7y5
R36A_
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" Q"GZh.m
msgHds db 0dh,0a,"Heads:$" .Ax]SNZ+:A
msgspt db 0dh, 0a,"SectorsPerTrack:$" [-=y*lx%g
msgTotal db 0d,0a, "Total Sectors:$" R8,
g^N
msgSS db 0dh,0a, "Sector Size:$"
}K 2fwE
u-wj\BU
msgReadErr db 0dh,0a,"Error Reading Sectors:$" N<HJ}geC"
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" W_]onq6
msgReset db 0dh,0a, "Reseting drive to Cyl 0" #/>OW2Ny
[:{HX U7y
{9./-
buffer db 32768d dup(0); eyByAT~W,
Y)C!N$=@Q
data ends ;数据段结尾 H$3:Ra+ S
0ol*!@?
stack segment ~5~Cpu2v7
db 400 dup(?) D'_w
*
stack ends ?$H=n{iW
_$gP-J
code segment ;定义代码段 HAcC& s8
assume cs:code ;规定cs的内容 yzL6oU-{&
assume ds:data ;规定ds的内容 P[gYENQ
assume ss:stack jQ P2[\
Gl>*e|}
start: T$Rf
pusha 8/CK(G
#<R6!"TNoz
Vfr.Yoy
mov ax,data ;程序从start开始 WSx0o}
mov ds,ax ;ds置初值,data的段地址 E$5A
1
FlLk.+!t
;设置缓冲区 Up1e4mNL
lea bx, buffer Sh U1RQk
mov bufferaddr,bx v==/tr)
mov buff1,bx =?1B|hdo
mov bx,ds K|wB0TiXP
mov bufferaddr+2,bx gp]T.ol
mov buff1,bx GaOM|F'>
ff2`4_,|
lea di,infosize yT C+5_7
mov dl,80h -=4:qQEw
mov ah,48h Wtj*Z.=:
int 13h ,D{D
QJ(B
_VLA2#V>
lea bx,msgcyl `mDCX
mov dx,bx *)qxrBc0
mov ah,09 c"S{5xh0&
int 21h /V E|F Ts
mov dx,cylinders >+ku:<Hw%.
call dispdx z~RE}k
J4m2|HK
lea bx,msghds k :`yxxYIh
mov dx,bx u'"]{.K>fb
mov ah,09 {bO
O?pp
int 21h `z6I][Uf
mov dx,heads
Sk%*Zo{|
call dispdx jtQ}
Uf\U~wM<
lea bx,msgspt Au{J/G<W@
mov dx,bx lemUUl(^
mov ah,09 2Afg.-7EP
int 21h Ou2p^:C(
mov dx,spt+2 P^m&oH5]EG
call dispdx !s[[X5
mov dx,spt K\^S>dV
call dispdx d`J~w/]
`\
#HmZe98[%
lea bx,msgtotal @@#h-k%k-
mov dx,bx ee
.,D
mov ah,09 bm-&H
int 21h L<ET"&b;4
lea bx,sectors yo!Y%9
call dispqword /NFm6AA]
)s>R~7
lea bx,msgss (Ujry =f
mov dx,bx Pb
l#ieZM
mov ah,09 8@d@T V!n&
int 21h yey]#M[y
mov dx,sectorsize ->a|
call dispdx ")eY{C
G Y+li{
sbb word ptr sectors, 63d \~I>@SG2W+
jnc subok #b$qtp!,
sub word ptr sectors+2,1 %. W56
jnc subok +Z=DvKsT
J
sub word ptr sectors+4,1 AkVgFQg"
n
jnc subok D Ax1
sub word ptr sectors+6,1 fnJt8Y4
Q-y`IPtA<
subok: &O^t]7
]YKxJ''u
jF0>wm
. MH;u3U
xor ax,ax A\)~y{9bQ
mov blocknumL, ax e#z#bz2<
mov blocknumL+2, ax -5#cfi4^*
mov blocknumL+4, ax T8>aU
mov blocknumL+6, ax b_a
6|
NWII?X#T}
startread: ?=V;5H.
NbUbLzE
call rwsect 4>(rskl_
x5eSPF1
adc word ptr blocknuml,63d K5}0!_)G
jnc addok
:r}C&3
adc word ptr blocknuml+2,1 i^"!"&tW#
jnc addok
#=
@?)\~
adc word ptr blocknuml+4,1 @k||gQqIB
jnc addok E{{Kzr2$
adc word ptr blocknuml+6,1 ;><m[ l6
jnc addok U,7}VdO
Mk!bmFZOZ
addok: ^_\%?K_u
mov ax, word ptr sectors+6 ygYy [IZ
cmp ax, blocknuml+6 ;]^% 6B n
jg complete !p{CsR8c
jl startread L4or*C^3
mov ax, word ptr sectors+4 n|eM}ymF+
cmp ax, blocknuml+4 Gm-V/[29R
jg complete \U.js-
jl startread cSYMnB
mov ax, word ptr sectors+2 ZP9x3MHe
cmp ax, blocknuml+2 7(C:ty9
jg complete tYCVVs`?
jl startread 9G^gI}bY
mov ax, word ptr sectors V$3`y=8
cmp ax, blocknuml 9i+`,r
jg complete (W+aeB0
jl startread _[$,WuG1
W7"Uh
M
complete: ,#K{+1z:
!AN;
lea bx,msgready N}KL'
mov dx,bx 5Tq*]ZE
mov ah,09 |X;|=.
int 21 )F,z pGG
:r9<wbr)k0
popa e$o]f"(
mov ax,3100h %'.3t|zH
int 21h J7+[+Y
&6nLnMF8x
; I
*H($ a
dispdx proc near W}@IUCRs
pusha #O^%u,mJj
lea bx, dsp+3 du_~P"[
mov cx,4 Tb}op XYK
1x^Vv;K
repeat0: f-Zi!AGh>
mov al,dl %#C9E kr
and al,0fh i7%`
}t
cmp al,09h vF1Fcp.@
jg add40 1h?QEZ,6a
add al, 30h 8T88
jmp okadd z['2
add40: VE?Aa
add al,37h j%=X
ps
okadd: "D'"uMS`H
mov byte ptr [bx],al ^o4](l
dec bx Tb\<e3Te_
shr dx,4 USZB
k0$
loopnz repeat0 "<&) G{
lea bx,dsp S
^$!n,
mov dx,bx +`uNO<$~f
mov ah,09h @;}vK=6L
int 21h kO4'|<
@W-0ybv
popa D.gD4g_O/
ret w>\_d
dispdx endp m}6Jdt'|
Sm;@MI<@/
dispqword proc near q1
Mt5O}
pusha UT0}Ce>e
mov cx ,4 5}Z>N,4
add bx,6 WV}H
N
repeatdecbx: l
cK4 Uq\q
mov dx,[bx] fNz(z\
call dispdx V&7NN=
sub bx,2 ehTv@2b
loopnz repeatdecbx p4D.nB8
popa "EwzuM8f
ret iw%""q(`
dispqword endp m"!Q5[
ZmmX_!M
rwsect proc near h.q9p!
w@pJ49
lea bx,msg aNP\Q23D
mov dx,bx J vq)%t8q>
mov ah,09h l2ie\4dK@
int 21h _{$<s[S
Z"$iB-]
lea bx,BlockNumL )YW"Zo8~!1
call dispqword
9 !$&1|,*
[:+f Y[4==
lea di, packetsize i6<uj
mov dl,80h 3!{Tw6A8(
mov ah,42h `\GRY @cg
int 13h 6sG5n7E-A
jnc readok <<R2
X1
5+yy:#J]
mov cx,5 #4
<=Ira5
;出错后重试(定位0道后再重读) g'cVsO)S
retryrd: NS-0-o|4#
lea bx, msgReadErr RAWzQE}
mov dx,bx d:"7Tw2v+
mov ah,09 )!~,xl^j{}
int 21h \>||
I51I(QF=
EvH/d4V;
lea di,dap0 b[<L
l%K
mov dl,80h dh9@3. t
mov ah,44h F)4I70vG
int 13h
~t n$AtK
gegM&Xo
lea bx,BlockNumL sR/y|
call dispqword E1SWZ&';
=J|jCK[r
lea di, packetsize EP^qj j@M
mov dl,80h }B_?7+
mov ah,42h q;*'V9#
int 13h d"L(eI}G
jnc readok 4U~'Oa@p
loopnz retryrd 31UxYBY
oW^>J-
readok: Lp/'-Y_
lea di, packetsize hu.p;A3p;
mov dl,80h A1r%cs
mov ah,43h ;e.8EL
int 13h 2|ej~}Y
z?pi/`y8>
rwsect endp wY ??#pS
Kp^"<%RT
code ends ;代码段结尾 5h |aX
end start ;结束汇编 ;"Aj80
-*Tf.c