第一个宏汇编程序 3^
UoK
P/ 6$TgQ
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 r?[[.zm"7
#|je m
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 8=Oym~
; ,sNRES3
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! em,1Yn?
084Us
s
比较长啊!所以可以自动跳过。 80Hi v
fNAW4I I}
.286 u4
es8"
.radix 16 cFq<x=S
data segment ;定义数据段 %D#&RS
F!hjtIkPj
Ow> u!P!
msg db 0dh, "Reading sector:$" y(g]:#
msg1 db 0dh, "Writing sector:$" 9VTAs:0D=
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Hm'fK$y(
%"(HjanH
dsp db " $" w`8H=Hf
*8,W$pe3
;DAP 7:LEf"vRZ
PacketSize db 16d; // 数据包尺寸(16字节) qVfn(rZ
Reserved db 0; // ==0 9kWI2cLzQt
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) D%3$"4M7!
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) |z3!3?%R
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 L$O\fhO?
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 e{87n>+,
T8g\_m
;定位用DAP (复位到0磁道) T\p>wiY2|F
DAP0 db 16d .+XK>jl+
db 0 S{l)hwlE
dw 1 ? Pi|`W
buff1 dw 0,0 7P(o!%H
dw 0,0,0,0 Fl($0}ER
0^V<,CAV
baG_7>Q9H
;DiskParameters :t`W&z41
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) s|XWw<S
a
falgs dw 0; WORD Flags; // 信息标志 /77cjesZ9
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数
G-1qxK
Heads DW 0; DWORD Heads; // 磁盘磁头数 1QA/ !2E
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 D<FQVdP
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 j$_?g!I=gK
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) 0!YVRit\N
[N~7PNd S
cmpsect dw 0 &S+*1<|`K
fh)eL<I
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" `qmwAT
msgHds db 0dh,0a,"Heads:$" :35h0;8+
msgspt db 0dh, 0a,"SectorsPerTrack:$" 9[VYd '
msgTotal db 0d,0a, "Total Sectors:$" <?IDCOt ?
msgSS db 0dh,0a, "Sector Size:$" 3t+{
~{Dj
U`3?bhzua
msgReadErr db 0dh,0a,"Error Reading Sectors:$" c.LRS$o/j
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" '"7b;%EN'
msgReset db 0dh,0a, "Reseting drive to Cyl 0" xa'U_]m
Rkk`+0K7$J
vzfMME17
buffer db 32768d dup(0); fgL"\d}
H?;+C/-K`_
data ends ;数据段结尾 N
}VoO0 I
~),%w*L
stack segment 4rL`||
db 400 dup(?) ,_(=w.F
stack ends ?,riwDI 2
bf.+Ewb(
code segment ;定义代码段 Ww8U{f
assume cs:code ;规定cs的内容 V*s\ ~h)
assume ds:data ;规定ds的内容 '+$r7?dKP
assume ss:stack `_)9eGQ
T
=
pP
start: E<-W & a }
pusha JXkx!X_{
U3B&3K} ~
k]:`<`/I_
mov ax,data ;程序从start开始 =/a`X[9vI
mov ds,ax ;ds置初值,data的段地址 b*S,8vE]
,{:qbt
;设置缓冲区 eSObOG/
lea bx, buffer VFZyWX@#u
mov bufferaddr,bx Gev\bQa
mov buff1,bx p#4*:rpq4
mov bx,ds SbX^DAlB1
mov bufferaddr+2,bx 'q;MhnU+
mov buff1,bx ZhCz]z~tj6
3C!|!N1Hn
lea di,infosize 5
s^vC2$)
mov dl,80h B=>Xr!pM!
mov ah,48h BTr;F]W
int 13h {~51h}>b#
<`Fl Igo
lea bx,msgcyl -eV*I>G
mov dx,bx <