第一个宏汇编程序 MD,BGO?C
d$?+>t/
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 i-dosY`81
@KZW*-"
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! XQ}7.u!
JZ-64OT
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 3k8.5W
wp4
.~E
比较长啊!所以可以自动跳过。 qk0cf~gz
la$%%@0/
.286 ;\j'~AyCn
.radix 16 "(';UFa
data segment ;定义数据段 c5i7mx:.
g0;6}n
^HI2Vp
msg db 0dh, "Reading sector:$" 3qV\XC+
msg1 db 0dh, "Writing sector:$" Gs04)KJm<
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" G1ruF8
9uX15a
dsp db " $" /~+Fzz
{ W5
_KX
;DAP RcO.1@2
PacketSize db 16d; // 数据包尺寸(16字节)
nI+.De~
Reserved db 0; // ==0 u-V(
2?
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) u'Hh||La"
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) V^}
$f3\B
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 f&
] !;)
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 n 4H'FZ
~yS
sv
;定位用DAP (复位到0磁道) .=hVto[QC
DAP0 db 16d ;LKYA?=/V
db 0 j``Ku@/x0
dw 1 $V/Ke
buff1 dw 0,0 rO/Sj<0^
dw 0,0,0,0 u
`!Dp$P
*$1F|G
Uhyf
;DiskParameters 8e`HXU(A
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) yRQNmR;Uy
falgs dw 0; WORD Flags; // 信息标志 @XcrHnH9
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 k%s,(2)30
Heads DW 0; DWORD Heads; // 磁盘磁头数 [w+1<ou;j
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 hOdU%
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ;oVOq$ql
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) Q!7mN?l
TKEcbGhy
cmpsect dw 0 ?D_}',Wx
sULsU t#
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" }ZiJHj'<
msgHds db 0dh,0a,"Heads:$" yy3`E}vX7
msgspt db 0dh, 0a,"SectorsPerTrack:$" }XCh>LvX
msgTotal db 0d,0a, "Total Sectors:$" Q yQ[H
msgSS db 0dh,0a, "Sector Size:$" 9u3P>a~b
/Vx
EqIK
msgReadErr db 0dh,0a,"Error Reading Sectors:$" C}9|e?R[Rz
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 2%H_%Zu9
msgReset db 0dh,0a, "Reseting drive to Cyl 0" N\CHIsVm>
.I^Y[_.G
sY]
pszjT
buffer db 32768d dup(0); Mdu\ci)lr
?PV@WrU>B
data ends ;数据段结尾 ~1S,[5u|s
BcQw-<veu
stack segment t[G7&ovj
db 400 dup(?) mFd|JbW
stack ends PklJU:Pu\U
:)+)L@By
code segment ;定义代码段 AF{@lDa1h
assume cs:code ;规定cs的内容 5.kKg=a
assume ds:data ;规定ds的内容 uY3#,
assume ss:stack YnCuF
0>
iI*qx+>f?
start: Ms+SJ5Lg
pusha :x?G[x=
#TeAw<2U
6eNBld P!
mov ax,data ;程序从start开始 ,1vFX$
mov ds,ax ;ds置初值,data的段地址 rQPO+
3u;0,:X&
;设置缓冲区 r& :v(
lea bx, buffer '68#7Hs.
mov bufferaddr,bx s)sT\crP@
mov buff1,bx kmu7~&75
mov bx,ds ;L%\[H>G
mov bufferaddr+2,bx Z 2$S'}F
mov buff1,bx D@@"w+
cBCC/n
lea di,infosize Jt?`
(H
mov dl,80h vrvi]
Y8
mov ah,48h byZj7q5&Q
int 13h k#p6QAhS
kpQN>XV#
lea bx,msgcyl m YhDi
mov dx,bx A43[i@o
mov ah,09 ?]TtUoY=)F
int 21h FEV Ya#S
mov dx,cylinders
\vW'\}
call dispdx D<*)^^
v
|3mbApv
lea bx,msghds /}5)[9GC
mov dx,bx ,}Im^~5
mov ah,09 -Gm}i8;
int 21h ]^@m $O
mov dx,heads #!r>3
W&
call dispdx %PK
(Z*>
VZ9`Kbu
lea bx,msgspt CXi:?6OG
mov dx,bx 4#ifm#
mov ah,09 b,(<74!#8
int 21h )|Ka'\xr
mov dx,spt+2 DKl\N~{F
call dispdx .9<euPrz
mov dx,spt [Qqs
s8a
call dispdx /<o?T{z<-
]XYD2fR2qA
lea bx,msgtotal ,z+n@sUR:
mov dx,bx aq(i^d
mov ah,09 w`zS`+4
int 21h K_qA[n
lea bx,sectors xBqZ:
BQ
call dispqword }5B\:*yW
91k-os(4]
lea bx,msgss G^/8^Zi
mov dx,bx gf/<sH2}
mov ah,09 tC7 4=
int 21h C7&L9k~jf
mov dx,sectorsize /\E3p6\*
call dispdx tS,AS,vy]
#X?E#^6?E
sbb word ptr sectors, 63d =%b1EYk
jnc subok > aCY
sub word ptr sectors+2,1 N4WX}
jnc subok u|Ng>lU
sub word ptr sectors+4,1 (Q.I DDlr
jnc subok e_1L J
sub word ptr sectors+6,1 \GGyz{i
l
o-
42)
subok: 1XHE:0!dQ
;9vY5CxzC
~O3VX75f
vOtILL6
xor ax,ax @CC
6`D
mov blocknumL, ax N#X*
0i"
mov blocknumL+2, ax %V#? 1{
mov blocknumL+4, ax _) UnH
p_^
mov blocknumL+6, ax @U =~c9
Nlu]f-i':
startread: $vnx)#r3
=}SL
QdT
call rwsect r[2*K 9
P|;f>*^Y
adc word ptr blocknuml,63d W/%9=g$m
jnc addok F-D$Y?m
adc word ptr blocknuml+2,1 shVEAT'`
jnc addok ~!/a gLwY
adc word ptr blocknuml+4,1 D\pX@Sx,v[
jnc addok 7De BeY
adc word ptr blocknuml+6,1 ]tmMk7
jnc addok t
^1uj:vD
+.xK`_[M
addok: "R%
RI(
y{
mov ax, word ptr sectors+6 xb&,9Lxd|
cmp ax, blocknuml+6 $3eoZ1q'U-
jg complete $ao7p
vU6
jl startread q3GkfgY
mov ax, word ptr sectors+4 [-R[rF
cmp ax, blocknuml+4 C!Fi &~
jg complete ]Z[0xs
jl startread >U]KPL[%
mov ax, word ptr sectors+2 Z[1|('
cmp ax, blocknuml+2 bj?=
\u
jg complete k#8E9/t@
jl startread J!@R0U.
mov ax, word ptr sectors (Hs,Tj
cmp ax, blocknuml w)/~Gn676
jg complete a!
;#u8f
jl startread QEF$Jx
i\o * =+{r
complete: 7(<r4{1?
`9|Uu#x
lea bx,msgready 6 8Vxy
mov dx,bx /2$d'e
mov ah,09 zV"'-iP
int 21 =pnQ?2Og
pLMaXX~4_
popa &@D\4b,?nm
mov ax,3100h p.x2R,CU
int 21h gYmO4/c,
"#w%sG^_
; d$n<^~Z
dispdx proc near SES-a Mi3
pusha gq}c
lea bx, dsp+3 Nema>T]
mov cx,4 !y$+RA7\
H,LJ$
py
repeat0: :_o^oi7G
mov al,dl <%=<9~e
and al,0fh C8}
;,
cmp al,09h qga?-oz,<6
jg add40 \\`(x:\
add al, 30h bfK4ps}m*
jmp okadd r,P`$-
add40: Xv 7
noq|
add al,37h FRayB VHL
okadd: *thm)Mn
mov byte ptr [bx],al mR8tW"Z2
dec bx Fn{Pmo*rs
shr dx,4 @Z<Z//^k
loopnz repeat0 /.sho\a
lea bx,dsp U7-*]i k
mov dx,bx vr_Z0]4`C9
mov ah,09h X-psao0tI`
int 21h 2_)gJ_kP
6<f(Zv? I
popa 6Q]JY,+
ret ? ^`fPH=
dispdx endp U+!&~C^y
6LabFX@{&
dispqword proc near r5NH*\Q
pusha *0<)PJ T
mov cx ,4 t8*NldC
add bx,6 Fj"/jdM
repeatdecbx: &+yoPF
mov dx,[bx] EIPX q
call dispdx |ZOdfr4uW
sub bx,2 y8}
/e@&
loopnz repeatdecbx v
<OZ
#
L$
popa eAG)+b
ret XcL%0%`
dispqword endp D?4bp'0 3
as[! 9tB]
rwsect proc near `^h:}V
\=o0MR
lea bx,msg {*K$gH$
mov dx,bx T*'WS!z
mov ah,09h a TPq1u
int 21h f{P?|8u
4I*'(6
,!
lea bx,BlockNumL o1uM(
call dispqword <*oV-A
@R (Op|9
lea di, packetsize @\W-=YKLg
mov dl,80h z:u)@>6D1
mov ah,42h 0!tuUn
int 13h YoWXHg!U
jnc readok d;{k,rP6
@7{.err!
mov cx,5 ^@Z8_PZo
;出错后重试(定位0道后再重读) ^|2m&2
retryrd: f85~[3
J
lea bx, msgReadErr n+ k,:O5
mov dx,bx L<6nM
;d
mov ah,09 F&
int 21h pX1Us+%
)c532
y
+ f:!9)C
lea di,dap0 QXgfj
o
mov dl,80h ,RP 9v*
mov ah,44h d$Y_vX<
int 13h (;-_j/
v 7%}ey[
lea bx,BlockNumL )UyJ.!Fly
call dispqword ,T;D33XV
*eI {g
lea di, packetsize 4
=T_h`
mov dl,80h DgB;6Wl
mov ah,42h _/Ay$l;F
int 13h U\M9
sTqo
jnc readok s^Xs*T@~h
loopnz retryrd 9mjJC
YGRb|P-
readok: 4vCUVo r
lea di, packetsize .}:*tvot
mov dl,80h d1'= \PYr
mov ah,43h [ 6Sk>j
int 13h U} w@,6
{CNJlr@z
rwsect endp '%o^#gJ p
6?[SlPPE1
code ends ;代码段结尾 >7~,w1t
end start ;结束汇编 9~jS_Y)"
-<M+ $hK\