第一个宏汇编程序 -
|1H-[Y(
;N+
v
x
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 |)%]MK$;
#9R[%R7Nz
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! ;HKb
,s=jtK
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! XsH(8-n0
y#Cp Vm#!>
比较长啊!所以可以自动跳过。 jCJbmEfo9@
R1!F mZW8
.286 %_kXC~hH_
.radix 16 B~%'YQk
data segment ;定义数据段 ^A&i$RRO
6}V)\"u&
[H~Yg2O
msg db 0dh, "Reading sector:$" ;q=0NtCS=4
msg1 db 0dh, "Writing sector:$" t Ye+7s
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" bHJKX>@{
g]fds Zv
dsp db " $" [Ej#NHs
8Ce|Q8<8]
;DAP m7dpr$J
PacketSize db 16d; // 数据包尺寸(16字节) ';'TCb{f *
Reserved db 0; // ==0 $`KddW0_
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) +2DzX/3
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) "-y2En
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 ,H_b@$]n8
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 73n|G/9n[
ym\AVRO{
;定位用DAP (复位到0磁道) "PFczoRZ
DAP0 db 16d >"OwdAvX
db 0 dwH8Zg$B
dw 1 | c:E)S\
buff1 dw 0,0 ;8|D4+
dw 0,0,0,0 P M
x`
PB
k!&G; 6O-
-K"" 4SC2
;DiskParameters \t
pJ
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) Z$UPLg3=;_
falgs dw 0; WORD Flags; // 信息标志 <N4)X"s
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 rP5&&Hso
Heads DW 0; DWORD Heads; // 磁盘磁头数 TO(2n8'fdO
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 TT85
G
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 DGs=.U-=e
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) 5}
v(Ks>
Vxr_2Kra
cmpsect dw 0 WFGcR9mN?
dkHye>
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" Dw%V.J/&o
msgHds db 0dh,0a,"Heads:$" 2#srecIz-!
msgspt db 0dh, 0a,"SectorsPerTrack:$" . J/x@
msgTotal db 0d,0a, "Total Sectors:$" .o27uB.
msgSS db 0dh,0a, "Sector Size:$" +*W9*gl
:Dh\
msgReadErr db 0dh,0a,"Error Reading Sectors:$" S.: m$s
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" y v$@i A
msgReset db 0dh,0a, "Reseting drive to Cyl 0" miWPLnw=L
eT(/D/jan
<yoCW?#
buffer db 32768d dup(0); ^#6"d+lp
6%jv
|\>
data ends ;数据段结尾 Lip(r3
d9j+==S
<
stack segment `6R.*hq
db 400 dup(?) pCB^\M%*
stack ends -\6";
_Y
1 #zIAN>
code segment ;定义代码段 BLepCF38
assume cs:code ;规定cs的内容 O#}d!}SIp
assume ds:data ;规定ds的内容 \d"uR@$3mG
assume ss:stack Ok0zgi
F!>92H~3G
start: h20<X;
pusha .C6wsmQ
G}2DZ=&>'
T<jo@z1UL
mov ax,data ;程序从start开始 }3b3^f
mov ds,ax ;ds置初值,data的段地址 iY|zv|;]=
5B|
&+7dCw
;设置缓冲区 /~8<;N>,+
lea bx, buffer (f-Mm0%[
mov bufferaddr,bx G{ |0}
mov buff1,bx Q
NN*/n
mov bx,ds CMcS4X9/}
mov bufferaddr+2,bx B%]yLJ
mov buff1,bx ?g~w6|U(r
IInsq
lea di,infosize nnzfKn:J
mov dl,80h 8\AyKw
mov ah,48h 6w? l
I
int 13h Mu1H*;_8
&Zzd6[G+
lea bx,msgcyl tom1u>1n
mov dx,bx (Xak;Xum1
mov ah,09 N7wKaezE
int 21h a/4!zT
mov dx,cylinders
eX{:
&Do
call dispdx vU4Gw4
Bql5=p
lea bx,msghds \zdY$3z
mov dx,bx zL^`r)H
mov ah,09 ~o<+tL
int 21h rXIFCt8J
mov dx,heads ~BUzyc%
call dispdx {?!0<0
@Sik~Mm_h
lea bx,msgspt z1K}] z%
mov dx,bx mY)Y47iL
mov ah,09
OI8Hf3d=
int 21h =6sA49~M
mov dx,spt+2 #mK/xbW
call dispdx M1Frn n
mov dx,spt A`#/:O4|f
call dispdx n#US4&uT4A
Y=NXfTc
lea bx,msgtotal b0PQ;?R#V
mov dx,bx
~.:9~(2;
mov ah,09 l[,RA?i
{
int 21h LR(Q.x
lea bx,sectors j O-H1@;
call dispqword ms(Z1ix^
%(P\"hE'
lea bx,msgss E$4_.Z8sRw
mov dx,bx 71RG1,
mov ah,09 #4yh-D"
int 21h M0B6v}^H
mov dx,sectorsize X\=m
call dispdx :2Fy`PPab
tx+KxOt9Y
sbb word ptr sectors, 63d ym]12PAU5
jnc subok M%3P@GRg
sub word ptr sectors+2,1 2cB){.E
jnc subok MV(Sb:RZ
sub word ptr sectors+4,1 A89n^@
jnc subok FX->_}kL=
sub word ptr sectors+6,1 XEUy,>mR
Ej[:!L
subok: i"B q*b@
9Kpzj43
1#Ls4+]5
1"hd5a
xor ax,ax tc|`cB3f
mov blocknumL, ax 7])cu>/
mov blocknumL+2, ax FFG/v`NM
mov blocknumL+4, ax fQ[&
^S$
mov blocknumL+6, ax LH@x
r\^
u%s@B1j
startread: &'mq).I2
'XbrO|%
call rwsect K3; lst>4
!{WIN%O
adc word ptr blocknuml,63d I6.!0.G
jnc addok QE#Ar8tU
adc word ptr blocknuml+2,1 AZHZUd4
jnc addok I7S#vIMXR.
adc word ptr blocknuml+4,1 #W]4aZ1
jnc addok l%f&vOcd
adc word ptr blocknuml+6,1 8V08>M
jnc addok I,nW~;OV0
ytDp
4x<W)
addok: yF _@^V
mov ax, word ptr sectors+6 21LJ3rW_
cmp ax, blocknuml+6 `R\nw)xq
jg complete u2FD@Xq?
jl startread HCCEIgCT
mov ax, word ptr sectors+4 +=N!37+G
cmp ax, blocknuml+4 &az
:YTq
jg complete lMQ_S"
jl startread 5PRS|R7
mov ax, word ptr sectors+2 ='\Di '*
cmp ax, blocknuml+2 *l-f">?|
jg complete 7GFE5>H
jl startread TV['"'D&i
mov ax, word ptr sectors `Z'h[-2`
cmp ax, blocknuml hoDE*>i
jg complete b3vPGR
jl startread 4Y>J,c
2_i9
q>I
complete: )-u0n],
6Hh\ys
lea bx,msgready yu~o9
mov dx,bx 9>OPaLn
mov ah,09 Q4[^JQsR2
int 21 O'WBO"
4g%BCGsys
popa H}p5qW.tH:
mov ax,3100h #Bih=A
#
int 21h &Q>tV+*
5gg
Yg$
; $vR#<a,7>
dispdx proc near rsGQ
:
c
pusha zxo"
+j4Ym
lea bx, dsp+3 iPuX
mov cx,4 FG6bKvEQm^
`"-ln'nw
repeat0: K<g<xW* X
mov al,dl 8M~^/Zc
and al,0fh ^z^zsNx
cmp al,09h %x]8^vze
jg add40 ov9+6'zya
add al, 30h 7gx
7NDt
jmp okadd r](%9Y
add40: 'f
"KV|
add al,37h Mx]![O.ye
okadd: =.Hq]l6+
mov byte ptr [bx],al } vzNh_
dec bx -aV!ZODt
shr dx,4 K8R}2K-Y
loopnz repeat0 >Av[`1a2F
lea bx,dsp 6F)^8s02h
mov dx,bx qb[UA5S\`
mov ah,09h C 7a$>#%
int 21h zZhA]J
AWG;G+
popa 01_*^iCf5
ret YWK|AT-4
dispdx endp O^L#(8bC
O,c}T7A'?w
dispqword proc near ;/79tlwq
pusha
sx]kH$
mov cx ,4 yPmo@aw]1
add bx,6 2d:5~fEJp
repeatdecbx: 5.TeH@(
mov dx,[bx] PL}c1Ud
call dispdx BPwn!ii|
sub bx,2 C@n
s`Eh8w
loopnz repeatdecbx }}Kjb
popa nRSiW*;R
ret ~Q3y3,x
dispqword endp ~x #RIt
g2|qGfl{C
rwsect proc near wr~Ydmsf
lR8Lfa*/7
lea bx,msg xl]1{$1M
mov dx,bx c?/R=/H
mov ah,09h "dItv#<:}
int 21h dsiQ~ [
!4 =]@eFk
lea bx,BlockNumL |GLh|hr
call dispqword K8?]&.!
2K~<_.S
lea di, packetsize |u@/,x/t
mov dl,80h Nj^:8]D)0
mov ah,42h AY
B~{
int 13h t!2
85J8tn
jnc readok fK?/o]vq
,P.yl~'Al
mov cx,5 c(j|xQ\pE
;出错后重试(定位0道后再重读) fp)%Cr
retryrd: Af`qe+0E
lea bx, msgReadErr 937 z*mh
mov dx,bx +5k^-
mov ah,09 c2o.H!>
int 21h 7%0V ?+]P
gAPD
y/wM
%p(!7FDE2n
lea di,dap0 |({ M8!BS
mov dl,80h
#sRkKl|
mov ah,44h Y;uQq-C P
int 13h &%\H170S
\Aa{]t
lea bx,BlockNumL Mnx')([;W
call dispqword ~w,c6Z
L#>^R
lea di, packetsize NU <K+k
mov dl,80h 6A;,Ph2
mov ah,42h ;&2f {
int 13h
{}A1[Y|
jnc readok 7+Z%#G~T
loopnz retryrd pFW^
<5t2 +D]]}
readok: (]}52%~
lea di, packetsize _=Eb
:n+X
mov dl,80h pOKs VS%fT
mov ah,43h ?\.DG`Zxc
int 13h +bhR[V{0g
PCkQ hR
rwsect endp zcrM3`Zh
)b7 ;w#%q
code ends ;代码段结尾 iKVJ
c=C
end start ;结束汇编 /]@1IC{Lk
[WXa]d5
Y