第一个宏汇编程序 0jt@|3
b!qlucAeE
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 LRR)T: e}q
7NkMr8[}F
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! PPde!}T$
,0eXg
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! sJMpF8
!ScEA=
比较长啊!所以可以自动跳过。 ^O& y;5
y!T8(
.286 1'H!S%fS
.radix 16 'Hsd7Dpi}
data segment ;定义数据段 R5xV_;wD
G!Yt.M0
y+
4#Iy
msg db 0dh, "Reading sector:$" %I;uqf
msg1 db 0dh, "Writing sector:$" o$ #q/L
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" }l&y8,[:
Bkg./iP5x
dsp db " $" I#'yy7J
!{CaW4
;DAP +R_s(2vz
PacketSize db 16d; // 数据包尺寸(16字节) BKV:U\QZ
Reserved db 0; // ==0 <Ira~N
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) *xN?5u%
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ';m;K
(g
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 |Yv,zEY)
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 :kC*<f\
@O|
`r(le
;定位用DAP (复位到0磁道) 2Vs+8/
DAP0 db 16d o(C;;C(*{
db 0 f?TS#jG4}
dw 1
.hjN*4RY
buff1 dw 0,0 S
0ReT*I
dw 0,0,0,0 &[
,*
tYG6Gl
|xT'+~u
;DiskParameters !DD4Bqez
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 2J (nJT"
falgs dw 0; WORD Flags; // 信息标志 hW` o-'
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 S263h(H
Heads DW 0; DWORD Heads; // 磁盘磁头数 fNV-_^,R9
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ]TN/n%\
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ;M"[dy`dY
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) o*3\xg
2Z ?l,M~
cmpsect dw 0 yH9&HFDp
"-\8Y>E
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" j8%Y[:~D
msgHds db 0dh,0a,"Heads:$" $RYOj{1
msgspt db 0dh, 0a,"SectorsPerTrack:$" 5lyHg{iqD
msgTotal db 0d,0a, "Total Sectors:$" ?@<Tzk]a.
msgSS db 0dh,0a, "Sector Size:$" FH{p1_kZ=
]G^9PZ-
msgReadErr db 0dh,0a,"Error Reading Sectors:$" &x$
ps
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" sq@c?!'
msgReset db 0dh,0a, "Reseting drive to Cyl 0" GcG$>&,
^O}J',Fm%f
Z*IW*f&0>1
buffer db 32768d dup(0); Cq[Hh#q
1k`gr&S
data ends ;数据段结尾 %r&36d'
1@9M[_<n5
stack segment 2cwJ);Eg2
db 400 dup(?) >*\yEH9"
stack ends tBETNt7
5=b6B=\*~
code segment ;定义代码段 nW`] =
assume cs:code ;规定cs的内容 h+S]C#X,}
assume ds:data ;规定ds的内容 ?J-D6;
assume ss:stack |pBvy1e4)
1~E;@eK'
start: +|H,N7a<
pusha :(4q\~
_UY=y^ c0>
.*Bd'\:F/q
mov ax,data ;程序从start开始 ?X Rl\V
mov ds,ax ;ds置初值,data的段地址
,t!I%r
J ~KygQ3%
;设置缓冲区 R+2~%|{d
lea bx, buffer !3{.
V\
P)
mov bufferaddr,bx KL*+gq0k
mov buff1,bx 24sQon
mov bx,ds u>:j$@56
mov bufferaddr+2,bx i(*fv(z
mov buff1,bx s<oT,SPt
a5&[O
lea di,infosize N,.awA{
mov dl,80h cH
5RpeP
mov ah,48h ^gkKk&~A5?
int 13h -J0OtrZ
]=59_bkD:s
lea bx,msgcyl 5=Y(.}6
mov dx,bx D&pp
<
mov ah,09 yZ]?-7
int 21h pD
}b $
mov dx,cylinders "'XYW\bI
call dispdx g?K? Fn.}
~qXwQ@
lea bx,msghds ":qS9vW
mov dx,bx PR*EyM[T
mov ah,09 $ab{GxmX'4
int 21h QU(Lv(/O
mov dx,heads u$X =2u:P
call dispdx phB d+zQc
HBs
6:[q
lea bx,msgspt YN~1.!F
mov dx,bx 93ggCOaYA
mov ah,09 ,1]VY/
int 21h 1^ iLs
mov dx,spt+2 )|#ExyRO
call dispdx ",' Zr<T
mov dx,spt 1~j,A[&|<
call dispdx ]:m4~0^#-(
@jq H8
lea bx,msgtotal 1bHQB$%z
mov dx,bx Kjpsz] ;
mov ah,09 rV2>;FG
int 21h tgHN\@yj
lea bx,sectors D_G]W
W8
call dispqword m)]|mYjju
a54S,}|
lea bx,msgss F%4N/e'L
mov dx,bx Pn L?zae
mov ah,09 mX, @yCI
int 21h G&`5o*).bb
mov dx,sectorsize :Zo^Uc:*w
call dispdx EfkBo5@ Qi
?j)#\s2
sbb word ptr sectors, 63d eR/X9<
jnc subok v- p8~u1N
sub word ptr sectors+2,1 kWs:7jiiu
jnc subok :a:m>S<~
sub word ptr sectors+4,1 RRzLQ7J
jnc subok cVYu(ssC4
sub word ptr sectors+6,1 *}_i[6_\E
ad9u;uS
subok: 6q7jI
)l
%IDl+
_j
;bL?uL
/iJsa&W}
xor ax,ax 'Mhnu2d
mov blocknumL, ax ~}SQLYy7Z
mov blocknumL+2, ax ?}S!8;d
mov blocknumL+4, ax = )4bf"~8
mov blocknumL+6, ax T
'9M
qk>M~,
startread: Cv/3-&5S
c(Fo-4K
call rwsect /<dl"PWkJv
!3o/c w9
adc word ptr blocknuml,63d
OAEa+V
jnc addok P7REE_<1
adc word ptr blocknuml+2,1 EW3--33s
jnc addok b,'rz04^
adc word ptr blocknuml+4,1 ca,c+5
jnc addok y)TBg8Q
adc word ptr blocknuml+6,1 Hl*#iUq
jnc addok 6zi
Mf
}WF6w+
addok: ABL5T-*]
mov ax, word ptr sectors+6 v[R_6
cmp ax, blocknuml+6 l{VJaZ $M
jg complete \jS^+Xf?^
jl startread lwo,D}
mov ax, word ptr sectors+4 #-{ljjMQI
cmp ax, blocknuml+4 s?fEorG
jg complete SRU#Y8Xv|
jl startread 85Kf>z::c
mov ax, word ptr sectors+2 wo$ F_!3u
cmp ax, blocknuml+2 W .Al\!Gi
jg complete AgB$
w4
jl startread Ik@MIxLK
mov ax, word ptr sectors =$ubSfx
cmp ax, blocknuml - s2Yhf
jg complete woN
d7`C}7
jl startread ;=@?( n
QUF1_Sa
complete: O* )BJOPa
zy~*~;6tW
lea bx,msgready 0UGAc]!/RZ
mov dx,bx 3M'Y'Szm
mov ah,09 /b6j<]H
int 21 rP/W,!
7:K
o =F!&]+
popa BZjL\{IW
mov ax,3100h wy:euKB~
int 21h E/D@;Ym18
6)FM83zk)K
; >feeVk
dispdx proc near U.<a d
pusha P(3$XMx
lea bx, dsp+3 $N|Spp0
mov cx,4 6\%#=GG
^,[gO#hgz
repeat0: zE7)4!
mov al,dl @[n%q.|VB
and al,0fh e`)zR'As
cmp al,09h |>-0
q~
jg add40 B*
^QTJ
add al, 30h
q ^Gj
IP
jmp okadd v[a4d&P
add40: F$9+WS`c
add al,37h ): r'IR
okadd: u!b0<E
mov byte ptr [bx],al |Z$)t%'
dec bx 7]hRAhJ8I
shr dx,4 v{8r46Y~Z)
loopnz repeat0 tMo=q7ig
lea bx,dsp s8k4e6ak
mov dx,bx #jg3Ku;Y
mov ah,09h pvRa
int 21h LrV|Y~
Ppx
4#j
popa 9'KOc5@l^
ret s5X51#J#~
dispdx endp q\~D:z$+CO
eEeK ]8@
dispqword proc near -&QpQ7q1
pusha SV^[)p)
mov cx ,4 7'@~TM
add bx,6 $us7fuKE
repeatdecbx: 0_t9;;y :
mov dx,[bx] +Lo,*
call dispdx 1W9uWkk_d
sub bx,2 ^HHT>K-m
loopnz repeatdecbx I#W J";kqB
popa ^a#W|-:
ret P{,=a]x,mz
dispqword endp -or)NE
RVpo,;:
rwsect proc near QR$m i1Vv\
ffaMF~+
lea bx,msg j"&Oa&SH
mov dx,bx 3v)``
n@
mov ah,09h 7qdB
int 21h lnV!Xuf
Su'l &]
lea bx,BlockNumL e C&!yY2g
call dispqword Tcq@Q$H
Owh:(E
J"d
lea di, packetsize Cn>t"#zs!~
mov dl,80h _G%kEt_4
mov ah,42h /8P7L'Rb
int 13h #Q|ACNpYM
jnc readok c2d
1'l]n
X"T)X#:)
mov cx,5 ETfoL.d$(
;出错后重试(定位0道后再重读) 2V$YZSw6q
retryrd: VZ2CWE)t
lea bx, msgReadErr cOP%R_ak?
mov dx,bx |s!n7%|,7
mov ah,09 %y)LBSxf
int 21h 5[^Rf'wy
=':B
B5]nP
.R
lea di,dap0
x![ut
mov dl,80h }w)wW1&
mov ah,44h mf2Qu
int 13h S^~
lQ|D
h6D1uM"o
lea bx,BlockNumL XZ/cRE
z^s
call dispqword Qaiqx"x3
6h\
; U5
lea di, packetsize m\K1Ex
mov dl,80h ,4(m.P10
mov ah,42h rwAycW7
int 13h /qd~|[Kx:
jnc readok \K:?#07Wj4
loopnz retryrd T lB+
tV>
`QT9W-0e^
readok: Ko
FWI_(b
lea di, packetsize AQ,%5MeqJ
mov dl,80h ~VPE9D@
mov ah,43h Wix4se1Ac
int 13h L0ZAF2O
Sqla+L*
rwsect endp 85+w\KuEY
=8DS~J{
code ends ;代码段结尾 #?bOAWAwLh
end start ;结束汇编 vGp`P
r<"k
/