第一个宏汇编程序 )VSwTx&
'Gx$Bj
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 LxLy+yC#p
jjRUL.
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! ~@T<gA9V
+oI3I~
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! >nzu],
U
Q_]d5pl
比较长啊!所以可以自动跳过。 QT!
4[,4
cvnB!$eji
.286 ]1D%zKY%$Z
.radix 16 O*[{z
)M.
data segment ;定义数据段 $&{ti.l
41G5!=i
]mQw,S)/"
msg db 0dh, "Reading sector:$" O.,3|
msg1 db 0dh, "Writing sector:$" +k.%PO0np
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" }Ov
^GYnn
:4:N f
dsp db " $" W+Xz$j/u
!v|FT.
T`
;DAP rYY$wA@
PacketSize db 16d; // 数据包尺寸(16字节) 5;\gJf
Reserved db 0; // ==0 j%L&jH6@
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) [U>@,BH
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ]PWDE"
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 VIC0}LT0R
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 !M7<BD};
M*sR3SZ
;定位用DAP (复位到0磁道) $<nCXVqL,
DAP0 db 16d <[Q3rJ
db 0 \ \06T`
dw 1 &$'z
buff1 dw 0,0 <F;v`h|+S
dw 0,0,0,0 OtJ\T/q,
'$G"[ljr
nOb?-rR
;DiskParameters 6sJw@OaJ
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) 20b<68h$:
falgs dw 0; WORD Flags; // 信息标志 qnM|w~G
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 "T2"]u<52
Heads DW 0; DWORD Heads; // 磁盘磁头数 'OkGReKt
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 k1^\|
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 *>NX%by)
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) +-<
}+8G;
Ej=3/RBsV
cmpsect dw 0 bDnZcf
VA] e
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 'm3t|:nMU
msgHds db 0dh,0a,"Heads:$" .1yT*+`
msgspt db 0dh, 0a,"SectorsPerTrack:$" jCioE
msgTotal db 0d,0a, "Total Sectors:$" .B72C[' c
msgSS db 0dh,0a, "Sector Size:$" `Out(Hn
x}TS
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 3*ixlO:qGk
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" =-KMb`xT
msgReset db 0dh,0a, "Reseting drive to Cyl 0" QSw<%pcJE@
fpWg R4__
/AS
aB
buffer db 32768d dup(0); R'}95S<
!345 %,
data ends ;数据段结尾 6Wj^*L!
X(A.X:"
stack segment 7 <9yH:1
db 400 dup(?) |TsE-t*E}
stack ends 0Y
l
4eB-
UlcH%pxTt1
code segment ;定义代码段 )yG"^Ulu
assume cs:code ;规定cs的内容 fB1
TFtAh
assume ds:data ;规定ds的内容 HOoPrB m
assume ss:stack fX~'Zk\u
^/U27B
start: >j*;vG5T
pusha Vw tZLP36
@%/]Q<<q
'G&{GVbXY
mov ax,data ;程序从start开始 2S"Nf8>zp
mov ds,ax ;ds置初值,data的段地址 mYxyWB
\f:z+F!6R
;设置缓冲区 2)X4y"l
lea bx, buffer |4(~%| 8{
mov bufferaddr,bx m<rhIq
mov buff1,bx ^EELaG
mov bx,ds vb
Y3;+M>
mov bufferaddr+2,bx '3 33Ctxy
mov buff1,bx 0'5/K ,
.IarkeCtb
lea di,infosize %" D%:
mov dl,80h Fmyj*)J[Z
mov ah,48h 5U`ZbG
int 13h N8tox
Ru
=,y |00l
lea bx,msgcyl [AU
II*:}
mov dx,bx JyL a#\ R
mov ah,09 N
VKC'==0
int 21h >Dw~POMy
mov dx,cylinders ko;>#
::
call dispdx nDS}^Ba
wh6yPVVF/
lea bx,msghds );V2?G`/
mov dx,bx (*p ,T
mov ah,09 _"@CGXu
int 21h {-3L IO
mov dx,heads
7 c|bc6?
call dispdx xu5ia|gYz7
7hP<f}xL
lea bx,msgspt =Prb'8 W
mov dx,bx k%s_0
@
mov ah,09 kIHDeo%K}
int 21h Byl^?5
mov dx,spt+2 M`YWn ;
call dispdx VKp*9%9
mov dx,spt bmgn cwlz
call dispdx Tm}rH]F&
Sr?#wev]rn
lea bx,msgtotal U>Ld~cw
mov dx,bx 7?j;7.i
s(
mov ah,09 cH'
iA.
int 21h gr-9l0u
lea bx,sectors N`@NiJ(O;
call dispqword W%<LTWOc
o?L'Pg
lea bx,msgss +4;uF]T
mov dx,bx b
-ll
mov ah,09 ; Uc0o!1
int 21h zGKyN@o
mov dx,sectorsize v
^[39*8
call dispdx "@R>J?Cc+
Kt@M)#
sbb word ptr sectors, 63d {]_uMg#!
jnc subok $rIoHxh. y
sub word ptr sectors+2,1 @"a6fn
jnc subok [.se|]t7X
sub word ptr sectors+4,1 f()FY<b
jnc subok ]aP=Ks%
sub word ptr sectors+6,1 [x=
jH>Y
K 0gI):
subok: "Z
Htr<+
&