第一个宏汇编程序 +`[$w<I
8\yH7H
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 T|E ;U
@1>83-p"X
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! $Ec;w
~e
oCduY2
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! lu >>~vy6
i->sw#
比较长啊!所以可以自动跳过。 snyx$Qx(
aA:Ky&5e
.286 =v_ju;C=
.radix 16 HsO=
%bb
data segment ;定义数据段 ss[8d%V
F;zmq%rK
s8tI_h
msg db 0dh, "Reading sector:$" 9A6ly9DIS
msg1 db 0dh, "Writing sector:$" 7.5G4
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" y,%w`
iw#luHcJ
dsp db " $" ^)
SvH
d`:0kOF+
;DAP pG"
4qw
PacketSize db 16d; // 数据包尺寸(16字节) 'C[gcp
Reserved db 0; // ==0 #
mzJ^V-
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) b*bR<|dT j
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) 2<y -c
Q?>
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 7mu%| !
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 J|ILG
(s9?#t6
;定位用DAP (复位到0磁道) 74KFsir@
DAP0 db 16d )ow 3Bl8w
db 0 S`J_}>
dw 1
wHAh6lm
buff1 dw 0,0 cJqPcCq(wn
dw 0,0,0,0
VC.r
PKwx)!
Rz
}x%"Oq|2]x
;DiskParameters
ic3qb<2
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) Me8d o;
G|
falgs dw 0; WORD Flags; // 信息标志 _rajm J
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 eQ*gnV}rE%
Heads DW 0; DWORD Heads; // 磁盘磁头数 /O8'8 sL5
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 lFB Ka
,6
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 N8KHNTb-M
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) i} q6^;uTF
bk8IGhO|m!
cmpsect dw 0 @50Js3R1q
]03!KE
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" >6aCBS?2
msgHds db 0dh,0a,"Heads:$" ]$z~;\ T
msgspt db 0dh, 0a,"SectorsPerTrack:$" {L8SDU{P
msgTotal db 0d,0a, "Total Sectors:$" P[Qr[74)
msgSS db 0dh,0a, "Sector Size:$"
]AN)M>
u^{Q|o:=x
msgReadErr db 0dh,0a,"Error Reading Sectors:$" :!3P4?a
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" A$-{WN.W
msgReset db 0dh,0a, "Reseting drive to Cyl 0" onjTuZ^h
UP,(zKTA
EqOB
0\
buffer db 32768d dup(0); o77H
RX
c
d:O@)i
data ends ;数据段结尾 o2jnmv~
9J>DLvl;
stack segment Y<{j':
db 400 dup(?) 2bCa|HTv
stack ends &AoWT:Ea
lRO4-
y
code segment ;定义代码段 c*3ilMP\4
assume cs:code ;规定cs的内容 $mpfr#!&3o
assume ds:data ;规定ds的内容 ln3.TR*
assume ss:stack UboOIx5:
h IGa
);g
start: $H_4Y-xOi
pusha 6E
ok7DI
h<6r+*T' p
mov ax,data ;程序从start开始 n%ld*EgY
mov ds,ax ;ds置初值,data的段地址 pHWol!
@
#V31im"N
;设置缓冲区 C5eol &
lea bx, buffer BG'gk#J+f
mov bufferaddr,bx 4 b
a1c
mov buff1,bx %2>FSE
mov bx,ds <H$ CCo
mov bufferaddr+2,bx x{+rx.
mov buff1,bx 0a(*/u
s_RYYaM
lea di,infosize H#1/H@I#
mov dl,80h 6z/8nf +u
mov ah,48h <1hwXo
int 13h (+4=A k
9gWQGkql
lea bx,msgcyl )>=`[$D1t
mov dx,bx R,y8~D
mov ah,09 {B[i|(xQx
int 21h ^tpy8TQ
mov dx,cylinders /R^!~J50
call dispdx %';n9M
SK-|O9Ki
lea bx,msghds 6jKM,%l
mov dx,bx P{);$e+b~
mov ah,09 K7CiICe
int 21h GA;E (a
mov dx,heads d{YhKf#~
call dispdx N'^ 0:zK:
)hn,rmn
(P
lea bx,msgspt N`#v"f<~Q
mov dx,bx c>]_,Br~
mov ah,09 )`g[k"yB3
int 21h T vk= NJ
mov dx,spt+2 TsR20P@
call dispdx
of(Nq@
mov dx,spt #BM *40tch
call dispdx (2%C%#]8
[t ^|l?
lea bx,msgtotal .%*.nq
mov dx,bx p
4t(xm2T
mov ah,09 XbHcd8N T
int 21h 0}aJCJ9sx=
lea bx,sectors _Jx?m
call dispqword ^%\p; yhL
<@Ew-JU
lea bx,msgss o]jo R3
mov dx,bx u0i
@.
mov ah,09 /Fk0j_b
int 21h ;7qk9rz4
mov dx,sectorsize 8^M5u>=t;
call dispdx (L~3nN;rr
{VI%]n{M
sbb word ptr sectors, 63d \Ud2]^D=
jnc subok X_=oJi|:
sub word ptr sectors+2,1 8l?]UFM>C
jnc subok Va9vDb6
sub word ptr sectors+4,1 jP+4'O!s[
jnc subok 4$_8#wB1&
sub word ptr sectors+6,1 /AWHG._
"b2Mk-qP
subok: uD. 0?*_
89WuxCFS
Q y15TJ
^\x
PF5
xor ax,ax 2wu
5`Z[E
mov blocknumL, ax -"(e*&TJ#
mov blocknumL+2, ax mTcLocx
mov blocknumL+4, ax +L_.XToq-
mov blocknumL+6, ax OY?uqP}c
<KJ18/
startread: 0{Tf;a<
]ImS@!Ajjx
call rwsect L !{^^7
J@1 (2%)|Z
adc word ptr blocknuml,63d L5U>`lx6$
jnc addok TzPVO>s
adc word ptr blocknuml+2,1 y 5=J6a2.
jnc addok sX@e1*YE_
adc word ptr blocknuml+4,1 K<N0%c~
jnc addok u} KiSZxt
adc word ptr blocknuml+6,1 _I@
dt6oF
jnc addok %3FI>\3
ECl[v%R/6
addok: h#;yA"j1&
mov ax, word ptr sectors+6 /wIZ '
cmp ax, blocknuml+6 1a
%*X UT
jg complete /oWB7l&
jl startread DNL
TJrN
mov ax, word ptr sectors+4 ti'OjoJL
cmp ax, blocknuml+4 ]QpR>b=[j
jg complete QAu^]1 ;
jl startread A~h8 >zz*
mov ax, word ptr sectors+2 Wlt shZo
cmp ax, blocknuml+2 'X`
\vTxB
jg complete 9#_49euy|P
jl startread !(+?\+U lE
mov ax, word ptr sectors uE/q
ra
A
cmp ax, blocknuml #`?uV)(
jg complete L9G=+T9
jl startread #&DJ3(T
Xf#uK\f
complete: wus]
.%D] z{''
lea bx,msgready fDqlN`P@
mov dx,bx `
M\L6o
mov ah,09 !M}&dW2
int 21 Ot v{#bB$
t
6~|T_]
popa =#1/<q)L
mov ax,3100h ))eR
int 21h i++ F&r[
?t<wp3bZ
; k ^+h>B-;
dispdx proc near p%j@2U
pusha $|AvT;4
lea bx, dsp+3 UY>{e>/H9
mov cx,4 P^&+ehp
^gv)[
repeat0: *r(iegO$
mov al,dl E4 JS
and al,0fh pvcf_w`n
cmp al,09h ;m;wSp
jg add40 Ndx='j0
add al, 30h {_ Wtk@
jmp okadd ;r8,Wx@f1C
add40: RCoz;|c`P
add al,37h mQ1QJ_;
okadd: 6`EyzB%.$
mov byte ptr [bx],al #U!J2240
dec bx WukCE
shr dx,4 &4DvZq=
loopnz repeat0 ]\Ez{MdAT
lea bx,dsp ! a1j c_
mov dx,bx na%9E8;:&v
mov ah,09h |n]^gTJt
int 21h $z`
jR*
'
Bdvqq
popa tXfB.[U
ret J&h 3,
dispdx endp UIzk-.<
|" l
g4S%
dispqword proc near Be-gGJG
pusha $k}+,tHtJO
mov cx ,4 <;W4Th<4
add bx,6 `(16_a
repeatdecbx: b$g.">:$
mov dx,[bx] vW~_+:),e
call dispdx W>s<&Vb
sub bx,2 -7\RO%U
loopnz repeatdecbx HaLEQ73
popa W*VQ"CW{^]
ret XjL( V1
dispqword endp _pk=IHGsB
? BBD
k
rwsect proc near =(v/pLLK?
JB**z00;
lea bx,msg e?F
r/n
mov dx,bx '?Hy"5gUA
mov ah,09h {*te
wF)|
int 21h ,P5HR
+h
q-p4k`]
lea bx,BlockNumL mVk:[
}l6
call dispqword \$9S_z
e3',? 5j
lea di, packetsize ,{YC|uB
mov dl,80h g"<k
j"
mov ah,42h Ip?Ueaei
int 13h [<OMv9(l'o
jnc readok A.y"R)G
o
1YhYA
mov cx,5 l$PO!JRD
;出错后重试(定位0道后再重读) R-Uj\M>
retryrd: MQp1j
:CK
lea bx, msgReadErr 2R.YHj
mov dx,bx .\<
\J|3
mov ah,09 b/WVWDyob/
int 21h \b~zyt6-
{T.$xiR
&XN*T.Y`
lea di,dap0 VSM%<-iQ
mov dl,80h #]
n[
mov ah,44h \5X34'7
int 13h m|e!1_:H
I]TL#ywF
lea bx,BlockNumL ]+,Z()
call dispqword /l@ 7MxE
{:fyz#>>^
lea di, packetsize zoO>N'b3)
mov dl,80h >uxak2nM-
mov ah,42h iSHNt0Nl
int 13h #F
[6$. Gr
jnc readok "PnYa)?1
loopnz retryrd A@&+!sO
Bg;bBA!L
readok: XBi@\i=
lea di, packetsize IzkZ^;(N
mov dl,80h QZ
h|6&yI
mov ah,43h &>sG xK
int 13h LvE|K&R|
.viA +V
rwsect endp sp'q=^t
R%
}OZJ_
code ends ;代码段结尾 FVL0K(V(
end start ;结束汇编 &zUo", }9
MI<hShc\