第一个宏汇编程序 q<L>r?T[
HtUFl
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 uV r6tb1
MS,J+'2
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! Y_3{\g|x
^u zJu(
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! Bb^CukS:
(|_1ku3!
比较长啊!所以可以自动跳过。 Xqt3p6
`+[e]dH
.286 &>UI {
.radix 16 PN ,pEk|
data segment ;定义数据段 ]de'v
b
!FX]d1~k
-s`/5kD
msg db 0dh, "Reading sector:$" c <8s\2
msg1 db 0dh, "Writing sector:$" -4|\,=j
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" S}Wj+H;
CzKU;~D=B
dsp db " $" &n>\ +Q
gVM9*3LH6
;DAP UD|Qa
PacketSize db 16d; // 数据包尺寸(16字节) QMoh<[3qu
Reserved db 0; // ==0 0Fr
mZ$
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) zQJ9V\0
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) _&TA|Da
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 Az29?|e
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 o}&TFhT
pqmS
w
;定位用DAP (复位到0磁道) /; ;_l2 t
DAP0 db 16d kB-%T66\
db 0 ?{W@TY@S
dw 1 T^3_d93}d
buff1 dw 0,0 @^8tk3$Y
dw 0,0,0,0 zc&>RM
zKr\S|yE
X}.y-X#v5J
;DiskParameters .CI {g2
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) A;nrr1-0
falgs dw 0; WORD Flags; // 信息标志 VP
H
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 rPVz!(;k
Heads DW 0; DWORD Heads; // 磁盘磁头数 :kUZNw'Bi
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 F-?K]t#
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 \F;V69'
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) 7e\g
9ALE6
cmpsect dw 0 1
"'t5?XW
TfaL5evio
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" -1Acprr
msgHds db 0dh,0a,"Heads:$" w=.w*?>
msgspt db 0dh, 0a,"SectorsPerTrack:$" "'us.t.
msgTotal db 0d,0a, "Total Sectors:$" 3.M<ATe^
msgSS db 0dh,0a, "Sector Size:$" @= f2\hU
J0BA@jH5
msgReadErr db 0dh,0a,"Error Reading Sectors:$" >p4#AfGF
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" USLG G}R
msgReset db 0dh,0a, "Reseting drive to Cyl 0" o2e aSG
<aJdm!6
X{A|{
u=
buffer db 32768d dup(0); BsV2Q`(gT
(Zi(6 T\z
data ends ;数据段结尾 +cQGX5 K
5gnNgt~
stack segment /t=R~BJu
db 400 dup(?) Xx_v>Jn!
stack ends X~ n=U4s}O
uK6`3lCD
code segment ;定义代码段 N|[P%WM3
assume cs:code ;规定cs的内容 5)fEs.r0
U
assume ds:data ;规定ds的内容 lub(chCE[
assume ss:stack QeP8Vl&e:
|7Fe~TC
start: R I Bj9kd
pusha C$o#zu q-
DIR_W-z
(uV~1
mov ax,data ;程序从start开始 \I J\
mov ds,ax ;ds置初值,data的段地址 M{gtu'.
W]kh?+SZ
;设置缓冲区 1&A@Zo5|
lea bx, buffer 8&g|iG
mov bufferaddr,bx ". jY3<bQg
mov buff1,bx 07WZ w1(;
mov bx,ds >S4klW=*I
mov bufferaddr+2,bx h|h-< G?>
mov buff1,bx M)t d%<_
X;Tayb
lea di,infosize qdoJIP{
mov dl,80h va \5
mov ah,48h [MfKBlA
int 13h c , a+u
+g8wc(<ik
lea bx,msgcyl ?4%'6R
mov dx,bx G}1?lO_d`
mov ah,09 ]O'dwC
int 21h <Cc}MDM604
mov dx,cylinders ~^*IP1.3
call dispdx <rd7<@>5D
nQ4 s
lea bx,msghds fC>3{@h}*
mov dx,bx 9 p6QNDp
mov ah,09 mo1(dyjx
int 21h 1"J\iwN3
mov dx,heads P@P(&{@
call dispdx N1rBpt
__HPwOCG7
lea bx,msgspt '<"eG!O
mov dx,bx _:ypPRJ
mov ah,09 s[h& Uv"G
int 21h xQV5-VoFC
mov dx,spt+2 ("(:wYR%
call dispdx DJ?kQ
mov dx,spt Ei!5Q
ya>
call dispdx ~ B0L7}d
r8\"'4B1
lea bx,msgtotal j0b?dKd
mov dx,bx a nK7j2
mov ah,09 P$z8TDCH
int 21h }HB)%C50.
lea bx,sectors 8x$BbK
call dispqword jQjtO"\JG
`$j"nP F_
lea bx,msgss '`g#Zo
mov dx,bx CAg\-*P|
mov ah,09 b|F_]i T
int 21h
=ML6"jr
mov dx,sectorsize 6x%uWZa'
call dispdx sM)qzO2wh
K)5'Jp@
sbb word ptr sectors, 63d b#%s!
jnc subok C' x?riJ/
sub word ptr sectors+2,1 _,V
9^
jnc subok 7kmU/(8
sub word ptr sectors+4,1 v'Y)~Kv@!
jnc subok k2Yh?OH
sub word ptr sectors+6,1 Bbuy
y
n_5m+
1N
subok: HMsTm}d
o~7~S
D<9FSxl6
-QR&]U+
xor ax,ax jUjgxP*7m
mov blocknumL, ax MONfA;64/
mov blocknumL+2, ax <eRE;8C-
mov blocknumL+4, ax 2\h]*x%:
mov blocknumL+6, ax H\]ZtSw8-
9Z}Y2:l'
startread: QI*Y7R~<
4qq+7B
call rwsect IV$pA`|V
jbx@ty
adc word ptr blocknuml,63d FG.MV-G
jnc addok ycAQHY~n
adc word ptr blocknuml+2,1 fY3^L"R
jnc addok 2_lgy?OE`
adc word ptr blocknuml+4,1 VfAC&3%M
jnc addok \Z0-o&;w
adc word ptr blocknuml+6,1 J@RhbsZn
jnc addok tRU+6D
<w
WE""be8
addok: P/;sZo
mov ax, word ptr sectors+6 3=w$1.B d
cmp ax, blocknuml+6 k.nq,
jg complete [<m1xr4"k
jl startread 6 R}]RuFQ
mov ax, word ptr sectors+4 .6Jo1$+
cmp ax, blocknuml+4 >r+Dl\R
jg complete HO ,
z[6
jl startread P,y*H_@k
mov ax, word ptr sectors+2 g{K*EL<
cmp ax, blocknuml+2 "&;>l<V
jg complete (jYHaTL6Y'
jl startread C?6wIdp
mov ax, word ptr sectors
}C1&}hZ
cmp ax, blocknuml @,
v'V!
jg complete Zcq'u
jU
jl startread ssbvu
Tr
R2kR
complete: JR/:XYS+
4DY\QvW5
lea bx,msgready ?f!w:zp
mov dx,bx lU
WX[,
mov ah,09 hKP7p
int 21 (.~#bl
#"{wm
popa pyA;%vJn
mov ax,3100h ;Awt: jF
int 21h {E*dDv
: vN'eL|#
; @[{9B6NlV
dispdx proc near tr 8a_CV
pusha _[ml<HW]
lea bx, dsp+3 A:$Qt%c
mov cx,4 1fBj21zG
.&O}/B
repeat0: x(J|6Ey7!n
mov al,dl 5S
4kn.3
and al,0fh s=0z%~H
cmp al,09h PCzC8~t
jg add40 ETk4I"
add al, 30h 9\9:)q
jmp okadd XB
add40: dh r)ra]
add al,37h tU2 8l.
okadd: >Micc
mov byte ptr [bx],al
0BF'@r";
dec bx 'TWZ@8h~
shr dx,4 3!_X FV
loopnz repeat0 EA.4m3
lea bx,dsp 5U)Ia>p
mov dx,bx e>`+Vk^Jc
mov ah,09h Fd@n#DR `
int 21h y8"8QH
(V2~txMh
popa ut8v&i1?
ret dg[&5D1Q
dispdx endp &NbhQY`k
c#'t][Ii
dispqword proc near A$gP: 1&m
pusha
Le#>uWM
mov cx ,4 \"!Fw)wj
add bx,6 _;baZ-
repeatdecbx: )}QtK+Rq
mov dx,[bx] kSJWXNC
call dispdx f9FJ:?
sub bx,2 r;}%} /IX
loopnz repeatdecbx
];& @T\Rj
popa P|,@En 1!
ret @=CN#D12
dispqword endp $#R@x.=
+&?#Gdb
rwsect proc near +]I7]
*o<zo
`
lea bx,msg sPMCN's
mov dx,bx y;zp*(}f$h
mov ah,09h nrqr p
int 21h M*M,Z
)C^ZzmB
lea bx,BlockNumL J3Ipk-'lx
call dispqword .Cq'D.
chw6_ctR>
lea di, packetsize R42+^'af
mov dl,80h c*o05pMS
mov ah,42h U .?N
int 13h ;a@%FWc
jnc readok ]%AmX-U
_P6e%O8C#
mov cx,5 iTTUyftHT
;出错后重试(定位0道后再重读) t[HfaW1W
retryrd: %JUD54bBt
lea bx, msgReadErr JC|j*x(k/
mov dx,bx Z$qLY<aV
mov ah,09 $ ?ayE
int 21h :x"Q[079
o+{]&V->gN
E=
3Ui
lea di,dap0 9H^$cM9C
mov dl,80h a2J01B
mov ah,44h fmqHWu*wG
int 13h 9FB k|g"U)
ZDHm@,d
lea bx,BlockNumL TmI~P+5w
call dispqword +<#0V!DM
Mr/;$O{
lea di, packetsize VK>ZH^-
mov dl,80h \0gU)tVZ
mov ah,42h ~mAv)JK
int 13h klkshlk d
jnc readok dk<) \C"
loopnz retryrd |~)!8N.{
*F:f\9
readok: AQAZ+g(IK
lea di, packetsize /2 V
mov dl,80h )1#J4
mov ah,43h AlZ]UGf^
int 13h tf1iRXf8
5d ?\>dA
rwsect endp `h%(ZG~
WC2sRv4]3
code ends ;代码段结尾 44e:K5;]7
end start ;结束汇编 3zC<k2B
hnOo T? V