第一个宏汇编程序 ?$ Uk[
$*G]6s
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 q~;P^i<Y
{>5z~OV
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 8T&m{s
TAi
|]U!
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! ~*L H[l>K
E IsA2 f
比较长啊!所以可以自动跳过。 r&o%n5B
lh(A=hn"n
.286 S;Lqx5Cd
.radix 16 ;k (}~_
data segment ;定义数据段 1&i!92:E
xPq3Sfg`A
$B2*
x$
msg db 0dh, "Reading sector:$" 9cQKXh:R.
msg1 db 0dh, "Writing sector:$" #Ru+|KL
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" shYcfLJ
]\+bx=
dsp db " $" ?N,a {#w
Q'7o_[o/
;DAP RVXRF_I
PacketSize db 16d; // 数据包尺寸(16字节) mu=u!by.E
Reserved db 0; // ==0 6!+xf
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) nC_<pq^tr
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) Lyt6DvAp"
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 P7 (&*=V
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 ,HUs MCXQ
KynQ<
I/
;定位用DAP (复位到0磁道) S]K^wj[
DAP0 db 16d (xG#D;M0
db 0 B5=L</Aj
dw 1
R)nhgp(~
buff1 dw 0,0 |jEKUTv,G
dw 0,0,0,0 [LjYLm%<
r\'3q'7p
yJ/m21f
;DiskParameters M\enjB7k
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) @wl80v
falgs dw 0; WORD Flags; // 信息标志 WxWgY}`
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 u17Da9@;
Heads DW 0; DWORD Heads; // 磁盘磁头数 +ulX(u(,
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 FK
}x
*d
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 1Q#hanh_`
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) riFE.;
rouD"cy
cmpsect dw 0 s^L\hr
5c'rnMW4+p
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" $`{}4,5M
msgHds db 0dh,0a,"Heads:$" h*_r='
E
msgspt db 0dh, 0a,"SectorsPerTrack:$" R?Iv<(I
msgTotal db 0d,0a, "Total Sectors:$" 4w2V["?X1
msgSS db 0dh,0a, "Sector Size:$" v@Otp
&fiDmUxj
msgReadErr db 0dh,0a,"Error Reading Sectors:$" A5ktbj&gy<
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" ir \ d8.
msgReset db 0dh,0a, "Reseting drive to Cyl 0" VF<{Qx*
N^%[
B9D
I".d>]16|
buffer db 32768d dup(0); |Ro\2uSr
F]M3/M
data ends ;数据段结尾 0:v7X)St
SY>N-fW\H:
stack segment Y5c( U)R8
db 400 dup(?) T/-PSfbkj
stack ends nUd(@@%m
.zBSjh_=H
code segment ;定义代码段 :3Ty%W&&
assume cs:code ;规定cs的内容 'G@Npp)&^
assume ds:data ;规定ds的内容 S9
U9;>g
assume ss:stack B 8C3LP}?
r/:9j(y
xr
start: 6&.[:IHw
pusha _$MoMg{uJH
}..}]J;To
*M"lUw#(f
mov ax,data ;程序从start开始 JeWW~y`e?{
mov ds,ax ;ds置初值,data的段地址 0kmVP~K
<ywxz1 i
;设置缓冲区 C\$7C5/
lea bx, buffer n)$ q*IN"
mov bufferaddr,bx r}
"Ty
mov buff1,bx AGLzA+6M
mov bx,ds w2/%e$D!9
mov bufferaddr+2,bx r[EN`AxDb
mov buff1,bx \<