第一个宏汇编程序 hiBsksZRnk
oWL_Hh%-f`
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ;<N:! $p
s
:7/\h
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! }rI:pp^KS
uf90
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 0W}qp?
'Gqv`rq&
比较长啊!所以可以自动跳过。 ('SId@
%2T
i
Rb
.286 @`dg:P*[
.radix 16 |bz%SB
data segment ;定义数据段 7]xDMu'^&f
3PGAUQR#"q
-1
Dq_!i
msg db 0dh, "Reading sector:$" 6IG?t
msg1 db 0dh, "Writing sector:$" @U18Dj[
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 6_4B!
&G\mcstX
dsp db " $" BH1h2OEe#
{='Bd6_=
;DAP ,#UZp\zZ*
PacketSize db 16d; // 数据包尺寸(16字节) !}z'"l4i
Reserved db 0; // ==0 e~'lWJD
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) '{UKO7
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) iW^J>aKy
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 >P:X\5Oj
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 E#!!tH`lgg
S@qR~_>a
;定位用DAP (复位到0磁道) 5\MC5us3
DAP0 db 16d fE+zA)KX
db 0 UPU$SZAIx
dw 1 Inv`C,$7Q#
buff1 dw 0,0 k1q/L|')
dw 0,0,0,0 ]vlBYAW'
=K18| Q0m
Cl`i|cF\
;DiskParameters 1'\QD`M9^
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节)
!CWe1Dm
falgs dw 0; WORD Flags; // 信息标志 c%C6d97q
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 q9_$&9
Heads DW 0; DWORD Heads; // 磁盘磁头数 +ZM,E8
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 1*9.K'
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 uD>=
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ?}Z
t&(#
tLWw<)t
cmpsect dw 0 W\k8f+Ke
Q0Ft.b
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" R
,qQC<
msgHds db 0dh,0a,"Heads:$" VwE4:/7YN
msgspt db 0dh, 0a,"SectorsPerTrack:$" 8 s$6R|ti
msgTotal db 0d,0a, "Total Sectors:$" ><
$LV&
msgSS db 0dh,0a, "Sector Size:$" Z-Qp9G'
-3R:~z^L
msgReadErr db 0dh,0a,"Error Reading Sectors:$" u1$6:"2@5k
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" "0PrdZMx
msgReset db 0dh,0a, "Reseting drive to Cyl 0" )&c#?wx'w
\]V:>=ry>
m+hI3@j
buffer db 32768d dup(0); IibrZ
/n6
GYfOwV!zB
data ends ;数据段结尾
Q+=pP'cV
]alc%(=
stack segment teg5g|*
db 400 dup(?) b$7]cE
stack ends G n]qh(N>
gHLI>ew*QR
code segment ;定义代码段 CpO_p%P
assume cs:code ;规定cs的内容 <ToB
VGX
assume ds:data ;规定ds的内容 ^PTf8o
assume ss:stack mkn1LzE|F
PlGif)
start: din,yHu~
pusha kun/KY
>\Dy
3T)rJEN A
mov ax,data ;程序从start开始 FAEF
mov ds,ax ;ds置初值,data的段地址 .how@>:P+
f\<r1
;设置缓冲区 8u+kA
mI
lea bx, buffer (QiA5!wg
mov bufferaddr,bx x 3=1/#9
mov buff1,bx e~SK*vR%]
mov bx,ds d
fj23+
mov bufferaddr+2,bx 0I)$!1~O)
mov buff1,bx q
T@h/Y
W5
F\e[Ax5
lea di,infosize G kjfDY:
mov dl,80h z#GZb
mov ah,48h RW L0@\
int 13h eo0-aHs
Or5?Gt
lea bx,msgcyl . ,^WCyvq
mov dx,bx X ha9x,
mov ah,09 jr4xh{Z`
int 21h I_ mus
<sE
mov dx,cylinders D=-}&w_T"
call dispdx JcR|{9ghT
@gD)pH
lea bx,msghds jW\:+Taq
mov dx,bx LpU}.
mov ah,09 ~\_VWXXvIW
int 21h [yXmnrxA
mov dx,heads =0=#M(
w
call dispdx tk%f_"}
\b"rf697,
lea bx,msgspt )x|;%.8FX7
mov dx,bx U =.PL\
mov ah,09 NS[eQ_rT
int 21h `N *:,8j
mov dx,spt+2 zl@^[km{
call dispdx Plp.\N%f3
mov dx,spt 0N,<v7PX
call dispdx J,yKO(}<C
}`B
.(3n
lea bx,msgtotal a:)FWdp?9
mov dx,bx (' 5?-
mov ah,09 @.e X8~3=
int 21h OOqT 0wN
lea bx,sectors w(Z ?j%b
call dispqword <
'5~
p$
JXK\mah
lea bx,msgss ]nhh|q9r{
mov dx,bx y&zFS4"x
mov ah,09 #{8IFA
int 21h 5l6/
5
mov dx,sectorsize @f-X/q]P
call dispdx EL?(D
ST*h{:u&A
sbb word ptr sectors, 63d "tz6O0D
jnc subok N-M.O:p
sub word ptr sectors+2,1 Y<xqws
jnc subok 8wsU`40=Q
sub word ptr sectors+4,1 N'v3
|g
jnc subok
bmv8nal<Y
sub word ptr sectors+6,1 U>E:
Ub0r
y|5s
subok: 1ML
L
5?k5J\+
2tq2
JN0h3nZ_
xor ax,ax m^D'p
mov blocknumL, ax Y@+Rb
mov blocknumL+2, ax ~=|}!A(
mov blocknumL+4, ax xnY?<?J"!
mov blocknumL+6, ax j>\c >U
86r"hy~
startread: /MF
7ZvN.
G)Gp}4gV}
call rwsect V)^Xz8H_
<b:%o^
adc word ptr blocknuml,63d 1INX#qTZ
jnc addok q-
JTGCFl
adc word ptr blocknuml+2,1 .11l(
M
jnc addok n%&L&G
adc word ptr blocknuml+4,1
OIrm9D#
jnc addok _!03;zrO
adc word ptr blocknuml+6,1 p R'J4~
jnc addok P}@AH02
,n/]ALz>~
addok: X.fVbePxUU
mov ax, word ptr sectors+6 f^$,;
cmp ax, blocknuml+6 kamQZzPe
jg complete ,9P-<P
jl startread c{=Sy;i@
mov ax, word ptr sectors+4 SyvoN,;Q
cmp ax, blocknuml+4 "6f`hy
jg complete Bu{Kjv
jl startread l_^OdQ9D
mov ax, word ptr sectors+2 {@InOo!4w]
cmp ax, blocknuml+2 W{}$c`,R
jg complete ]@&X*~c^Z
jl startread
-tg|y
mov ax, word ptr sectors +F;2FD$
cmp ax, blocknuml Ei4^__g\'
jg complete N[I@}j
jl startread #rlgeHG!fs
ic2D$`M
complete: UBaXS_c\
E\[B E<y
lea bx,msgready 2Vx4"fHP#N
mov dx,bx ${ {4L?7
mov ah,09 ,{_i{WV
int 21 YXA@
c
/ FcRp ,"
popa O?e9wI=H
mov ax,3100h Mn0.!J
"
int 21h jrib"Bh3,
yLa@27T\A
; *2/Jg'de
dispdx proc near 9M96$i`P
pusha L/8oqO|
lea bx, dsp+3 Z=JKBoAY
mov cx,4 op6]"ZV-C
X1
^VdJE
repeat0: 5)#j }`6
mov al,dl fkxkf^g)
and al,0fh WX&IQ@
cmp al,09h LZykc
c9g
jg add40 >fBPVu\PA
add al, 30h \O|SPhaIf
jmp okadd aCG rS{
add40: t dm7MPM
add al,37h B.8B1MFm
okadd: PIri|ZS
mov byte ptr [bx],al b RR N
dec bx LDlYLsF9
shr dx,4 is<:}z
loopnz repeat0 F!vrvlD`s
lea bx,dsp #1<m\z 7l
mov dx,bx .WF"vUp
mov ah,09h N*Aw-\Bk
int 21h LDt6<D8,Q
WPNB!"E98
popa 4
=yzf
ret B7%,D}
dispdx endp ?2<)
Jw
8}'iEj^
e
dispqword proc near \*$^}8
pusha $C[z]}iOi
mov cx ,4 hfwJZ\_60
add bx,6 hi8q?4jE
repeatdecbx:
9Dx~!(
mov dx,[bx] f8Hq&_Pn
call dispdx Bz]tKJ
sub bx,2 cE\w6uBR1
loopnz repeatdecbx z=D5*
popa t<!m4Yd|#
ret t#NPbLZ
dispqword endp KdEvu?
S2$E`'
J
rwsect proc near (!}N&!t
OgF[=
lea bx,msg cIU2 qFn[
mov dx,bx A({czHLhN5
mov ah,09h g NI1W@)
int 21h j
3<Ci {3
6<&A}pp
lea bx,BlockNumL ytcLx77`:
call dispqword uMcI'=
'LYDJ~
lea di, packetsize N^;lp<{6?
mov dl,80h #/G!nN #
mov ah,42h !1$x4 qxS
int 13h iXWHI3
jnc readok 1w>[
g257jarkMF
mov cx,5 w S
;出错后重试(定位0道后再重读) Ik:G5m<ta
retryrd: :\;9y3
lea bx, msgReadErr j\uZo.Ot+
mov dx,bx I-#!mFl
mov ah,09 F-;J N
int 21h L ]')=J+
?@"@9na
DsdM:u*s
lea di,dap0 6N@=
*0kh-
mov dl,80h 5 {! fa
mov ah,44h b^W&-Hh
int 13h )PN8HJAArh
4E''pW]8
lea bx,BlockNumL P27Ot1px
call dispqword ZdW+=;/#
Vl5r~+$|
lea di, packetsize 3qWrSziD
mov dl,80h K$S0h-?9]O
mov ah,42h %xgP*%Sv2
int 13h (qA
F2&
jnc readok Za@\=}Tt
loopnz retryrd ~>:JwTy
2Io|?
readok: 0LQRQuh1
lea di, packetsize :,8y8z$+
mov dl,80h (TeH)j!
mov ah,43h } 9@rhW
int 13h ;j0.#P:a
DI0& _,
rwsect endp kepuh%KY[
48xgl1R(j
code ends ;代码段结尾 Zo=,!@q(
end start ;结束汇编 x^y$ pr
MfQ0O?oBp