第一个宏汇编程序 cq'opjLf 5
JZp*"UzQr
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 vjG:
1|*e
s8| =1
{
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! [>"bL$tlo*
OL]^4m
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! bWv4'Y!p
k%\_UYa
比较长啊!所以可以自动跳过。 V\zf yH\~
`fEB,0j^
.286 `"v5bk
.radix 16 \oF79
data segment ;定义数据段 nu,#y"
WQ
"|CzQ&e
@R=gJ:&a
msg db 0dh, "Reading sector:$" #n^P[Zw
msg1 db 0dh, "Writing sector:$" w]n20&
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" v\*43RL
YmM+x=G:
dsp db " $" de{KfM`W;
qr%9Sdvx
;DAP u7>b}+ak&
PacketSize db 16d; // 数据包尺寸(16字节) YV*s1t/
Reserved db 0; // ==0 nA
n/V u
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) D%v4B`4ua'
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) jR@j+p^e
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 H{'<v|I
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 ]trVlmZXH}
P F!S
;定位用DAP (复位到0磁道) ^Yei9bXl
DAP0 db 16d 2=X 2M
db 0 6#XB'PR2p
dw 1 3X$)cZQ
buff1 dw 0,0 8P r H"pI
dw 0,0,0,0 @SA*7[?P
ZCi~4&Z#
>W"g
r]R<
;DiskParameters vS-k0g;
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) <@FOqi{o{
falgs dw 0; WORD Flags; // 信息标志 Efi@hdEV
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 V,bfD3S3
Heads DW 0; DWORD Heads; // 磁盘磁头数 >{i/LC^S
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 &LE,.Q34
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 &| %<=\
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) P0J3ci}^
$x5P
5^Y
cmpsect dw 0 ud K)F$7
<va3L y)c&
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" ]gYnw;W$
msgHds db 0dh,0a,"Heads:$" c[]_gUp8
msgspt db 0dh, 0a,"SectorsPerTrack:$" v8"plx=3
msgTotal db 0d,0a, "Total Sectors:$" 5EDN 9?a
msgSS db 0dh,0a, "Sector Size:$" i(9=` A}
&^e%gU8!\
msgReadErr db 0dh,0a,"Error Reading Sectors:$" \1'3--n
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" gB@Xi*
msgReset db 0dh,0a, "Reseting drive to Cyl 0" *6~ODiB
3*$A;%q
FjIS:9^)t5
buffer db 32768d dup(0); @-bX[}.
5Qhu5~,K
data ends ;数据段结尾 D<$~bUkxR
][-N<
stack segment t>|Y-i3cb
db 400 dup(?) FblwQ-D
stack ends h+Km |
Tl=cniy]
code segment ;定义代码段 LZm6\x
assume cs:code ;规定cs的内容 ?Y2ZqI
assume ds:data ;规定ds的内容 !%x8!;za
assume ss:stack Pw/Z;N;:V
e2Sm.
H '
start: UKp- *YukT
pusha zVe@`gc
eRQ}`DjTk
b:/ ;
mov ax,data ;程序从start开始 }l&Uh&B`
mov ds,ax ;ds置初值,data的段地址 0Vv6B2<
AOQimjW9a
;设置缓冲区 J&}/Xw)
lea bx, buffer lk{
mov bufferaddr,bx \o9-[V#Gm
mov buff1,bx 6\ /x
mov bx,ds D/jB.
mov bufferaddr+2,bx Ei2Y)_
mov buff1,bx yiGq?WA7
Z^,C><Yt
lea di,infosize an^"_#8DA@
mov dl,80h 2bxkZS]
mov ah,48h fk4s19;?
int 13h `;b@a<Wl
/*g3TbUs
lea bx,msgcyl egboLqn
mov dx,bx `O
(ec
mov ah,09 zu&5[XL
int 21h O{a<f7 W
mov dx,cylinders X-9>;Mb
~y
call dispdx / <WB%O
n'=-bj`
lea bx,msghds <b>@'\w9
mov dx,bx y0>asl
mov ah,09 A_1cM#4
int 21h Mk"+*G
mov dx,heads 7PO3{I
call dispdx 8R Wfv}:X
cVJ"^wgBt
lea bx,msgspt WS8m^~S@\
mov dx,bx ')t
:!#
mov ah,09 {~>?%]tf
int 21h emOd<C1A
mov dx,spt+2 6 ]W!>jDc
call dispdx Yu-e|:
mov dx,spt xc[@lr
call dispdx C4],7"Sw
w\k|^
lea bx,msgtotal 9tsI1]1[m
mov dx,bx t9SzZ2E
mov ah,09 _x 'R8/
int 21h {]<l|qK
lea bx,sectors /%|JP{
call dispqword IRNL(9H
$u_0"sUV
lea bx,msgss XVAyuuTg\
mov dx,bx QlJ
cj+_h
mov ah,09 3}=r.\]U
int 21h
E%OY7zf`%
mov dx,sectorsize {8UYu2t
call dispdx ~C=I{qzF+
?D-1xnxep
sbb word ptr sectors, 63d ?>5[~rMn
jnc subok F<q'ivj:w
sub word ptr sectors+2,1 t
m
?[0@<s
jnc subok i`/_^Fndyu
sub word ptr sectors+4,1 J]/TxUE
jnc subok IY6DZP
sub word ptr sectors+6,1 ES!$JWK|
;hGC.}X
subok: c^vPd]Ed
PE3FuJGz
F,Q\_H##x4
7l> |G,[c
xor ax,ax r#iZ FL3q
mov blocknumL, ax qPZ'
n=+
mov blocknumL+2, ax u
Jy1 vI
mov blocknumL+4, ax dt(~)*~R
mov blocknumL+6, ax N&7=
hni
Wr Ht
startread: K,e"@
G
zvV<0 Z
call rwsect }#'wy
QQUeY 2}
adc word ptr blocknuml,63d "OF4#a17
jnc addok HQ
~`ha.
adc word ptr blocknuml+2,1 |m7U^
jnc addok :8aa #bA
adc word ptr blocknuml+4,1 $ysemDq-a\
jnc addok u- PAi5&n
adc word ptr blocknuml+6,1 OQMkpX-dH
jnc addok R06L4,/b
sS;6QkI"y
addok:
J$
mov ax, word ptr sectors+6 ,#[0As29u
cmp ax, blocknuml+6 z+I'N4*^
jg complete j_*$Avy
jl startread t!QuM_i3
mov ax, word ptr sectors+4 1ael{
b!
cmp ax, blocknuml+4 _O)xE9t#ru
jg complete nf&PDv1
jl startread z(2pl}
mov ax, word ptr sectors+2 1>P[3Y@}
cmp ax, blocknuml+2 dfY(5Wc+f
jg complete qd#?8
jl startread O=UXe]D
mov ax, word ptr sectors 0X@!i3eu
cmp ax, blocknuml .gTla
jg complete vN:gu\^-
jl startread 3~Od2nk(x
\"Z^{Y[,;
complete: >Jh*S`e
S9
R(;
lea bx,msgready i2KN^"v?N
mov dx,bx {Vw+~8
mov ah,09 X.hU23w
int 21 z<aB GG
r_nB-\
popa $Llv6<B
mov ax,3100h YXI_ '
int 21h v+uq
y
G\^PD
; pSp/Qpb-B
dispdx proc near M#X8Rs1`
pusha f =@'F=
lea bx, dsp+3 VZo[\sWf
mov cx,4 zWKnkIit,
)QYg[<e6
repeat0: m3W:\LTTp
mov al,dl bA}9He1
and al,0fh HA&7
ybl
cmp al,09h )3# gpM
jg add40 1Q\P]
-
add al, 30h H'k $<S
jmp okadd _+PiaJ&'
add40: sC
>_ulkoa
add al,37h I^"ouM9}Q
okadd: ?q a
mov byte ptr [bx],al zaW y7@?
dec bx /ivcqVu]
shr dx,4 K
;\~otR^
loopnz repeat0 )!.ef6|
lea bx,dsp yO*~)ALb+
mov dx,bx
lM1~K
mov ah,09h it]im
int 21h mM&Sq;JJ;
TI4#A E
popa i!g}PbC[
ret ~!UC:&UKo
dispdx endp CXt9 5O?
`G*7y7
dispqword proc near hhd%j6
pusha O
]o7
mov cx ,4 +GCN63nX
add bx,6 p=%Vo@
*]
repeatdecbx: O b'B?
mov dx,[bx] S:)Aj6>6
call dispdx y4*i
V;"
sub bx,2 :5Vk+s]8
loopnz repeatdecbx su;u_rc,
popa .4on7<-a
ret xi['knUi2-
dispqword endp 2%|
Pyh+HD\
rwsect proc near G8=2=/ !
zh`!x{Z?^
lea bx,msg MU6|>{
mov dx,bx ~C[p}MED
mov ah,09h p F kA,
int 21h vD<6BQR
HVO
mM17
lea bx,BlockNumL eewhT^
call dispqword *69{#qN
TNe,'S,%
lea di, packetsize AsFn%8_I
mov dl,80h e RY2.!
mov ah,42h MzjV>.
int 13h _8t5rF
jnc readok ^X-3YhJ4U
!5,>[^y3
mov cx,5 1o"/5T:S[
;出错后重试(定位0道后再重读) R_9 &V!fl
retryrd: ql"&E{u?
lea bx, msgReadErr .{+KKa $@G
mov dx,bx t8X$M;$
mov ah,09 AGaM
&x=
int 21h o6`4y^Q{/
6v8HR}iK
,=sbK?&
lea di,dap0 @}[ >*Xy%
mov dl,80h Ku;|Dz/=o
mov ah,44h \7b-w81M-
int 13h .EeXq}a[
MKVz'-`u
lea bx,BlockNumL ZK:dhwer
call dispqword x/~qyX8vo
?LJ$:
u
lea di, packetsize l-s%3E3
mov dl,80h :
5)Dn87
mov ah,42h UNLmnj;-Q
int 13h \H<gKZquR
jnc readok ;:
<z hO
loopnz retryrd >tF3|:\
;R[ xo!
readok: ^n8ioL\*i
lea di, packetsize ]0
N'Wtbn
mov dl,80h |OW/-&)
mov ah,43h &\<!{Y<'
int 13h q5
eyle6
7$3R}=Z`\q
rwsect endp FY;\1bt<<
YywiY).]@
code ends ;代码段结尾 m(0sG(A~
end start ;结束汇编 k3[rO}>s
1B}q?8n