第一个宏汇编程序 X|lElN
<M5{.`o
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 4GMa5]Ft
BLl%D
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! -6hu31W
tdMP,0u
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! BK`Q)[
s0~05{
比较长啊!所以可以自动跳过。 2)HxW}o
I?^Q084
.286 &KOG[tv
.radix 16 q\
\8b{~
data segment ;定义数据段 _WRR
3
1
]D/3!
N'lGA;}i
msg db 0dh, "Reading sector:$" ^g}gT-l%
msg1 db 0dh, "Writing sector:$" /8P4%[\
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" XwHu:v'=
^P3g9'WK
dsp db " $" !0>!tW
P3,Z5|
)
;DAP Fy4<
PacketSize db 16d; // 数据包尺寸(16字节) !q7;{/QM6
Reserved db 0; // ==0 [[/ }1%
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) IS5.i95m
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) w /Bn2b
D
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 CrRQPgl+u
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 J]kP`
m<X#W W)N
;定位用DAP (复位到0磁道) !0!P.Q8>&
DAP0 db 16d -Fp!w "=T
db 0 )V9Mcr*Ce6
dw 1 zR3lX}g
buff1 dw 0,0 1)P<cNj
dw 0,0,0,0 rzYobOKd#
[]6ShcqJ[v
!:g>CDA
;DiskParameters FcA)RsMI*
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) C{d8~6
falgs dw 0; WORD Flags; // 信息标志 ;*<{*6;=?
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 >Rl0%!
Heads DW 0; DWORD Heads; // 磁盘磁头数 q:EzKrE
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 gLXvw]
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 *<|~=*Ddf
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) *783xEF>f
'0])7jq
cmpsect dw 0 Q%X:5G?
{|7OmslC@
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" eCPKpVhP
msgHds db 0dh,0a,"Heads:$" a `[?,W:q
msgspt db 0dh, 0a,"SectorsPerTrack:$"
\
pe[V~F
msgTotal db 0d,0a, "Total Sectors:$" m<,y-bQ*(
msgSS db 0dh,0a, "Sector Size:$" 6,V.j>z
.dg 4gr\D
msgReadErr db 0dh,0a,"Error Reading Sectors:$" a6#
{2q
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" m-Z'K_oQ
msgReset db 0dh,0a, "Reseting drive to Cyl 0" #G[
*2h~99
WcZo+r
4acP*LkkQ
buffer db 32768d dup(0); +[ZMrTW!0C
x 1%J1?Fp
data ends ;数据段结尾 Z,N7nMJf
oneSg
J
stack segment I9Edw]
db 400 dup(?)
,\m;DR1
stack ends >~^mIu_BH
Sug~FV?k$e
code segment ;定义代码段 3;t@KuQ66
assume cs:code ;规定cs的内容 _Gs
assume ds:data ;规定ds的内容 ?C#F?N0
assume ss:stack #LrCx"_&
N$ qNe'b
start: ]$?zT`>(F
pusha n}ZBU5_
w>9H"Q[
\U<F\
i
mov ax,data ;程序从start开始 ^Q43)H0
mov ds,ax ;ds置初值,data的段地址 j"D0
nG,
^t^<KL;
;设置缓冲区 \ eyQo>(
lea bx, buffer NejsI un%
mov bufferaddr,bx f/IRO33
mov buff1,bx Y|x6g(b
mov bx,ds x]%4M\T``
mov bufferaddr+2,bx w/^0tZ~
mov buff1,bx *'`3]!A
bz}AO))Hk
lea di,infosize npG+#z
mov dl,80h 9m#H24{V'
mov ah,48h vBCZ/F[
int 13h 69<rsp(p
&ESR1$)'P
lea bx,msgcyl pT_e;,KW
U
mov dx,bx _>_ y@-b
mov ah,09 ![X.%
int 21h ]X"i~$T1 S
mov dx,cylinders KOAz-h@6
call dispdx tx|"v|&e2
"PDS
qYA
lea bx,msghds k?|zIu
mov dx,bx X"qbB4(I
mov ah,09 9rf|r
3
int 21h S8W_$=4
mov dx,heads I")"s
call dispdx $S)e"Po~5
dZ]\1""#H
lea bx,msgspt um_M}t{
mov dx,bx <5!RAdaj+
mov ah,09 c@ZkX]g
int 21h v#<+n{B
mov dx,spt+2 =aCIaL&9Y
call dispdx W O \lny!
mov dx,spt [V #&sAe
call dispdx u%gm+NneK
yw3U"/yw
lea bx,msgtotal [pC-{~
mov dx,bx fAY2V%Rft
mov ah,09 (8m\#[T+R
int 21h }HA2ce\
lea bx,sectors $.3CiM}~
call dispqword 1,;qXMhK`;
aP6%OI
lea bx,msgss v^lm8/}NO
mov dx,bx *C:q _/
mov ah,09 %;B(_ht<-w
int 21h O7<V@GL+
mov dx,sectorsize WKYA9BaR
call dispdx i>kNz(*
> {LJ#Dc6
sbb word ptr sectors, 63d \.{pZMM
jnc subok 8HH.P`Vk#
sub word ptr sectors+2,1 5@%=LPV
jnc subok GD6'R"tJ
sub word ptr sectors+4,1 )8
N)Z~h
jnc subok /kviO@jm4(
sub word ptr sectors+6,1 9 (FcA5Y
tWX+\ |
subok: 7PQj7&m
M;Mdz[Q
)l!&i?h%
)/N Xh'
xor ax,ax xUYN\Pc-
mov blocknumL, ax !i"9f_
mov blocknumL+2, ax P".qL5
mov blocknumL+4, ax dn.c#
,Y
mov blocknumL+6, ax sVm'9k
pS|JDMo
startread: |\r\i&|g1
o y%g{,V
call rwsect Kjca>/id
<4A(Z$ZX)
adc word ptr blocknuml,63d ;KjMZ(Iil1
jnc addok
]zM90$6
adc word ptr blocknuml+2,1 j|$y)FBX
jnc addok "6Hjji@A
adc word ptr blocknuml+4,1 )V+Dqh,-g
jnc addok E/ed0'|m
adc word ptr blocknuml+6,1 abk:_
jnc addok ,9l!fT?iH
Rp@}9qijb
addok: :+Je989\[C
mov ax, word ptr sectors+6 YWBP'Mo
cmp ax, blocknuml+6 Zs K'</7
jg complete Z5^,!6
jl startread 2QuypVC ]
mov ax, word ptr sectors+4 C6T 9
cmp ax, blocknuml+4 PRf\6
jg complete Nno={i1jk
jl startread 0,D9\ Ebd
mov ax, word ptr sectors+2 *}WqYqOow
cmp ax, blocknuml+2 /RULPd
PH
jg complete dU04/]modD
jl startread EpoQV ^Ey
mov ax, word ptr sectors =B{$U~}
cmp ax, blocknuml gu.))3D9
jg complete 7[?}kG
jl startread nrD=[kc!w
Y @ ,e
complete: #<V'gE
v'
Py[[R
lea bx,msgready h|/*yTuN.y
mov dx,bx :-'ri
Ry
mov ah,09 &B5Rzz-'
int 21 cB])A57<
9787uj]Y}H
popa \?mU$,voI
mov ax,3100h WZO
0u
int 21h 7QL) }b.H
G?/8&%8
; $MVeMgPa
dispdx proc near I8pxo7(-
pusha T.
Y4L
lea bx, dsp+3 RV @(&