第一个宏汇编程序 LP8o7%sv!
;7)OSGR
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 k\%,xf; x
krwf8!bI
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧!
{\F2*P
bL#sn_(m
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! @V7;TJk
-^y1iN'D
比较长啊!所以可以自动跳过。 e ^-3etx
*SXSF95
.286
l`oT:
.radix 16 vN'VDvVM
data segment ;定义数据段 EqYz,%I%
A>[hC{
|#!eMJ&0
msg db 0dh, "Reading sector:$" a?l_-Fi
msg1 db 0dh, "Writing sector:$" Y9/{0TArG
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" US"2O!u
37,L**Dgs
dsp db " $" !+%Az*ik
J~fuW?a]r
;DAP /;[}=JL<Q
PacketSize db 16d; // 数据包尺寸(16字节) EOofa6f&l
Reserved db 0; // ==0 L>i<dD{
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) pEJ#ad
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) T R+Q4Y:
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 7d%A1}Bq$
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 fWqv3nY^
rn[$
x(G
;定位用DAP (复位到0磁道) 0LZ=`tI
DAP0 db 16d ;cnnqT6
db 0 `s#sE.=
o
dw 1 `f2W;@V0
buff1 dw 0,0
aKaR
dw 0,0,0,0 Am]2@ESUP
]gjr+GV
G!-7ic_4
;DiskParameters 6j?FRs
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) ,,zd.9n
falgs dw 0; WORD Flags; // 信息标志
aViJ
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 MP_A<F
Heads DW 0; DWORD Heads; // 磁盘磁头数 Bd/}
%4V\@
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ;sm"\.jF
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ^7J~W'hI
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) AfuXu@UZ_/
BJ_+z gf`
cmpsect dw 0 i#Ne'q;T
Q|6Ls$'$
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" ]L[JS^#7
msgHds db 0dh,0a,"Heads:$" EaJDz`T}
msgspt db 0dh, 0a,"SectorsPerTrack:$" z0=Rp0_W
msgTotal db 0d,0a, "Total Sectors:$" t00\yb^vJ8
msgSS db 0dh,0a, "Sector Size:$" J~M H_N
S a(yjF1
msgReadErr db 0dh,0a,"Error Reading Sectors:$" [BJ$|[11
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" N:"M&EUM
msgReset db 0dh,0a, "Reseting drive to Cyl 0" )R8%wk?2
$:T<IU[E
Smi%dp.
buffer db 32768d dup(0); TB;3`
dxk;@Tz
data ends ;数据段结尾 ce 7Yr*ZB
>Iu]T{QNO
stack segment _K*\}un2
db 400 dup(?) s@.`"TF.7
stack ends +R3
\cRM
)w^GPlh
code segment ;定义代码段 "u .)X3
assume cs:code ;规定cs的内容 A%.J%[MVz
assume ds:data ;规定ds的内容
dcV,_
assume ss:stack +e&m#d
]Y?{$M
G
start: )er?*^9Z
pusha \ 9[NH/.Z{
!hwzKm=%N
jsK|D{m?
mov ax,data ;程序从start开始 xe"4u JO
mov ds,ax ;ds置初值,data的段地址 3P%w-qT!N
6~:W(E}
;设置缓冲区 Aqx3!
lea bx, buffer =$
&7IQ?
mov bufferaddr,bx %A
zPAWcN
mov buff1,bx f
ho=<|-
mov bx,ds )< &B