第一个宏汇编程序 RUY7
Y?
O=__w *<
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 HMVP71
RKLE@h7[?
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! V
u")%(ix
eb7UA=[Z
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! -k + jMH
6UCF w>
比较长啊!所以可以自动跳过。 hh4R
`E|i8M3g
.286 ?22U0UF
.radix 16 L9jT:2F
data segment ;定义数据段 n1%2sV)>
H+*3e&
eipg,EI
msg db 0dh, "Reading sector:$" ZH~bY2^;
msg1 db 0dh, "Writing sector:$" /mwUDf 6x
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" pW+uVv,
75a3hPCZ
dsp db " $" iw#~xel<ez
rC@VMe|0
;DAP xVB
rwkk(
PacketSize db 16d; // 数据包尺寸(16字节) =%8 yEb*5#
Reserved db 0; // ==0 NU=2*gM
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) #E+ybwA
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) s
[GHDQ;!
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 1v&!%9
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 et5lfj
lEl.'X$
;定位用DAP (复位到0磁道) 7R:j^"I@
DAP0 db 16d 7 "eK<qJ
db 0 brp3xgQ`]
dw 1 LqYyIbsvf
buff1 dw 0,0 af<h2r
dw 0,0,0,0 )bM,>x
*=i&n>
p2Khfl6-
;DiskParameters N3$1f$`
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) Muwlehuq
falgs dw 0; WORD Flags; // 信息标志 Uha.8
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 3qTr|8`s
Heads DW 0; DWORD Heads; // 磁盘磁头数 7:B/?E
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 TG;[,oa
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 NsI. mTc2
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) D?#l8
{9(0s| pr
cmpsect dw 0 5Pf=Uj6D
3IRur,|'
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" ypEMx'p
msgHds db 0dh,0a,"Heads:$" 7;+G)44
msgspt db 0dh, 0a,"SectorsPerTrack:$" e6MBy\*n
msgTotal db 0d,0a, "Total Sectors:$" }E ]l4N2
msgSS db 0dh,0a, "Sector Size:$" UYxn?W.g
(Y'cxwj%
msgReadErr db 0dh,0a,"Error Reading Sectors:$" ' pgPQM<
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" eL~xS: VT
msgReset db 0dh,0a, "Reseting drive to Cyl 0" a4UwhbH
JPF6zz
l)
\ Bj{.jL
buffer db 32768d dup(0); g8cBb5(L
u<8b5An;
data ends ;数据段结尾 Ck#e54gJX
%}(`?
stack segment /=YNkw5
db 400 dup(?) $y6 <2w%b
stack ends zG$5g^J
A|LO!P,w
code segment ;定义代码段
!p$p 7
assume cs:code ;规定cs的内容 /a*){JQ5j
assume ds:data ;规定ds的内容 O?g;Ny
assume ss:stack PR5N:Bw
Gtaa^mnxD
start: T9R#.y,
pusha 6=n|Ha
H.ZF~Yuw
lrZ]c:%k
mov ax,data ;程序从start开始 @'>RGaPV
mov ds,ax ;ds置初值,data的段地址 s! 2[zJ19p
qkKl;Z?Y:
;设置缓冲区 )!v"(i.5Xo
lea bx, buffer uD@ZM
mov bufferaddr,bx (o*YGYC
mov buff1,bx /[dMw
*SRz
mov bx,ds `(H
vD] l
mov bufferaddr+2,bx 6yy%_+k*
mov buff1,bx FzEs1hpl
:pM8Q1:B
lea di,infosize A:Wr5`FJ
mov dl,80h ^vMlRt;
mov ah,48h E"9(CjbQ[
int 13h MrzD
ah9UG
0U~$u
lea bx,msgcyl 7f+@6jqD\)
mov dx,bx Q>D//_TF
mov ah,09 $F^VtCx2&
int 21h I#xdksY
mov dx,cylinders "a].v 8l!
call dispdx !`
%j#bv
tx7 zG.,
lea bx,msghds Y_Fn)(
mov dx,bx O|sk"YXF
mov ah,09
7LU^Xm8
int 21h PwW$=M{\.
mov dx,heads KANR=G
call dispdx !#pc@(rE
K ,NmDc^
lea bx,msgspt FkrXM!mJ
mov dx,bx ;[;WEA
mov ah,09 Mv%Qze,\V^
int 21h ( mp
mov dx,spt+2 k6M D3c
call dispdx FBwG3x
mov dx,spt 1N(#4mE=
call dispdx y>}r
L9O;K$[s
lea bx,msgtotal .^*;hZ~4%
mov dx,bx nHm29{G0
mov ah,09 ^+Nd\tp
int 21h zYV{ |Z
lea bx,sectors _%R^8FjH*
call dispqword
)YgntI@
/i8OyRpSyk
lea bx,msgss kf>3T@
mov dx,bx
>=97~a+.
mov ah,09 &V1d"";SZ
int 21h Hk;;+ '-
mov dx,sectorsize *-PjcF}Y
call dispdx }x
C2~
[3bPoAr\
sbb word ptr sectors, 63d ^7\kvW
jnc subok lv=q( &
sub word ptr sectors+2,1 2`*w*
jnc subok RAl/p9\A+
sub word ptr sectors+4,1 { Z
k^J
jnc subok #WZat
?-N
sub word ptr sectors+6,1 R_B0CM<!
%W9R08`
subok:
j7ZxA*
!.,J;Qt
e1a\--
Ik^^8@z
xor ax,ax 6&0@k^7~
mov blocknumL, ax .Pj<Pe
mov blocknumL+2, ax K
-:y
mov blocknumL+4, ax [hSJ)IZh
mov blocknumL+6, ax %:'G={G`QH
h#Z["BG
startread: d)1gpRp
aC`>~uX##V
call rwsect OGg\V
V'
VIdKe&,
adc word ptr blocknuml,63d D&pn@6bB
jnc addok |P]W#~Y-
adc word ptr blocknuml+2,1 w\s`8S
jnc addok B>c$AS\5y
adc word ptr blocknuml+4,1 )Xg5=zn$
jnc addok 5e.aTW;U
adc word ptr blocknuml+6,1 Mq<ob+
jnc addok rmzzbLTu
|hxiARr4
addok: `$Rgn3
mov ax, word ptr sectors+6 dJ
I }uQ
cmp ax, blocknuml+6 :0:Tl/)
)
jg complete Y
f!O o
jl startread ,2$<Pt;
mov ax, word ptr sectors+4 eMnK@J
cmp ax, blocknuml+4 'UhHcMh:
jg complete !DOyOTR&3
jl startread QNOdt 2NN
mov ax, word ptr sectors+2 _|["}M"?
cmp ax, blocknuml+2 .x%w#
jg complete `2]0 X#R
jl startread pWKE`x^
mov ax, word ptr sectors >I
\B_q
cmp ax, blocknuml 1v|-+p42
jg complete }(8
>&
jl startread 0&sa#g2
pDlrK&;\z
complete: BL 1KM2]
]O@iT= *3
lea bx,msgready 0Qa0
mov dx,bx OM0r*<D"!
mov ah,09 }},0#Ap
int 21 avq$aq(3&
rs?Dn6:;B
popa (a#gCG\
mov ax,3100h >\[]z^J
int 21h j yD3S
a3
.2c/V
; :wS&3:h
dispdx proc near l+@;f(8}
pusha sR1_L/.
lea bx, dsp+3 _cQ
'3@
mov cx,4 ]uox ^HC
=oI[E~1<
repeat0: vcdVck@
mov al,dl enJ;#a
A
and al,0fh uQ-GJI^t
cmp al,09h AMjr[!44 @
jg add40
J{b#X"i
add al, 30h ^'E^*R
jmp okadd PolJo?HZ
add40: fYjmG[4
add al,37h W"Y)a|rG%
okadd: Cg]|x+
mov byte ptr [bx],al *"WP*A\
1
dec bx
j5/pVXO
shr dx,4 P4Pc;8T@!
loopnz repeat0 |&8XmexLb
lea bx,dsp ^+D/59I
mov dx,bx zEFS\nP}E
mov ah,09h 4+q,[m-$(
int 21h E#+2)Q
=KHb0d |.
popa @CzFzVmF"
ret |gI>Sp%Fu
dispdx endp xg/(
N_NN0
dispqword proc near ? Vd~
pusha b_RO%L:"yL
mov cx ,4 9k ~8n9
add bx,6 Q&:)D7m\)S
repeatdecbx: 5N
ZuaN
mov dx,[bx] :@i+yN cV
call dispdx zA9q`ePS
sub bx,2 syBpF:`-W
loopnz repeatdecbx G^t)^iI"'
popa Kg';[G\
ret kMCP .D45;
dispqword endp AB/${RGf+
Zb=NcEPGy
rwsect proc near AuQ|CXG-\
a6n@
lea bx,msg ^(^P#EEG
mov dx,bx 5kw
K%
mov ah,09h nrKAK^
int 21h ISC>]`
QIMd`c
lea bx,BlockNumL V8 8u-
call dispqword {.$7g8]I
Y"bm4&'
lea di, packetsize UDr1t n
mov dl,80h -:%QoRCy
mov ah,42h
B1_9l3RM
int 13h F%-@_IsG#
jnc readok g)czJ=T2
P}8hK
mov cx,5 Ag9GYm
;出错后重试(定位0道后再重读) 1ARtFR2C{b
retryrd: jdG2u
p
lea bx, msgReadErr UCcr>
mov dx,bx ,;}
mov ah,09 Pg T3E
int 21h !6=s{V&r1
b\ED<'
6"G(Iq'2t3
lea di,dap0 9f0`HvHC
mov dl,80h E7/UsUV.
mov ah,44h !6-t_S
int 13h 0]7jb_n1
6Sd:5eTEQ
lea bx,BlockNumL C`[2B0
call dispqword >KuNHuHu
m+'1c}n^7
lea di, packetsize hx0 t!k(3
mov dl,80h f?.VVlD
mov ah,42h )8oyo~4?
int 13h .5;
JnJI
jnc readok O~qRHYv
loopnz retryrd NW6;7nWb
LmJjO:W}^y
readok: |_p7vl"
lea di, packetsize $V3If
mov dl,80h <lFHmi$qt{
mov ah,43h \@Cz 32wg
int 13h I*TTD]e'X
\m|5Aqs
rwsect endp dYISjk@
[!%5(Ro_
code ends ;代码段结尾 o=Z:0Ukl]
end start ;结束汇编 ;U4O` pZ
c\ZI
5&4jT