第一个宏汇编程序 kd+tD!:F(
Uf
v0Xj
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。
m"tke'a
W
;ADc2#)
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 5gbD|^ij
f<l.%B
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! A\T9>z^k
2hFj+Ay
比较长啊!所以可以自动跳过。 zJT,Hv .
^ Mw=!n[
.286 [eZ'h8
.radix 16 .tt= \R
data segment ;定义数据段 _VI3b$
)ioIn`g^-
HFTDea +#
msg db 0dh, "Reading sector:$" >&l{_b\k
msg1 db 0dh, "Writing sector:$" x(bM
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" '^~38=FA
&ZAc3@l[c
dsp db " $" &E$:^a4d
9<6Hs3|.!
;DAP .8/W_iC92
PacketSize db 16d; // 数据包尺寸(16字节) *kKdL
Reserved db 0; // ==0 <PTi>C
8;r
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) Zm#qW2a]P
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) H <ugc
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 .Af H>)E
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 xD4G(]d!
73tWeZ8rvx
;定位用DAP (复位到0磁道) 6uubkt
DAP0 db 16d =*Y=u6?
db 0 .9KW|(uW
dw 1 b@yFqgJ_
buff1 dw 0,0 vp..>B
MJ
dw 0,0,0,0
z+F:_
q.69<Rs
n^$HC=}S
;DiskParameters w"?E=RS
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 2~q(?wY
falgs dw 0; WORD Flags; // 信息标志 UCS`09KNJ
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 hv8j$2m
Heads DW 0; DWORD Heads; // 磁盘磁头数 @d_;p<\l
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 Ll'!aar,
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数
$-;x8O]u
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) MRL,#+VxA
.}DL%E`n
cmpsect dw 0 k80!!S=_>
v m)'CC
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" Q2K)Nl >_
msgHds db 0dh,0a,"Heads:$" 77o&$l,A|
msgspt db 0dh, 0a,"SectorsPerTrack:$" Y~uqKb;A
msgTotal db 0d,0a, "Total Sectors:$" eKek~U&
msgSS db 0dh,0a, "Sector Size:$" fqS
cf}s
?KtvXTy{m
msgReadErr db 0dh,0a,"Error Reading Sectors:$" S[L2vM)
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" ~ZXAW~a}
msgReset db 0dh,0a, "Reseting drive to Cyl 0" <n|.Z-gF\
ybgAyJ{J<
~AG."<}
buffer db 32768d dup(0); jN^09T49
IX
y
$
data ends ;数据段结尾 )0xEI
70{fl
4J5
stack segment a@U0s+V&a0
db 400 dup(?) E?3$ *
t
stack ends Ehf3L |9
{GM8}M~D&
code segment ;定义代码段 4Q
FX
assume cs:code ;规定cs的内容 %QKRl5RM-
assume ds:data ;规定ds的内容 "f3KE=cUm
assume ss:stack @iD5X.c
hV>@
qOl
'
start: wO3K2I]>0
pusha NJTC+`Hm
z]F4Z'(e.
&4-rDR,
mov ax,data ;程序从start开始 fE&wtw{gi
mov ds,ax ;ds置初值,data的段地址 ky98Bz%
6N]V.;0_5
;设置缓冲区 1$adX
lea bx, buffer _=68iDXm
mov bufferaddr,bx DC8,ns]!y
mov buff1,bx ]6 vqgu
mov bx,ds ht@s!5\LK
mov bufferaddr+2,bx Dt8wd,B
mov buff1,bx \~`qE<Q/
H-Z1i
lea di,infosize b6~MRfx`7
mov dl,80h "J (.dg]"
mov ah,48h <u
85>x
int 13h n*U
+jc
?5#=Mh#
lea bx,msgcyl W_z?t;
mov dx,bx xtP=/B/
mov ah,09 [Q*aJLG
int 21h yyVv@
mov dx,cylinders )XAD#GYM
call dispdx /"%QIy'{
3O!TVSo
lea bx,msghds 4*aNdh[t.
mov dx,bx FWzf8*^
mov ah,09 4Iou|
H
int 21h b(McH*_8e
mov dx,heads Z,bv D'u
call dispdx J>Uzd,
/
9X PQ1LSx
lea bx,msgspt
.4-I^W"1
mov dx,bx %*wOJx
mov ah,09
ua!g}m~
int 21h KV$J*B
Y
mov dx,spt+2 +
s snCr
call dispdx IfGQeynj
mov dx,spt a,U@ !}K
call dispdx lj o^ 2
9QryW\6.@z
lea bx,msgtotal Obm@2;^g6
mov dx,bx 3U73_=>=&
mov ah,09
UCP4w@C
int 21h m+/-SG
lea bx,sectors =#c?g Wb56
call dispqword 1*Ui=M4
I+^B] @"
lea bx,msgss !^*I?9P
mov dx,bx qg;fh]j%
mov ah,09 @43o4,
int 21h k(v8zDq*
mov dx,sectorsize T c{]w?V
call dispdx "x$RTuWA9
=w&<LJPJ
sbb word ptr sectors, 63d bs_"Nn?
jnc subok 7VwL
yy
sub word ptr sectors+2,1 y~N,=5>j
jnc subok ^"d!(npw
sub word ptr sectors+4,1 h.W;Dmf6]
jnc subok 4x
JOPu
sub word ptr sectors+6,1 k$7@@?<
;qF#!Kb5
subok: e!(0y)*
<