第一个宏汇编程序 2G7Wi!J
[JiH\+XLPs
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 f|5co>Hk
CJ
}%W#
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! IxU/?Zm
fC`&g~yK'
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! zCZf%ATq
0kh6@y3
比较长啊!所以可以自动跳过。 $FV NCFN%
i5Ggf"![
.286 q~3>R=t
.radix 16 la!~\wpa
data segment ;定义数据段 **%37
G{}VPcrbC
T)/eeZ$
msg db 0dh, "Reading sector:$"
"jZ-,P
=
msg1 db 0dh, "Writing sector:$" -n
1v3
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" o/E >f_k[
MtdG>TzUn
dsp db " $" M3\AY30L
1}x%%RD_
;DAP ?s01@f#
PacketSize db 16d; // 数据包尺寸(16字节) N8jIMb'<
Reserved db 0; // ==0 afVT~Sf{
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) `yyG/
l
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) k[xSbs'
D
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 /v{I
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 K+eM
pBHRa?Y5
;定位用DAP (复位到0磁道) 4(
+PD&_J
DAP0 db 16d 01]f2.5
db 0 3og.y+.=U.
dw 1 )A6<c%d =x
buff1 dw 0,0 us-L]S+lm
dw 0,0,0,0 (`^1Y3&2
)9g2D`a4
Sjqpec8
;DiskParameters }2jn[${ pr
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) oA
1yIp
falgs dw 0; WORD Flags; // 信息标志 Wr
4,YQM
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 e'~3oqSvR
Heads DW 0; DWORD Heads; // 磁盘磁头数 VA%J\T|G2\
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 WWY6ha
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 c 9Mz]1@f
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ytImB`'\
A.SvA Yn
cmpsect dw 0 Txu/{M,
?<!|
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" $Sq:q0
msgHds db 0dh,0a,"Heads:$" y29m/i:
msgspt db 0dh, 0a,"SectorsPerTrack:$" |yCMt:Hk
msgTotal db 0d,0a, "Total Sectors:$" Q &8
-\
msgSS db 0dh,0a, "Sector Size:$" -?\D\\+t
e~OpofJNb
msgReadErr db 0dh,0a,"Error Reading Sectors:$" J.a]K[ci
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" Jy)/%p~
msgReset db 0dh,0a, "Reseting drive to Cyl 0" *dQSw)R
sJZiI}Xc
rI\FI0zIp_
buffer db 32768d dup(0); 6nn*]|7
9up3[F$
data ends ;数据段结尾 3";q[&F9y
&C}*w2]0S
stack segment Rcuz(yS8
db 400 dup(?) 4#D,?eA7
stack ends "oyo#-5z
-).C
code segment ;定义代码段 /ZX}Nc g
assume cs:code ;规定cs的内容 _a, s
)
assume ds:data ;规定ds的内容 hN_]6,<\
assume ss:stack m67V_s,7B
\fOEqe*5SM
start: yi[x}ffdE
pusha 4W75T2q#
#
!=tDc
&
-"x$ZnHU
mov ax,data ;程序从start开始 wYea\^co
mov ds,ax ;ds置初值,data的段地址 ZJoM?g~WFI
W/N7vAx X
;设置缓冲区 b%+Xy8a
lea bx, buffer mH(:?_KrS-
mov bufferaddr,bx ).O)p9
mov buff1,bx $4\j]RE!
mov bx,ds }MySaL>
mov bufferaddr+2,bx 0GL M(JmK
mov buff1,bx NEs:},)o
".%k6W<n
lea di,infosize 0-gAyiKx?
mov dl,80h iZmcI;?u
mov ah,48h 5P bW[
int 13h >P(.:_^p
UKGPtKE<
lea bx,msgcyl mFeP9MfJ
mov dx,bx F4QVAOM]U
mov ah,09 q.vIc
?a
int 21h '/p4O2b,
mov dx,cylinders kJU2C=m@e2
call dispdx Wwo0%<2y
P}iE+Z3
lea bx,msghds u8^lB7!e/
mov dx,bx !WlH'y-I
mov ah,09 [E_9V%^
int 21h V`5O{Gg
mov dx,heads y =@N|f!
call dispdx +T ?NH9
7<4qQ.deE
lea bx,msgspt g(g& TO
mov dx,bx Om&Dw|xG8
mov ah,09 crCJrN=
int 21h \V:^h[ad
mov dx,spt+2 Ri'n
call dispdx H,J8M
{
mov dx,spt >_}
I.\X
call dispdx
@EAbF>>
tPvpJX6kP
lea bx,msgtotal qs6aB0ln
mov dx,bx NK+o1
mov ah,09 f$( e\++
int 21h %<5'=t'|-U
lea bx,sectors \vNU,WO
call dispqword hTkyz
la
AA_%<zK
lea bx,msgss %O<BfIZ
mov dx,bx <@}9Bid!o
mov ah,09 b>k
y
int 21h bt *k.=p
mov dx,sectorsize jIyQ]:* p
call dispdx 2%1hdA<
rqq1TRg
sbb word ptr sectors, 63d PF2nLb2-
jnc subok CTK;dM'uQ
sub word ptr sectors+2,1 Dq xs+
jnc subok k)u[0}
sub word ptr sectors+4,1 1YA% -~
jnc subok L];b<*d
sub word ptr sectors+6,1 IV-{ve6
ESs\O?nO
subok: |ZBw<f
Vl]>u+YqE
iLT}oKF2N;
y(Td/rY.
xor ax,ax p_ =z#
mov blocknumL, ax ^Cmyx3O^
mov blocknumL+2, ax Tw%
3p=
mov blocknumL+4, ax 0:+E-^X
mov blocknumL+6, ax RSds8\tk
k9R9Nz|J
startread: i4Jc.8^9$
J,G
lIv.A
call rwsect ^.tg 7%dJ
|qLh5Ty
adc word ptr blocknuml,63d
\v{=gK
jnc addok z#N@ 0R
adc word ptr blocknuml+2,1 $kgVa^
jnc addok X]=t>
adc word ptr blocknuml+4,1 ^8tEach
jnc addok !k%#R4*>
adc word ptr blocknuml+6,1 `/g
UV
jnc addok s{++w5s
^aQ"E9
addok: wr4:Go`
mov ax, word ptr sectors+6 K,]=6Rj
cmp ax, blocknuml+6 PH"%kCI:
jg complete fM
}#ON>Z
jl startread zi:BF60]=
mov ax, word ptr sectors+4 ?"FbsMk.d
cmp ax, blocknuml+4 Bx!-"e
jg complete .hiSw
jl startread =43auFY-P
mov ax, word ptr sectors+2 tkhCw/
cmp ax, blocknuml+2 mmsPLv6
jg complete ;jPXs
jl startread ]4{H+rw
mov ax, word ptr sectors VL^EHb7
cmp ax, blocknuml l0]
EX>"E
jg complete +(*DT9s+
jl startread Q\)F;: |
a?.=V
complete: _ |p8M!
*"kM{*3:v
lea bx,msgready |}1dFp
mov dx,bx H]!"Zq k
mov ah,09 E4!Fupkpf
int 21 h![#;>(
51u0]Qx;fm
popa .543N<w
mov ax,3100h P2!C|SLK
int 21h ^{{ qV
~
1 pr~
; l,:F
dispdx proc near yVc(`,tZ(
pusha x"(KBEK~
lea bx, dsp+3 t5zKW _J7
mov cx,4 _ m>b2I?
+V+a4lU14
repeat0: 4YHY7J
mov al,dl ':W[ A
and al,0fh
HDKbF/
cmp al,09h ;=@0'xPEa-
jg add40 F?cK-.
add al, 30h ddo#P%sH'
jmp okadd iLz@5Zj8
add40: DMS!a$4
add al,37h 8Y3I0S
okadd: :]c3|J
mov byte ptr [bx],al F
/Pep?'
dec bx }%z
shr dx,4 N7_"H>O$0U
loopnz repeat0 #%s#c0TX
lea bx,dsp eFAnFJ][L
mov dx,bx M;NX:mX9
mov ah,09h fh{`Mz,o
int 21h r/sNrB1U"y
C?Ucu]cW
popa 9kojLqCT
ret ~Z+%d9ode
dispdx endp nm+s{
3F0 N^)
@
dispqword proc near 8f7>?BUS,
pusha ]?)TdJ`
mov cx ,4 kLY
^!
add bx,6 2%>FR4a
repeatdecbx: C>~TI,5a3
mov dx,[bx] -+5>|N#
call dispdx K#xvu1U
sub bx,2 s(^mZ
-i
loopnz repeatdecbx Zov~B-Of:
popa j4b4!^fV
ret b\ PgVBf9
dispqword endp &R siVBA
)i<j XZ:O
rwsect proc near [V!tVDs&'o
H[UlY?&+
lea bx,msg Ug`
djIL
mov dx,bx 2Hdu:"j
mov ah,09h Wf<LR3
int 21h b2]Kx&!
*dF>_F
lea bx,BlockNumL Mlq.?-QgIL
call dispqword Bf:Q2slqI
e%6QTg5#
lea di, packetsize a>)f=uS
mov dl,80h XM}hUJJW
mov ah,42h i&k7-<
int 13h W`&hp6Jq
jnc readok
a6H%5N
P&q7|ST%N
mov cx,5 -
DCbko
;出错后重试(定位0道后再重读)
9
akH
retryrd: qVPeB,kIz
lea bx, msgReadErr m3ff;,
mov dx,bx {|\.i
mov ah,09 CNIsZv@Q
int 21h 4~=l}H>&
iOdpM{~*
Ha ]YJ}
lea di,dap0 ?}7p"3j'z
mov dl,80h +O5hH8<&b
mov ah,44h KU;9}!#
int 13h 66 Tpi![
0g\(+Qg^
lea bx,BlockNumL WKU=.sY
call dispqword Wvqhl
'J
iO[<1?
lea di, packetsize PzGWff!*n
mov dl,80h p8Q1-T3v
mov ah,42h >f'g0g
int 13h %UM
*79
jnc readok hEk$d.!}
loopnz retryrd %bfZn9_m
5PW^j\G-f
readok: "mNq&$
lea di, packetsize &[SC|=U'M
mov dl,80h c)tfAD(N8x
mov ah,43h FN;^"H
int 13h `"~%bS
<,(,jU)j
rwsect endp ZB&
6<uw
ZC}QId
code ends ;代码段结尾 d %#b:(,
end start ;结束汇编 L+QLLcS~EM
`lPfb[b