第一个宏汇编程序 &9>d
AJmzg
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 T~Cd=s(T"
71InYIed
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! ,8seoX^
DFMWgBL
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! P8f-&(
~r3g~MCHS
比较长啊!所以可以自动跳过。 y C#{nUdw
+l\Dp
.286 98"N UT
.radix 16 Heu@{t.[!D
data segment ;定义数据段 R
>TtAm0N
!/SFEL@_B
b;vO
`
msg db 0dh, "Reading sector:$" HN+z7 Q8hH
msg1 db 0dh, "Writing sector:$" Sz&`=x#
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" V
Euv
i^(<E0vS
dsp db " $" P<~
y$B
Z)~2{)
;DAP kC
V OeXv
PacketSize db 16d; // 数据包尺寸(16字节) fx},.P=:*
Reserved db 0; // ==0 &V$R@~x
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) $}@ll^
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) \9DTf:!4Z
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 S6
*dp68
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 \T?O.
"fdG5|NJe
;定位用DAP (复位到0磁道) "]<Ut{Xb
DAP0 db 16d tti.-
db 0 <jF <_j
dw 1 A
yDK-8a
buff1 dw 0,0 +]X^bB[
dw 0,0,0,0 *0@e_h
-|5&3HVz
HO>uS>+
;DiskParameters x,+zw9
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) ge|}'QKow
falgs dw 0; WORD Flags; // 信息标志 hpU7
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 5h&8!!$[
Heads DW 0; DWORD Heads; // 磁盘磁头数 rcOmpgew
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 jiat5
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 $Fj7'@1(
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) NbdaP{{
tP9}:gu
cmpsect dw 0 Ue7~rPdlR
fi1UUJ0
U;
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" /+iaw~={"
msgHds db 0dh,0a,"Heads:$" gd*\,P
msgspt db 0dh, 0a,"SectorsPerTrack:$" 'E9jv4E$n
msgTotal db 0d,0a, "Total Sectors:$" UT -=5
msgSS db 0dh,0a, "Sector Size:$" ?QgWW
827N?pU$)
msgReadErr db 0dh,0a,"Error Reading Sectors:$" ?`xId;}J#7
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" _F9
c.BH
msgReset db 0dh,0a, "Reseting drive to Cyl 0" ofJ@\xS
:
SNp"|
,aeFEs
i
buffer db 32768d dup(0); z3,z&Ra
WG,{:|!E
data ends ;数据段结尾 4{V=X3,x
%/7`G-a.B
stack segment /dAIg1ra
db 400 dup(?) j,Y=GjfGM
stack ends P06K0Fxf
/D12N'VaE
code segment ;定义代码段 tF4"28"h
assume cs:code ;规定cs的内容 " 1Bn/Q
assume ds:data ;规定ds的内容 DIY WFVh
assume ss:stack LS`Gg7]S
Oo E@30+
start: 4s~o
pusha hn-S$3')`
J
GdVSjNC
d 9|u
~3
mov ax,data ;程序从start开始 V>hy5hDpH
mov ds,ax ;ds置初值,data的段地址 ty ~U~
d;z`xy(C
;设置缓冲区 ;]gph)2cd
lea bx, buffer @m6E*2Gg
mov bufferaddr,bx L_(|5
#IDw
mov buff1,bx :\ S3[(FV
mov bx,ds kci H
mov bufferaddr+2,bx |b@-1
mov buff1,bx I'";
2neiUNT
lea di,infosize "(5M }5D
mov dl,80h C..O_Zn{g
mov ah,48h ev>: 3_ s
int 13h KQk;:1hW
"2)T=vHi#
lea bx,msgcyl P)3e^~+A
mov dx,bx wS4zAu
mov ah,09 (Q@+W|~
int 21h : v]< h
mov dx,cylinders g#e"BBm=A
call dispdx g)zy^aDf
_$\T;m>'A
lea bx,msghds q8U]Hyp(`
mov dx,bx *N 't ;
mov ah,09 MxY CMe4S[
int 21h B,676~I
mov dx,heads JSM{|HJxh
call dispdx j%lW+[%
_+GCd8d
lea bx,msgspt j=7 ]"%
mov dx,bx yuND0,e
mov ah,09 /<@oUv
int 21h /)|*Vzu
mov dx,spt+2 rl4-nA
call dispdx q
o'1Pknz
mov dx,spt 9%x[z%06
call dispdx oD.f/hi0|
Fw|5A"9'a'
lea bx,msgtotal b3Do{1BV
mov dx,bx mesR)fTI
mov ah,09 :)+cI?\#
int 21h M/BBNT
lea bx,sectors PpbW+}aCF
call dispqword "ey~w=B$M
h5~
tsd}OU
lea bx,msgss ?O.&=im_
mov dx,bx 1iUy*p65:
mov ah,09 jYU#]
|k~
int 21h #JVcl $0
Y
mov dx,sectorsize T =:^k+
call dispdx E|No$QO)
|
#,b1|af
sbb word ptr sectors, 63d !=a8^CV
jnc subok DY1o!thz)
sub word ptr sectors+2,1 RAe:$Iv$!v
jnc subok $Uzc
sub word ptr sectors+4,1 ,+2ytN*
jnc subok ex-`+cF
sub word ptr sectors+6,1 &.d~
M1Mz
WHU&9N
subok: ^uYxeQY[
JV@>dK8
@521zi
L%!jj7,9-
xor ax,ax U!('`TYe
mov blocknumL, ax qh=lF_%uj
mov blocknumL+2, ax )yjHABGJ
mov blocknumL+4, ax c1c0b|B!U
mov blocknumL+6, ax hNQ,U{`;^
`jP6;i
startread: K]RkKMT,
!d ZHG
R
call rwsect b.$Gc!g
*-2u0 %
adc word ptr blocknuml,63d MVV<&jho{^
jnc addok +_+}^Nf]Y3
adc word ptr blocknuml+2,1 Zf|f $1-
jnc addok `74A'(u_
adc word ptr blocknuml+4,1 IKpNc+;p
jnc addok bY#>
adc word ptr blocknuml+6,1 x;
ujR<
jnc addok ,#<"VU2 bC
^Xh9:OBF
addok: +&|WC2#
mov ax, word ptr sectors+6 =_,w<
cmp ax, blocknuml+6 eI- ~
+.
jg complete srUpG&Bcx
jl startread X_XqT
mov ax, word ptr sectors+4 <#:"vnm$j
cmp ax, blocknuml+4 mI}'8.
jg complete k)4
jl startread WO]dWO6Mm
mov ax, word ptr sectors+2 qUCiB}
cmp ax, blocknuml+2 $AoN,B>
jg complete Hq=RtW2
jl startread 4%B${zP(.}
mov ax, word ptr sectors oSxHTbp?
cmp ax, blocknuml C0'Tua'
jg complete i2EB.Zlv
jl startread o#G7gzw)
d"$ \fL
complete: &}rh+z
^}9Aq $R
lea bx,msgready ndN8eh:OR
mov dx,bx !IP[C?(nB
mov ah,09 vQztD_bX%
int 21 9v^MZ^Y{
JI(8{ f
popa \ ddbqg?`
mov ax,3100h uRJLSt9m
int 21h -8g ;t3z
_uL m !ku
; O0wD"V^W
dispdx proc near xZBmQ:s',S
pusha <UeO+M(
lea bx, dsp+3 \07
s'W U
mov cx,4
Krz[ f
HdLVXaD/
repeat0: V"gnG](2l
mov al,dl w<5w?nP+Oh
and al,0fh "#(]{MY
cmp al,09h JIDE]f
jg add40 `XQM)A
add al, 30h Yk[yG;W
jmp okadd C%l~qf1n
add40: zf#V89!]C"
add al,37h !DD|dVA{
okadd: Aqq%HgY:t
mov byte ptr [bx],al haS`V
dec bx ?mnwD ]u
shr dx,4 IeE+h-3p
loopnz repeat0 a(!:a+9WOP
lea bx,dsp ]x! vPIyq
mov dx,bx l1a=r:WhH
mov ah,09h jPhOk>m
int 21h A\gj\&B0"
8\/E/o3
popa (m})V0/`
ret sy4$!,W:
dispdx endp BT>8
R|Y)ow51
dispqword proc near W +C\/
pusha Es1Yx\/:
mov cx ,4 !\^c9Pg|v
add bx,6 tPc '#.
repeatdecbx: zS]Yd9;X1
mov dx,[bx] Bm1yBKjO
call dispdx ,Epg&)wC]
sub bx,2
!1;DRF
loopnz repeatdecbx tvZpm@1
popa 9_oIAn
:<
ret $}N'm
dispqword endp V\^?V|
-_v[oqf$
rwsect proc near (q*Za
F(:+[$)
lea bx,msg P6dIU/w
mov dx,bx oljl&tuQy
mov ah,09h !ZHPR:k|
int 21h (:-=XR9
A`
G
?H`9*y
lea bx,BlockNumL
n~k;9`
call dispqword }B^KV#_{S
-&y{8<bu4H
lea di, packetsize L3'o2@$
mov dl,80h {^5r5GB=*
mov ah,42h a'rN&*P
int 13h Lr_+)l
jnc readok | \ C{R
RR*<txdN
mov cx,5 d2Bn`VI
;出错后重试(定位0道后再重读) jmz, 1[
retryrd: %mg |kb6n
lea bx, msgReadErr J8~3LE
)G
mov dx,bx 5,k&^CK}
mov ah,09 1vu=2|QN
int 21h g.Z>9(>;Y
%#Fd0L
hI]KT a
lea di,dap0 r)q6^|~47
mov dl,80h t
:sKvJ
mov ah,44h aV,>y"S
int 13h c"v#d9
Kmk<
lea bx,BlockNumL mS6L6)] S
call dispqword 8 }nA8 J
j8YMod=
lea di, packetsize P.=&:ay7?
mov dl,80h 3;@t{rIin
mov ah,42h \,oT(p4N%M
int 13h Wl?*AlFlk
jnc readok iE0A-;:5
loopnz retryrd C
3b
[?yOJU%`
readok: ^;!A`t
lea di, packetsize #Q"el3P+q
mov dl,80h x=gZ7$?A
mov ah,43h 5,|^4
ZA
int 13h 0'% R@|
P10`X&
rwsect endp ;q59Cr 75
O\-cLI<h2
code ends ;代码段结尾 Ay22-/C|@
end start ;结束汇编 8S&`
kbOdg: