第一个宏汇编程序 *Y:;fl +v
{5GXN! f
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 G\X}gqe(OJ
-z s5WaJn/
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! -nHt6AbqP
q(Q$lRj/I-
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! >8v4fk
IK
[w1 4hHnq
比较长啊!所以可以自动跳过。 iE
6?Px9]
})V^t3
.286 nzcXL
=^r3
.radix 16 IqA'Vz,lL
data segment ;定义数据段 e&R?9z-*
?:sk [f6
Oq`CK f
msg db 0dh, "Reading sector:$" SS)9+0$
msg1 db 0dh, "Writing sector:$" Lrrc&;
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 6Z}8"VJr {
#YiphR&
dsp db " $" PLb[U(~
efT@A}sV
;DAP k_o$ Ci
PacketSize db 16d; // 数据包尺寸(16字节) y7X2|$9z-
Reserved db 0; // ==0 w
\ U?64
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) R^hlfKnt
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) xWiR7~
E
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 QWncKE,O$
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 /h(bMb Z
^\(<s
;定位用DAP (复位到0磁道) ~; V5*t
DAP0 db 16d DN$[rCi7
db 0 Bu ]PNKIi
dw 1 H Q_IQ+
buff1 dw 0,0 prk@uYCa =
dw 0,0,0,0
s"'ns
^t2b`n60
uht>@ WSg|
;DiskParameters F|wT']1Y
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) TJO?BX_9
falgs dw 0; WORD Flags; // 信息标志 e|-%-juI
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 D8rg:,'6
Heads DW 0; DWORD Heads; // 磁盘磁头数 `K%f"by
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 b] 5i`
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 *!m\%*y{
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ?LwBF;Y
85}S8\_u
cmpsect dw 0 Sc.@u3
K Y=$RO
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" >z"\l
msgHds db 0dh,0a,"Heads:$" x\i+MVR-
msgspt db 0dh, 0a,"SectorsPerTrack:$" PxvD0GTW
msgTotal db 0d,0a, "Total Sectors:$" X21k7 Ls
msgSS db 0dh,0a, "Sector Size:$" oAxRI+&|.
"9^OT
msgReadErr db 0dh,0a,"Error Reading Sectors:$" WA?We7m$
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" ~LfFLC
msgReset db 0dh,0a, "Reseting drive to Cyl 0" Ue?mb$ykC.
G`oY(2U
1(diG&
buffer db 32768d dup(0); ZL7#44
4#Bzq3,|
data ends ;数据段结尾 +$;#bw)yH
"Dt:
8Nf^
stack segment ,6EFJVu
\
db 400 dup(?) BwJL)$D<S
stack ends x@p1(V.
)8JfBzR
code segment ;定义代码段 6)h~9iK
assume cs:code ;规定cs的内容 ]YciLc(
assume ds:data ;规定ds的内容 qlNB\~HCe
assume ss:stack "XB6k0.#
>7$h
start: M(|6YF7u
pusha "n, %Hh
-UBH,U
* YR>u@
mov ax,data ;程序从start开始 2{6%+>jB
mov ds,ax ;ds置初值,data的段地址 3nbTK3,
M669G;w(K
;设置缓冲区 !r#36kO
lea bx, buffer u[<ij
mov bufferaddr,bx *-vH64e
mov buff1,bx sJ>JHv
mov bx,ds sqv!,@*q
mov bufferaddr+2,bx .3
S9=d?
mov buff1,bx ~p!=w#/
N0V`xrS
lea di,infosize /*G-\|
mov dl,80h }~+q S`
mov ah,48h 0
3?7kAI
int 13h nw
W}iDT?Qi
lea bx,msgcyl ]}Jb'(gMO4
mov dx,bx 7%sx["%@
mov ah,09 \gW6E^
int 21h o]<@E u G
mov dx,cylinders O4g2s8k
call dispdx j9r%OZw{
:5#iVa#<
lea bx,msghds c $n`=NI
mov dx,bx BG
rV,h^
mov ah,09 }v`Z.?|Z
int 21h p6&6^v\
mov dx,heads H?4t\pSS
call dispdx CxV$_J
?Z2_y-
lea bx,msgspt Maw$^Tz,
mov dx,bx ZWb\^N
mov ah,09 +UX~TT:
int 21h r @URs;O=
mov dx,spt+2 *v:o`{vM[
call dispdx $lAQcG&Q
mov dx,spt f{w[H S,z
call dispdx T!2gOe
@#>YU
lea bx,msgtotal 9zD,z+
mov dx,bx (
d1ho=
mov ah,09 +'"NKZ.>TT
int 21h f~R`RBZ]9
lea bx,sectors i$g6C
call dispqword 89YG
`
,opS)C$
lea bx,msgss zLSha\X
mov dx,bx 9TUB3x^
mov ah,09 b^'>XT~1J&
int 21h 9&"wfN N
mov dx,sectorsize
'h#>@v> }
call dispdx d9.I83SS
iI$;%uY3g
sbb word ptr sectors, 63d ^fEer
jnc subok \^3cNw
sub word ptr sectors+2,1 ,c&%/"i:w
jnc subok Vwpy/5Hmp
sub word ptr sectors+4,1 FwpTQix!
jnc subok p_EWpSOt7
sub word ptr sectors+6,1 Blox~=cW
m0,TH[HWGF
subok: 3|
F\a|N
x4CSUcKb
A2%RcKY7
R/\ qDY,@
xor ax,ax b\Mb6s
mov blocknumL, ax u):Nq<X
mov blocknumL+2, ax ayZWt| iHA
mov blocknumL+4, ax xxZO{_q
mov blocknumL+6, ax 8FJPw"9
dk_! ~Z
startread: ,CP&o
1#
lH5|XQ
call rwsect ?2<V./2F
{O_`eS
adc word ptr blocknuml,63d I~&*8)xM
jnc addok AmX ~KK
adc word ptr blocknuml+2,1 Fvr$K*u
jnc addok `s\E"QeZN
adc word ptr blocknuml+4,1 ,aU8.
J_U
jnc addok ^5Ob(FvU
adc word ptr blocknuml+6,1 bE%*ZB
jnc addok [N_)V kpr
Z^t{m!v
addok: J l
fIYf~
mov ax, word ptr sectors+6 av>Ff6w)Y
cmp ax, blocknuml+6 D9r4oRkP*
jg complete
:+v4,=fHy
jl startread 2&0#'Tb
mov ax, word ptr sectors+4 :OD-L)Or
cmp ax, blocknuml+4 _}l7f
jg complete =kBWY9:$,
jl startread #^9a[ZLj0
mov ax, word ptr sectors+2 b" kL)DL1L
cmp ax, blocknuml+2 3a?dNwM@
jg complete 2!nz>K
jl startread *@fVog r^
mov ax, word ptr sectors =GL^tAUJ
cmp ax, blocknuml <.U(%`|
jg complete n*m
"yp
jl startread iHk/#a
^TqR0a
-*
complete: 2SXy)m
!
0O|l7mCr%I
lea bx,msgready bmw"-W^U[
mov dx,bx 4<S=KFT_
mov ah,09 q\d/-K
int 21 uC5W1LyI
4v#A#5+O E
popa $p\ 0/
mov ax,3100h a/gr1
int 21h N 8pzs"
,h},jkY4
; VX'G\Zz@h|
dispdx proc near roNs~]6
pusha 1v'|%B;O
lea bx, dsp+3 @ 5V3I^
mov cx,4 ]DK.4\^
wF)g@cw
repeat0: ^o[(F<q
mov al,dl "rcV?5?v~
and al,0fh I6Oc`S!L
cmp al,09h zC WN,K`
jg add40 |Li9Y"5
add al, 30h qFwAzW;"
jmp okadd Bi`m +ob
add40: #RWmP$+#=
add al,37h HEs .pET\
okadd: <xwaFZ
mov byte ptr [bx],al R[!%d6jDE
dec bx -f=4\3y3p
shr dx,4 q j*77
loopnz repeat0 $c];&)7q
lea bx,dsp >$_@p(w
mov dx,bx nzl3<Ar
mov ah,09h Vb/XT{T;b
int 21h 4=ZN4=(_[
xX\A&9m
popa t}2M8ue(&
ret S!g0J}.z
dispdx endp Ht7v+lY90^
DC,]FmWs!+
dispqword proc near (2'q~Z+>'
pusha GQ1m
h*4$
mov cx ,4 Ta)6ly7'
add bx,6 )'e9(4[V1
repeatdecbx: r^ +n06[
mov dx,[bx] o(Q='kK
call dispdx f=Kt[|%'e
sub bx,2 AxiCpAS;J
loopnz repeatdecbx N3|aNQ=X0
popa mO@Sl(9
ret DX<xkS[P
dispqword endp 0Rz",Mu>
vve[.Lud'
rwsect proc near 7s2e>6Q[
1zIrU6H2;_
lea bx,msg JA
"
mov dx,bx ke5_lr(
mov ah,09h FfibR\dhY
int 21h l/6(V:
f4+}k GJN
lea bx,BlockNumL Z]k+dJ[-
call dispqword 1*]@1DJt
86ml.VOR
lea di, packetsize iYl{V']A
mov dl,80h cE3V0voSw1
mov ah,42h M%N_4j.
int 13h 2VgVn,c
jnc readok r&O:Bt}x
E)%r}4u>
mov cx,5 OYY_@'D
;出错后重试(定位0道后再重读) skBzwVW I
retryrd: nm
!H<
lea bx, msgReadErr c\N-B,m&
mov dx,bx 7=@MnF`
mov ah,09 OIrr'uNH
int 21h 9I*i/fa
2D"\Ox
NqZR*/BOz
lea di,dap0 )Zit6I
mov dl,80h XO"BEj<x
mov ah,44h 8@BN
6
int 13h Qh,Dcg2ZM"
S3Sn_zqG
lea bx,BlockNumL fXB64MNo
call dispqword F!&_
@EGUQ|WL^
lea di, packetsize 9
p`|~^X
mov dl,80h k4BiH5\hA
mov ah,42h d<>jhp5el
int 13h \++#adN:K
jnc readok $6yr:2Xvt
loopnz retryrd T`r\yl}
hG>3y\!#
readok: #brV{dHV,
lea di, packetsize Q=.j>aM+_
mov dl,80h RiCzH
mov ah,43h e(EXQP2P>
int 13h XFcIBWS
\
Q0-yNt
rwsect endp E@S5|CM
Jkub|w#QH
code ends ;代码段结尾 :~B'6b
end start ;结束汇编 0?\d%J!"S
b`X"yg+