第一个宏汇编程序 qfL-r,XS`F
e~\QE0Oe :
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 8X7{vN_3K
R>)MiHcCg
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! pGWA\}'
WeT* C
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! OtUrGQP
d53 L65[
比较长啊!所以可以自动跳过。 }ot"Sx\.
w:ULi3
.286 5cfA;(H
.radix 16 FJS'G^
data segment ;定义数据段 O!R"v'
LAs7>hM
')#,X^
msg db 0dh, "Reading sector:$" Dpqt;8"2L
msg1 db 0dh, "Writing sector:$" VWf %v
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" x8[MP?Wz
Dy9\O77>
dsp db " $" 79Bg]~}Z
HFtf
;DAP @LX6hm*}
PacketSize db 16d; // 数据包尺寸(16字节) 3<(q }
Reserved db 0; // ==0 :jem~6i
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) lrEj/"M
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) LtKB v4
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 VcgBLkIF
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 ;e s^R?z
zCe/Kukvy
;定位用DAP (复位到0磁道) -l*g~7|j
DAP0 db 16d }E&NPp>
db 0 grcbH
dw 1 UQ8bN I7
buff1 dw 0,0 'Z
8aPHD
dw 0,0,0,0 '
fW#7W
\2!!L=&4G
d#_m.j
;DiskParameters `~F5wh~
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 8L{u}|{
falgs dw 0; WORD Flags; // 信息标志 Tj`5L6N;8
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 i g71/'D
Heads DW 0; DWORD Heads; // 磁盘磁头数 _PXdzeI.
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 y!Cc?$]_Y
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 M'5'O;kn
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ^PqF<d6
mh`|=M]8E
cmpsect dw 0 SN">gmY+
{]/8skov5]
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" #}yTDBt
msgHds db 0dh,0a,"Heads:$" ;5S}~+j
msgspt db 0dh, 0a,"SectorsPerTrack:$" H7&xLYQ2
msgTotal db 0d,0a, "Total Sectors:$" SBf FZw)
msgSS db 0dh,0a, "Sector Size:$" lpC
@I^:
1(gfdx9|b
msgReadErr db 0dh,0a,"Error Reading Sectors:$" T{
Zwm!s
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" _a
-]?R
msgReset db 0dh,0a, "Reseting drive to Cyl 0" 1Ix3i9
B@K[3
jj&s}_75
buffer db 32768d dup(0); Fvl`2W94;
! -tz4vjw
data ends ;数据段结尾 d/U."V}
yp]@^T N
stack segment ST',4Oph5
db 400 dup(?) T[uDZYx
stack ends ]|Z b\{
*y7 $xa4
code segment ;定义代码段 $RO$}!
assume cs:code ;规定cs的内容 <@#PF$!
assume ds:data ;规定ds的内容 H%i>L?J2 /
assume ss:stack o'=VZT9
M<`|CVl
start: Oh!(@
pusha -T_\f?V8
8
pj{\T?(
5M){!8"S)#
mov ax,data ;程序从start开始 t&RruwN_;
mov ds,ax ;ds置初值,data的段地址 XW~bu2%{7"
$|<m9CW
;设置缓冲区 *"9<TSU%m
lea bx, buffer !{%G0(Dv
mov bufferaddr,bx tFh|V
pB
mov buff1,bx 4<v;1
mov bx,ds Q< *8<Oo4g
mov bufferaddr+2,bx \ V%_hl
mov buff1,bx H~fdbR
8tc*.H{^+
lea di,infosize CEt
R[Cu
mov dl,80h /L~m#HxWU
mov ah,48h < o I8-f
int 13h ,0?!ov|
8A2z 5Aa
lea bx,msgcyl Q:o7G|C
mov dx,bx ]7/gJ>g,
mov ah,09 c@du2ICUc
int 21h cf;Ht^M\
mov dx,cylinders ')TPF{\#
call dispdx m4/er539T
cyF4iG'M,y
lea bx,msghds T@48 qg
mov dx,bx 0|Ucd
mov ah,09 _<Dt
z
int 21h hnxc`VX>g
mov dx,heads ?d-70pm
call dispdx l5O=VqCj
v 81rfB5
lea bx,msgspt "4 k-dj
mov dx,bx F[E?A95W
mov ah,09 NPJ.+ph
int 21h ^Kq|ID
AP
mov dx,spt+2 kBsXfVs9
call dispdx f&I7
,"v
mov dx,spt HnZPw&*
call dispdx v5$s#f<
Y;Y1+jt
lea bx,msgtotal <^><3U`
mov dx,bx ")`S0n5e
mov ah,09 .[j%sGdKl
int 21h Wmz`&