第一个宏汇编程序 CfP-oFHoQ
US(RWXyg
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 + xO3<u
DuR9L'
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! fCF.P"{W"
3Il._]#
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! u)I\
R\N
f\_PNZCc
比较长啊!所以可以自动跳过。 k'H[aYMA
EPH" 5$8
.286 {FKr^)g
.radix 16 /j}Tv.'d
data segment ;定义数据段 #$-?[c$>
K sE$^`
GD]epr%V
msg db 0dh, "Reading sector:$" ~%g,Uypi
msg1 db 0dh, "Writing sector:$" u_
l?d
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 3di;lzGq
zIu/!aw
dsp db " $" "
)\V
?%qaoxG37
;DAP +y8Y@e}>
PacketSize db 16d; // 数据包尺寸(16字节) zGyRzxFN
Reserved db 0; // ==0
Y6H?ZOq
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) &Tuj`DL
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) 1Q!^*D
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 g3&nxZ
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 3*2~#dh=
Ky,upU
;定位用DAP (复位到0磁道) R6oD
DAP0 db 16d <I
tS_/z
db 0 N>"L2E=z$|
dw 1 5[jS(1a`c
buff1 dw 0,0 8h@L_*Kr
dw 0,0,0,0 *AW v
M9BEG6E9
2|& S2uq
;DiskParameters {d;z3AB
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) yq[/9Pci A
falgs dw 0; WORD Flags; // 信息标志 9X=<uS
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 T$%QK?B
Heads DW 0; DWORD Heads; // 磁盘磁头数 l5Ko9CG
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 }Oc+E
V-Z
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 Nc{&AV8Y_v
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) H1B%}G*Ir-
Nr `R3(X
cmpsect dw 0 Ys}^hy
d;0]xG?%=
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" Y
z&!0Hfd
msgHds db 0dh,0a,"Heads:$" SJa>!]U'xI
msgspt db 0dh, 0a,"SectorsPerTrack:$" :??W3
ROn
msgTotal db 0d,0a, "Total Sectors:$" 1G5 AL2
msgSS db 0dh,0a, "Sector Size:$" ksOsJ~3)
KB|mtsi
msgReadErr db 0dh,0a,"Error Reading Sectors:$" R2a99# J
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" c1s&
msgReset db 0dh,0a, "Reseting drive to Cyl 0" Xm>zT'B_tJ
-V}xvSVg
43B0ynagN
buffer db 32768d dup(0);
I[\7Bf
gjN'D!'E1D
data ends ;数据段结尾 EJTM
>Rpor
X5VNj|IE
stack segment }EkL[H!
db 400 dup(?) J( XDwt
stack ends ,3T"fT-(
M.}J SDt
code segment ;定义代码段 QY&c=bWAX"
assume cs:code ;规定cs的内容 em3+V
assume ds:data ;规定ds的内容 rZ3ji(4HS
assume ss:stack *nJ,|T
>.`*KQdan
start: d]O:VghY\
pusha l~o!(rpX
S sW<,T
E] /2u3p
mov ax,data ;程序从start开始 `14@d
k
mov ds,ax ;ds置初值,data的段地址 (1^;l;7H
{\0V$#q
;设置缓冲区 y,|2hrj/0E
lea bx, buffer ud5}jyJ
mov bufferaddr,bx 'Gc{cNbXIA
mov buff1,bx CZu=/8?
mov bx,ds SF+L-R<e
mov bufferaddr+2,bx saiXFM7J
mov buff1,bx QJ(%rvn3
Bt}90#
lea di,infosize S%}G 8Ty
mov dl,80h RIXeV*ix
mov ah,48h G>0d^bx;E
int 13h T5zS3O
N WF h<
lea bx,msgcyl #UL75
mov dx,bx ZwLr>?0$
p
mov ah,09 hIV]
ZYbH
int 21h )G^k$j
mov dx,cylinders tB~#;:g
call dispdx SN ?Z7
e(
@</W
lea bx,msghds axvZA:l
mov dx,bx 'vVWUK956
mov ah,09 Y`]P&y
int 21h tyW}=xs
mov dx,heads
JFX}))7
call dispdx ZJZSt% r
c(
U,FUS
lea bx,msgspt upaP,ik}~
mov dx,bx `b8n
z 7
mov ah,09 [niFJIsc
int 21h *1kFy_Gx
mov dx,spt+2 &(Fm@ksh\
call dispdx VED~v#.c
mov dx,spt Qw2-Vv4!"
call dispdx }RadbJ{q=
t :YZua
lea bx,msgtotal l9Ol|Cb&
mov dx,bx K=0xR*ll5
mov ah,09
2hF^U+I}
int 21h EG`AkWy
lea bx,sectors '=Zm[P,
call dispqword 5wx~QV=Hh
YFJaf"?8g
lea bx,msgss fb `x1Q
mov dx,bx Z8bg5%
mov ah,09 8b]4uI<
int 21h "kFH*I+v
mov dx,sectorsize <Qih&P9;>
call dispdx u3O@ccJ;
6}I X{nQI
sbb word ptr sectors, 63d :E6*m\X!3
jnc subok ,:L^vG@*
sub word ptr sectors+2,1 H i8V=+
jnc subok |"9&F
sub word ptr sectors+4,1 B//*hH >F
jnc subok Cfmd*,
sub word ptr sectors+6,1
}
M% 3
Uvm.|p_V
subok: ^0| :
L5`k3ap|
iu8Q &Us0P
dFw+
nGN
xor ax,ax Mi|13[p{
mov blocknumL, ax lPxhqF5pP
mov blocknumL+2, ax j#2Xw25
mov blocknumL+4, ax Fy<:iv0>t
mov blocknumL+6, ax J~WT;s
eo4z!@pRN
startread: wM
R,r@}
CqC
)H7A
call rwsect l3 F$5n
W7uX
adc word ptr blocknuml,63d K)>F03=uE
jnc addok )4B`U(%M~
adc word ptr blocknuml+2,1 :stHc,
jnc addok X/:V{2
adc word ptr blocknuml+4,1 OXQA(%MK
jnc addok K
|=o -
adc word ptr blocknuml+6,1 ,NZllnW
jnc addok |}z5S
T%
;y\/7E
addok: EIQ3vOq6
mov ax, word ptr sectors+6 ~%=%5}
cmp ax, blocknuml+6 |=YK2};
jg complete X[dfms;H
jl startread T~/>U&k}J
mov ax, word ptr sectors+4 !;&\n3-W
cmp ax, blocknuml+4 ohKoX$|p~
jg complete & tT6.@kH
jl startread o5&b'WUJ=
mov ax, word ptr sectors+2 _ncBq;j{
cmp ax, blocknuml+2 ~$K{E[^<
jg complete .tG3g:
jl startread IKP_%R8.
mov ax, word ptr sectors i*:QbMb
cmp ax, blocknuml vFdI?(c-
jg complete tT)s,R%
jl startread ,}'8.
f
oH0g>E;
complete: `B3-#!2X
d)!'5ZrM
lea bx,msgready =Mwuhk|*
mov dx,bx 5\h 6"/6Df
mov ah,09 S
JP3mq/^K
int 21 KZ[TW,Gw
q>BJ:_I
i
popa myX&Z F_9
mov ax,3100h ZKEoU!
int 21h E~WbV+,3
KO8{eT9d
; 9Jh&C5\\
dispdx proc near MF'Z?M
pusha P!f0&W
lea bx, dsp+3 E3j`e>Yz
mov cx,4 #N`G2}1J
'J} ?'{.
repeat0: tDL.+6/
mov al,dl !J;Bm,Xn6
and al,0fh auAz>6L
cmp al,09h ,i}EGW,9q
jg add40 :tO4LEb
add al, 30h 2#5Q~
jmp okadd )-[$m%
add40: %/e'6g<
add al,37h d'MZ%.#
okadd: ,5Wu
mov byte ptr [bx],al cS YCMQ1ro
dec bx 9FSa=<0wE
shr dx,4 L:Rg3eo
loopnz repeat0 WcSvw
lea bx,dsp \K\eq>@6
mov dx,bx J61%a,es
mov ah,09h }[z7V
int 21h BZ.l[LMp
e.MyJ:eL
popa
6T4DuF
ret |g}r
dispdx endp AFL'Ox]0
\jk*Nm8;
dispqword proc near )tJaw#Mih
pusha ]QJ5JtD-
mov cx ,4 -j<E_!t
add bx,6 Tf5m
YCk
repeatdecbx: jSvq1$U
mov dx,[bx] kBA.N l7
call dispdx bi}aVtG~z
sub bx,2 _GxC|d
loopnz repeatdecbx [>dDRsZ
popa dh6kj-^;Cf
ret o NA ]G]
dispqword endp .
yfp-n4H
V*rLGY#
rwsect proc near /d|:
3AdYZ7J
lea bx,msg q%d'pF
mov dx,bx j"~"-E(79
mov ah,09h
YC6guy>
int 21h 9>-6Y
x#SE%j?
lea bx,BlockNumL L bJf5xdi
call dispqword &@@PJ!&
EgPL+qL
lea di, packetsize z@e(y@
mov dl,80h jG&HPVr
mov ah,42h g
#74c'+
int 13h N,XjZ26
jnc readok i ?pd|J
xF3FY
0U[
mov cx,5 1SS1P0Ur
;出错后重试(定位0道后再重读) g,iW^M
retryrd: rQT%~oM:
lea bx, msgReadErr C;:=r:bth
mov dx,bx _Cz98VqRk
mov ah,09 0U%tjYk(
int 21h bnkZWw'9
zMp vS rc
`~d7l@6F
lea di,dap0 FXT^r3
mov dl,80h rZ(#t{]=!
mov ah,44h A/a=)su
int 13h BhAT@%
,S
dj"C
lea bx,BlockNumL (|AZO!
call dispqword ,(h-
1qAE)8ie
lea di, packetsize #]1jvB
mov dl,80h o9|
OL
mov ah,42h LyvR].p=5*
int 13h u=L Dfn
jnc readok egA*x*8
loopnz retryrd %`s#p` Ol1
{06-h %qr
readok:
-!7Z
lea di, packetsize ]XlBV-@b
mov dl,80h c0e[vrP:
mov ah,43h {9 |*au(K
int 13h ,OwTi:yDr
d<xi/
rwsect endp 0#'MR.,
H~JgZ pw
code ends ;代码段结尾 ^bP
pcm=
end start ;结束汇编 zx8@4?bK
:F6dXW