第一个宏汇编程序 ;) pl{_
>!BFt$sd
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 .H;B=nd*
M9"Sgb`g
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! <f%/px%1
pieT'mA
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! J|j;g!fK
kojG-M
比较长啊!所以可以自动跳过。 .9 kyrlm
E$S`6+x`:a
.286 xh'^c^1
.radix 16 6v47 QW|'
data segment ;定义数据段 |cTpw1%I~
ePA;:8)_j
__)qw#
msg db 0dh, "Reading sector:$" G=$}5; t
msg1 db 0dh, "Writing sector:$" 6Y?`=kAp
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" YOw?'+8
CIQwl 6H9
dsp db " $" i>GdRG&q
dB)[O9K)
;DAP {e9Y
!oFg
PacketSize db 16d; // 数据包尺寸(16字节) 84`rbL
!M
Reserved db 0; // ==0 `jW4H$D
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) L+R>%d
s
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) HF4Lqh'oco
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 x;U|3{Io
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 TA)LPBG
jH0Bo;
;定位用DAP (复位到0磁道) $%He$t
DAP0 db 16d yh!B!v'
db 0 _Y#Bm/*
dw 1 ^
KAG|r9
buff1 dw 0,0 05)|"EX)
dw 0,0,0,0 ~I$}#
f)Y
`p|[rS>
;DiskParameters qX@9N=g`#O
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) #]zhZW4
falgs dw 0; WORD Flags; // 信息标志 1ih* gJPpj
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 +qE
']yzm!
Heads DW 0; DWORD Heads; // 磁盘磁头数 P6HGs?
*
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 pG28M]\
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 TG]}X\c+V|
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) "?H+
u/
8$
hWxT !
cmpsect dw 0 (Jpm
K O
/.Z
aE+
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 5;
f\0<-
msgHds db 0dh,0a,"Heads:$" &7][@v
msgspt db 0dh, 0a,"SectorsPerTrack:$" Yw^ Gti'<
msgTotal db 0d,0a, "Total Sectors:$" 4K,''7N3
msgSS db 0dh,0a, "Sector Size:$" 0M\NS$u(Y
l\aUresm
msgReadErr db 0dh,0a,"Error Reading Sectors:$" kIM
C~Z
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" FfXZ|o$;
msgReset db 0dh,0a, "Reseting drive to Cyl 0" r<_2qICgP
ak2dn]]D
DB8s
buffer db 32768d dup(0); [Yvsa,2
uGCtLA+sL
data ends ;数据段结尾 UPO^V:.R4
FNJ!IkuR
stack segment X%`KYo%
db 400 dup(?) )*HjRTF6G
stack ends ewQe/Fq
t?.\|2
code segment ;定义代码段 [d:@1yc
assume cs:code ;规定cs的内容 pzSqbgfrQ
assume ds:data ;规定ds的内容 b7v dk
assume ss:stack nP
u`;no
%BICt @E
start: n_;S2KM
pusha "WP% REE!
)k~1,
DPeVKyjU
mov ax,data ;程序从start开始 =h[yAf
mov ds,ax ;ds置初值,data的段地址 '>]&r