第一个宏汇编程序 ;xS@-</:
gp`$/ci
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 @4#q
zgI!S6q
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! W.'#pd
Y[R veF
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! *%=BcV+,
HQCxO?
比较长啊!所以可以自动跳过。 04D>h0yFf
<v>^#/.0
.286 ^KM' O8
.radix 16 |D~mLs;&
data segment ;定义数据段 &5h{XSv
bC{}&a
I}q2)@
msg db 0dh, "Reading sector:$" Ej~vp2
msg1 db 0dh, "Writing sector:$" ^Vso`(Ss
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" sf<S#;aYqn
G3
rTzMO
dsp db " $" ?\"GT] 5D
!ow:P8K?
;DAP "v@Y[QI
PacketSize db 16d; // 数据包尺寸(16字节) K`{P/w
Reserved db 0; // ==0 Ub2t7MU
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ]bLI!2Kr
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) m(i8 4~
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 %JF^@\E!|
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 g
Fizw:l
4>-'w MW")
;定位用DAP (复位到0磁道) `*g(_EZsS
DAP0 db 16d MHeUh[%(
db 0 ~! ;*C
dw 1 IW?).%F
buff1 dw 0,0 Tty_P,
dw 0,0,0,0 BiT
#bg
DvB!-|ek
#^4p(eZ[}
;DiskParameters sC1Mwx
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) ;h<(vc3@f
falgs dw 0; WORD Flags; // 信息标志 SR!EQ<
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 6<u=hhL
Heads DW 0; DWORD Heads; // 磁盘磁头数 -d1 YG[1|
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 w$[&ejFb
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 S81%iz.n
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) YcOPqvQ
`<2k.aW4e8
cmpsect dw 0 t~]n"zgovz
lqe|1vN
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$"
=.a}
msgHds db 0dh,0a,"Heads:$" ZP~Mg
z{f
msgspt db 0dh, 0a,"SectorsPerTrack:$" 4'up bI
msgTotal db 0d,0a, "Total Sectors:$" [
R
msgSS db 0dh,0a, "Sector Size:$" \@&oK2f
e=Ko4Ao2y
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 8eq*q
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" R/ix,GC
msgReset db 0dh,0a, "Reseting drive to Cyl 0" %A64AJZ
kw{dvE\K
'9@S
buffer db 32768d dup(0); "{(|}Cds
xvw @'|
data ends ;数据段结尾 )eIC5>#.
N-Fs-uB
stack segment { R
H&mu
db 400 dup(?) 55q!2>Jh.
stack ends -FpZZ8=,M2
QxS]6hA
code segment ;定义代码段 v3O+ ;4
assume cs:code ;规定cs的内容 =z^2KH
assume ds:data ;规定ds的内容 @+Yql
assume ss:stack -<H\VT%98
!xk`oW
start: VzD LG LH
pusha Z.'
j7(tu
])OrSsV}
u_H=Xm)9
mov ax,data ;程序从start开始 (KxI*
mov ds,ax ;ds置初值,data的段地址 -Pt.
0Xo>f"2<f
;设置缓冲区 |ecK~+
lea bx, buffer QTr)r;Tro
mov bufferaddr,bx &n$k
VNE
mov buff1,bx ,Ei!\U^)
mov bx,ds 4PK/8^@7)>
mov bufferaddr+2,bx 6<1
2j7
mov buff1,bx #O 2g]YH
yX9 .yq
lea di,infosize
C 2t]
mov dl,80h K|L&mL&8
mov ah,48h -&
q@|h'
int 13h S:B$c>
3PkVMX
lea bx,msgcyl !ZNirvk
mov dx,bx f euAT
L]
mov ah,09 2_T2?weD5
int 21h X1*f#3cm#
mov dx,cylinders 8u8-:c%{
call dispdx WbJ|]}hJ\
)R6h
1
lea bx,msghds q)j b9e
mov dx,bx abMB-
mov ah,09 d~#B,+
int 21h GdN9bA&,
mov dx,heads \
SCi\j/a(
call dispdx ]#k=VKdV
mR,w~wP
lea bx,msgspt Z9wKjxu+
mov dx,bx n8 UG{.
=
mov ah,09 $, hHR:
int 21h ^AhV1rBB
mov dx,spt+2 )7]la/0
call dispdx _E %!5u
mov dx,spt (A(j.[4a
call dispdx j<NZ4Rf
;k?Z,M:
lea bx,msgtotal C)UL{n
mov dx,bx D/[;Y<X#V
mov ah,09 7N:3
int 21h =hRo#]{(K
lea bx,sectors Gh%R4)}
call dispqword S)LvYOOB@
[}$jO,H5r
lea bx,msgss =csh=V@s
mov dx,bx -al\*XDz
mov ah,09 ej91)3AO
int 21h :j2?v(jT_l
mov dx,sectorsize (aC~0
#4
call dispdx :2t0//@X
=/5^/vwg
Y
sbb word ptr sectors, 63d elJ?g
&"
jnc subok GF
GW'}w-
sub word ptr sectors+2,1 j(~e{HZ
jnc subok ycq+C8J+Ep
sub word ptr sectors+4,1
m^!Kthq
jnc subok !$u:[T_8
sub word ptr sectors+6,1 4Jn+Ot.,d
0oK_u Y
4g
subok: ,V^2
Oa
E)3Ah!
ygK@\JHn
:$6m
S[@|
xor ax,ax "DO|B=EejP
mov blocknumL, ax kB`
@M>[
mov blocknumL+2, ax >\br8=R
mov blocknumL+4, ax ~=GwNo_
mov blocknumL+6, ax QM('bbN
[KQ#b
startread: dNu?O>=
`T\_Wje(
call rwsect !;3hN$5
p!>5}f6
adc word ptr blocknuml,63d 'm=TBNQTS
jnc addok ?e{hidg
adc word ptr blocknuml+2,1 %$Dn);6=
jnc addok CdZ. T/x
adc word ptr blocknuml+4,1 h+rW%`B
jnc addok b>h
L*9
adc word ptr blocknuml+6,1 7Pe<0K)s(
jnc addok ~3&*>H^U
5GK> ~2c(
addok: k"3@G?JY
mov ax, word ptr sectors+6 ^(kmF UV,Z
cmp ax, blocknuml+6 LZtO Q__B)
jg complete @.&KRAZ
jl startread ?K\r-J!Y
mov ax, word ptr sectors+4 |LV}kG(2
cmp ax, blocknuml+4 t|urv
oz
jg complete ^HhV?Iqg
jl startread )\KU:_l
mov ax, word ptr sectors+2 Sw.k,p*r
cmp ax, blocknuml+2 E3LEeXcLS
jg complete mzf~qV^T
jl startread 2P/ Sq
mov ax, word ptr sectors &w!(.uDO
cmp ax, blocknuml &=*sN`
jg complete R ;k1(p
jl startread )%q!XM
2c*w{\X
complete: VTUSM{TC
6E@TcN~,!
lea bx,msgready B?%e-xV-
mov dx,bx R
X N0v@V
mov ah,09 dVMduo
int 21 buldA5*!o
4A`U [r_>D
popa `+h+X9
mov ax,3100h S5BS![-QK
int 21h '4Drs}j5
dQn,0
; G%A!yV
dispdx proc near s6F0&L;N&
pusha }}qY,@eeX
lea bx, dsp+3 cYgd1
mov cx,4 `]`S"W7&
kyi"U A82
repeat0: r^7eK)XA_
mov al,dl -zg 6^f_pW
and al,0fh 4|&_i)S-Y
cmp al,09h c(b2f-0!4
jg add40 VS\| f'E
add al, 30h f
AY(ro9Q(
jmp okadd (:
P#l&f
add40: A]laS7Q
add al,37h 2FN E ;y(
okadd: 6&+}Hhe
mov byte ptr [bx],al b*(,W
dec bx uZM%F)
shr dx,4 )[ QT?;
loopnz repeat0 <a&w$Zc/
lea bx,dsp .sjv"D"
mov dx,bx w5 #;Lm
mov ah,09h 6d`qgEM3
int 21h -lqD
:d6]rOpX
popa NQx
x_3*4O
ret `>4"i+NFF8
dispdx endp EfB.K}b^
XRmE
dispqword proc near Yl&bv#[z
pusha 2:RFPK
mov cx ,4 mlYkn
add bx,6 U3jnH
repeatdecbx: ce3``W/H3
mov dx,[bx] d]USk&8
call dispdx 2:@,~{`#*
sub bx,2 4T6: C?V
loopnz repeatdecbx i#NtiZ.t=
popa Co,?<v=Ll
ret 5yyc0UG
dispqword endp :N!s@6
5)Z:J
rwsect proc near TNDp{!<|L;
O5MV&Zb(
lea bx,msg Wf3{z
D~
mov dx,bx )<%CI#s#
mov ah,09h #qu;{I#W3
int 21h QFK'r\3pU
n&!q9CR`
lea bx,BlockNumL Q4Nut
call dispqword Mtl`A'KQ/K
N1}r%!jk/
lea di, packetsize I<Cm$8O?
mov dl,80h o5['5?i} /
mov ah,42h T/0cPn0>
int 13h GkxQEL
jnc readok :%gM
Xsb
NoMlTh(O
mov cx,5 PWeWz(]0Z4
;出错后重试(定位0道后再重读) K5RgWP
retryrd: . HN4x
L
lea bx, msgReadErr <*I*#WI&B
mov dx,bx D9 Mst6
mov ah,09 Zt&
7p
int 21h s{OV-H
f%3MDI
i= R%MH+
lea di,dap0 `,O"^zR)z
mov dl,80h SKF0p))BJ
mov ah,44h !UR3`Xk
int 13h ~|[i64V<^
L=<$^ m
lea bx,BlockNumL #)#J`s1R
call dispqword Q,M,^_
]XcWGQv~
lea di, packetsize T_qM@/f
mov dl,80h d;,Jf*x\
mov ah,42h ?\I@w4
int 13h IB$i^
jnc readok XqU0AbQ
loopnz retryrd 0nvT}[\H*
xU2i&il^!
readok: g*Pn_Yo[.
lea di, packetsize ly69:TR7I
mov dl,80h D9H%jDv
mov ah,43h j<QK1d17
int 13h uaYI3w@^
e
x#-,;T
rwsect endp f,kV
[wk1p-hf
code ends ;代码段结尾 l9]nrT1Hy
end start ;结束汇编 rmi&{o:
V["'eJA,,