第一个宏汇编程序 AxeQv'e
W)'*Dcd
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 eSHsE3}h
*>2e4j]
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! M!i*DU+SE
t/_\w"
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 4|\
fg lN_
比较长啊!所以可以自动跳过。 JTObyAoW
*3]2vq
.286 R"l6|9tmP
.radix 16 ~0[(-4MA
data segment ;定义数据段 7w]3D
ysPm4am$
IVy<>xpt
msg db 0dh, "Reading sector:$" p]<)6sZ
msg1 db 0dh, "Writing sector:$" :iGK9I
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" S}cR+d1}h
C/QrkTi=
dsp db " $" 5<e{)$C
=M}tet
}
;DAP )a5ON8?
PacketSize db 16d; // 数据包尺寸(16字节) "ZPgl 8
Reserved db 0; // ==0 _s<s14+od
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) (5CgC<
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) \ueCbfV!Z4
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 ]')y(_{
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 w~:F?
59p'U /|
;定位用DAP (复位到0磁道) a5aHv/W#P
DAP0 db 16d ;Qi!~VsP;
db 0 6QJ.=.>b
dw 1 .R#-u/6g(
buff1 dw 0,0 |ICn/r~
dw 0,0,0,0 lMG+,?<uK&
CI\yP@DQ4
RNQq"c\
;DiskParameters C#8A|
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) n).*=YLN
falgs dw 0; WORD Flags; // 信息标志 F|VKrH.
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 O jNOvh&N
Heads DW 0; DWORD Heads; // 磁盘磁头数 Onh
R`
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ti$60Up
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 BsL+9lNue
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) m`):= ^nC
"shX~zd5
cmpsect dw 0 8TG|frS
d`C$vj
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 'Z:wEt!
msgHds db 0dh,0a,"Heads:$" ]Yf^O @<<>
msgspt db 0dh, 0a,"SectorsPerTrack:$" {p$@)b
msgTotal db 0d,0a, "Total Sectors:$" *]}F=dtR k
msgSS db 0dh,0a, "Sector Size:$" ';!-a]N
cr|]\
msgReadErr db 0dh,0a,"Error Reading Sectors:$" c##tP*(
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" f$9|qfW'$
msgReset db 0dh,0a, "Reseting drive to Cyl 0" ZJ~0o2xZ'
Ujlbcv6+
8'_MCx(
buffer db 32768d dup(0); u c}tTmB|
"q1S.3V
;
data ends ;数据段结尾 }K`KoM
Om;aE1sW
stack segment 8)1=5n
db 400 dup(?) WW+F9~S
stack ends 5UOqS#"0
p Q!lY
code segment ;定义代码段 >I<}:=
assume cs:code ;规定cs的内容 dA E85
assume ds:data ;规定ds的内容 oO`a {n-
assume ss:stack uMpuS1
23Dld+E&
start: %Ofw"W
pusha K:kb&W
OCJt5#e~A
/I1n${{
5
mov ax,data ;程序从start开始 SAj#+_db
mov ds,ax ;ds置初值,data的段地址 :WsHP\r
zb4{nzX=
;设置缓冲区 jKo9y
lea bx, buffer Z{:;LC
mov bufferaddr,bx iq?T&44&
mov buff1,bx GU9G5S.
mov bx,ds s$,G5Feub
mov bufferaddr+2,bx +> d;%K
mov buff1,bx (+0(A777M
ZHUW1:qs
lea di,infosize 2+?W{yAEi
mov dl,80h m @lUJY
mov ah,48h (C1~>7L
int 13h BTYYp1
{\NBNg(Vo
lea bx,msgcyl `p1B58deC
mov dx,bx SS24@:"{
mov ah,09 <RpTk*Yo^=
int 21h tN_=&|{WE4
mov dx,cylinders KATf9-Sz
call dispdx U$y wO4.
=tY%`e
lea bx,msghds ==gL!e{
mov dx,bx 3$Vx8:Rhdn
mov ah,09
BlZB8KI~
int 21h xpCZlOld
mov dx,heads S:Jg#1rww-
call dispdx r[T(R9k
'r ^.Ao5
lea bx,msgspt 'h7x@[|
mov dx,bx \jV2":[%c
mov ah,09 :-lq Yd5^
int 21h aMxj{*v7
mov dx,spt+2 MxUbx+_N
call dispdx m/jyc#
L:u
mov dx,spt N$v_z>6Z
call dispdx k@s<*C
7'65+c[&
lea bx,msgtotal Qds:*]vGS
mov dx,bx "EA =auN{
mov ah,09 N`$F>E,T%
int 21h ?'|GGtvm
lea bx,sectors fAz4>_4
call dispqword E2t&@t%W
V6_5v+n
lea bx,msgss -q[x"Ha%
mov dx,bx Y2'HP)tfIw
mov ah,09 6uKth mr
int 21h LAM{
,?~
mov dx,sectorsize n/ :#:
call dispdx W`c$2KS?DO
98
| v.d
sbb word ptr sectors, 63d :SW
vH- ]
jnc subok t#8QyN
sub word ptr sectors+2,1 6v]`s
jnc subok 8B-mZFXpK
sub word ptr sectors+4,1 {T,}]oX
jnc subok Q4*{+$A
sub word ptr sectors+6,1 =S6bP<
q
2hso6Oy/v{
subok: !.MbPPNp
kOdpW
2L[!~h2
2<h~:
L
xor ax,ax 64'QTF{D
mov blocknumL, ax +-SO}P
mov blocknumL+2, ax f2pA+j5[
mov blocknumL+4, ax zHg=K /
mov blocknumL+6, ax GUD]sXSj
<gGO
startread: w|6?A-
w1(5,~OB
call rwsect SK&
1l`3
b/JjA
adc word ptr blocknuml,63d -5]lHw}
jnc addok iPY)Ew`Im
adc word ptr blocknuml+2,1 oR!h
eCnu
jnc addok Q9h=1G\K
adc word ptr blocknuml+4,1 "PWGtM:L8Y
jnc addok rZ5xQ#IA
adc word ptr blocknuml+6,1 E(_k#X
jnc addok |,S]EHIy
k%\y,b*
addok: ^'du@XCf}
mov ax, word ptr sectors+6 :f%kkatO
cmp ax, blocknuml+6 >?)_, KL
jg complete :xq{\"r
jl startread _Gt
;=
mov ax, word ptr sectors+4 6R8>w,
cmp ax, blocknuml+4 [\ Sd*-
jg complete BFP@Yn~k
jl startread 1Z;cb0:
mov ax, word ptr sectors+2
)*6
cmp ax, blocknuml+2 1{]S[\F]
jg complete Nu3IYS5&
jl startread t6`(9o@}
mov ax, word ptr sectors R.l!KIq
cmp ax, blocknuml %C #Ps
jg complete d0|{/4IWw;
jl startread {q+
gm1iC
6I=xjgwvf
complete: #O,w{S
~;pP@DA
lea bx,msgready )c1Pj#|
mov dx,bx @jjxgd'%&
mov ah,09 5D?{dA:Rq
int 21 8''1H<f
" W{rS4L
popa Z+EZ</'(a
mov ax,3100h CS*lk!C
int 21h ,'t&L]
\o3s&{+y,
; [McH l1a
dispdx proc near #*lDKn[vO
pusha "X._:||8
lea bx, dsp+3 ])bgUH
mov cx,4 uHbbPtk
y!:vX6l
repeat0: f\=,_AQ
mov al,dl \I/"W#\SJo
and al,0fh I(3~BOUn_
cmp al,09h UY,u-E"
jg add40 !>!jLZ0
add al, 30h xaB#GdD
jmp okadd 23K#9!3
add40: #lSGH 5Fp?
add al,37h nRw.82eK.
okadd: ]5:[6;wS
mov byte ptr [bx],al Q%!xw(
dec bx
z
#|Auc0
shr dx,4 P s|[
loopnz repeat0 hH-!3S2'
lea bx,dsp -kP2
Brm
mov dx,bx q o-|.I
mov ah,09h 7@y}J5,
int 21h dD'KP4Io@
=w8
0y'
popa F3$8l[O_
ret V4CA*FEA
dispdx endp K.&6c,P]
Mh3L(z]/E
dispqword proc near nygeR|:\
pusha BT;1"l<
mov cx ,4 )k[XO
add bx,6 53pfo:1'
repeatdecbx: <nV 3`L&]
mov dx,[bx] X}h}3+V
call dispdx tQyQ+1
sub bx,2 "Wk K1u
loopnz repeatdecbx |F'eT
4
popa
mI:D
ret 0R+p\Nc&1
dispqword endp =>Z4vWX*
OI:=>Bk
rwsect proc near ){u#
(sW
;0$qT$,
lea bx,msg )@y'$)5s
mov dx,bx LV
0gw"
mov ah,09h =%>E8)Jb
int 21h ~R=p[h)
-;HZ!Lf
lea bx,BlockNumL N!v>2"x8q
call dispqword 4\
)WMP
,If"4C!w
lea di, packetsize #a9R3-aP
mov dl,80h [xGL0Z%)t
mov ah,42h qX6zk0I a
int 13h <; Td8O89_
jnc readok s2 aFme
dvY3=~'
mov cx,5 JJM!pD\ h
;出错后重试(定位0道后再重读) I{H!KrM!
retryrd: |
pU>^
lea bx, msgReadErr f4dHOH
mov dx,bx Dk")/ ib
mov ah,09 z5<&}Vh;P
int 21h Oq3t-omXS
zH~g5xgh
A] o3MoSt
lea di,dap0 ;
+Ie<oW
mov dl,80h yTe25l{QaF
mov ah,44h &?y|Pn
int 13h =KnHa.%
=M4wP3V/
lea bx,BlockNumL i*09m^r
call dispqword (tzAUrC
u8<Fk
!
lea di, packetsize cZrJW
mov dl,80h ~U1: 0
mov ah,42h @Y(7n/*
int 13h
+, rm
jnc readok %)^0NQv
loopnz retryrd xs"\c7pC
n4"xVDL
readok: bZQ_j#{$
lea di, packetsize @}+B%R
mov dl,80h AI9=?X<kh
mov ah,43h *>o@EUArN
int 13h Spo[JQ%6
Kl(u~/=6
rwsect endp ~+RrL,t#
#0#6eT{-
code ends ;代码段结尾 Hb^ovc0
end start ;结束汇编 t)(>E'X
x
G"vEtNoV