第一个宏汇编程序 9>&zOITTaL
`.MZ,Xhqi"
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 9!
jPZn
rNq*z,
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! ;|WUbc6&g
SvM\9
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! M YF
^zheD
D{N8q^Cs9
比较长啊!所以可以自动跳过。 AB'+6QU9k
^wolY0p
.286 ~{I.qv)>M~
.radix 16 h p|v?3(
data segment ;定义数据段 !G-+O#W`
#@B"E2F
T&_&l;syA
msg db 0dh, "Reading sector:$" G1 "QX
msg1 db 0dh, "Writing sector:$"
^[7Mp
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 3P6O]x<-?
btuG%D{a^
dsp db " $" ]gq)%T]
'IX1WS&\"
;DAP i]r(VKX
PacketSize db 16d; // 数据包尺寸(16字节) @e)}#kN.
Reserved db 0; // ==0 9m
M3Ve*
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) eLSzGbKf
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset)
X%
'z
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 }_'5Vb_
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 G$>?UQ[
f\hMTebma$
;定位用DAP (复位到0磁道) RxMsP;be
DAP0 db 16d ?gMx
db 0 ie6
c/5
dw 1 Z6zV 9hn
buff1 dw 0,0 Q-w#
!<L.
dw 0,0,0,0 J=^IS\m
5)RZJrN]
VO:4wC"7
;DiskParameters .J75bX5
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) mLuNl^)3
falgs dw 0; WORD Flags; // 信息标志 ~A=zjkm
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 aj`
&ca8
Heads DW 0; DWORD Heads; // 磁盘磁头数 U*[E+Uq}:N
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 2|>\A.I|=
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 J,?#O#j
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) 0
$)Q@#
z?\it(
cmpsect dw 0 !"F;wg$
`3F#k[IR
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" lAU99(GXV
msgHds db 0dh,0a,"Heads:$" 3%+~"4&
msgspt db 0dh, 0a,"SectorsPerTrack:$" _iJ~O1qx,w
msgTotal db 0d,0a, "Total Sectors:$" #-;c!<2
msgSS db 0dh,0a, "Sector Size:$" KrpIH6
j9NF|
msgReadErr db 0dh,0a,"Error Reading Sectors:$" (zo7h
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 2%pED
xui
msgReset db 0dh,0a, "Reseting drive to Cyl 0" rRq60A
_Q5mPBO
Bu(51wU8
buffer db 32768d dup(0); `DY
yK?R
!1)aie+p6
data ends ;数据段结尾 qi4P(s-i
Q~(Gll;
stack segment Dx-P]j)4x
db 400 dup(?) yiZtG#6K{
stack ends wD9K\%jIr!
bp?5GU&Uy
code segment ;定义代码段 >R F|Q
assume cs:code ;规定cs的内容 7'IIB1v.\
assume ds:data ;规定ds的内容 EH|+S
assume ss:stack >$ZG=&
,R[$S"]!SH
start: v1:.t
pusha l
;:IL\*1I
V.*TOU{{xh
:oIBJ u%/
mov ax,data ;程序从start开始 P1mg;!tq
mov ds,ax ;ds置初值,data的段地址 dQj/Sr
i5}Z k r
;设置缓冲区 4`,(*igEv
lea bx, buffer >38>R0k35
mov bufferaddr,bx bCw{9El!K4
mov buff1,bx U>PZ3
mov bx,ds j*DPW)RkKX
mov bufferaddr+2,bx V9oBSP'kt
mov buff1,bx ;MS.ag#
|C4fg6XDL
lea di,infosize RM|J |R
mov dl,80h IIR+qJ__|
mov ah,48h 6j6CA?|
int 13h ~qghw@Q~
#|b*l/t8
lea bx,msgcyl 8TP$ ?8l
mov dx,bx {fXkbMO|
mov ah,09 Yj&