第一个宏汇编程序 >uy(N
;/s##7qf
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ^P~NE#p5
FL?Ndy"I
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! Q35jJQ$<`
'eDV-cB
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! G+V?c1Me
gWLhO|y
比较长啊!所以可以自动跳过。 ;9"6g=q
5JggU
.286 G Ebm$
\
.radix 16 Z.E@aml\
data segment ;定义数据段 0Ma3
ywkyxt
sMHP=2##
msg db 0dh, "Reading sector:$" sB+
B,DF
msg1 db 0dh, "Writing sector:$" oF {u
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" m#a1N
4khc
*fh
dsp db " $" D9/PVd
\VAm4
;DAP V:*6R/Ft
PacketSize db 16d; // 数据包尺寸(16字节) qku}cWD9/_
Reserved db 0; // ==0 M'>8P6O
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) -![>aqWmj1
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) _<m yM2z
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 6~.{~+Bd
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 a"bael
\l71Q/y6u`
;定位用DAP (复位到0磁道) >4iVVs
DAP0 db 16d JthW"{E
db 0 aYrbB#
dw 1 JK9 J;c#T
buff1 dw 0,0 /pYp,ak
dw 0,0,0,0 qfS
]vc_N
ipH'}~=ID
]!'9Y}9a
;DiskParameters dQ`=CIr
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 1%Su~Z"W>
falgs dw 0; WORD Flags; // 信息标志 I6lWB(H!u
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 m>&:)K}m
Heads DW 0; DWORD Heads; // 磁盘磁头数 HBiUp$(mB
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ||^+(
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 CEl9/"0s6
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) -]!zj#&
&)Z]nNVb
cmpsect dw 0 E;-*LT&{
CEEAyip-c
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" "*JyNwf
msgHds db 0dh,0a,"Heads:$" {}DoRpq=
msgspt db 0dh, 0a,"SectorsPerTrack:$" 3#Qek2
msgTotal db 0d,0a, "Total Sectors:$" a*bAf'=
msgSS db 0dh,0a, "Sector Size:$" .X;DI<K
6X[Mn2wYW
msgReadErr db 0dh,0a,"Error Reading Sectors:$" /?_5!3K J
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" !v68`l15
msgReset db 0dh,0a, "Reseting drive to Cyl 0" -v &
Gm.2!F=R4A
ds
"N*\.
buffer db 32768d dup(0); :=e"D;5
linvK.Lf
data ends ;数据段结尾 @l
%x;`E
C<yjGtVD
stack segment 'Fr"96C$
db 400 dup(?) `w
K6B5>
stack ends ?CSv;:
zya2 O?s
code segment ;定义代码段 ^udl&>
assume cs:code ;规定cs的内容 wq
=Ef
assume ds:data ;规定ds的内容 Gz kvj:(V
assume ss:stack >}) W5Y+
"?r_A*U
start: :>3/*"vx?G
pusha ;:Q&Rf"@%
Xcw6mpLt
UtYwG#/w
mov ax,data ;程序从start开始 mT&?DZ9<
mov ds,ax ;ds置初值,data的段地址 @*^%^ P
7 DW_G
;设置缓冲区 Un^3%=;
lea bx, buffer ?my2dd,|
mov bufferaddr,bx @;`d\lQ
mov buff1,bx Y |'}VU
mov bx,ds bD4aSubN
mov bufferaddr+2,bx 2!Sl!x+i\'
mov buff1,bx CA]u3bf~
H-/w8_} KG
lea di,infosize HMl
M!Xk?
mov dl,80h MNu\=p\Eq
mov ah,48h +(/' b'*
int 13h nk.j7tu
G'
0JK+=o
lea bx,msgcyl @s7wKk
mov dx,bx B*&HQW *u
mov ah,09
ihBIE
int 21h 7;3;8Q FX
mov dx,cylinders s_4y^w]aX
call dispdx *RJiHcII
J|.n bSE
lea bx,msghds $q 9dk
t
mov dx,bx &at>sQ'
mov ah,09 .~7:o.BE`n
int 21h 4H_QQ6
mov dx,heads 91\]Dg
call dispdx yP0XA=,Y
u )kQ*&
lea bx,msgspt 'h3yxf}\
mov dx,bx HJ0Rcw%
mov ah,09 -n~%v0D8c
int 21h K_o[m!:jU
mov dx,spt+2 :]uz0s`>
call dispdx 7QM1E(cMg
mov dx,spt \Y^GA;AMQQ
call dispdx J
N>
h:
\kEC|O)8
lea bx,msgtotal ~
U+W4%f8
mov dx,bx jSdW?IH
mov ah,09 q:<vl^<j
int 21h z#Db~
lea bx,sectors ?5<x$YI
call dispqword @@"abhT
Yx':~
lea bx,msgss ,lb
>
mov dx,bx 0;Z] vl/|
mov ah,09 PsO>&Te