第一个宏汇编程序 F'g Vzf
P\8@g U!uk
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。
I1[g&9,
m
NmLyU=d
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 4}_O`Uxh
D:k3"
E"S
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧!
?9l [y
VrZ>bma;
比较长啊!所以可以自动跳过。 u@ jX+\
|mdi]TL
.286 9lB]~,z
.radix 16 ?$f)&O
data segment ;定义数据段 ;Yi4Xva@
;a-$D]Db
[
W2fd\4
msg db 0dh, "Reading sector:$" 5H=ko8fZ=
msg1 db 0dh, "Writing sector:$" KIR'$ 6pn~
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" J]m{b09F
R'k
yrEO
dsp db " $" h;=6VgXZ
/Q,{?';~
;DAP fc/
&X
PacketSize db 16d; // 数据包尺寸(16字节) (`SRJ$~f
Reserved db 0; // ==0 'n<iU st
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) N`)$[&NG]
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) bSVlk`
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 763+uFx^
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 TKk-;Y=N
e]jH+IR:>
;定位用DAP (复位到0磁道) 2X:4CC%5
DAP0 db 16d 4iW'kuK
db 0 z4&iK)x
dw 1 +C1QY'>I
buff1 dw 0,0 J_>w 3
uY
dw 0,0,0,0 LL|7rS|o
SQeRSz8bK4
PW3GL3+
;DiskParameters )c l5B{1P
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) dw.F5?j`b
falgs dw 0; WORD Flags; // 信息标志 }g$(+1g
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 hp{OL< 2M
Heads DW 0; DWORD Heads; // 磁盘磁头数 RI68%ZoL
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 kdb(I@6
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 Vmzb
ZTup
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) kId
n6 Wx,
;raN
cmpsect dw 0 8/0Y vh
.uNQBBNv
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" .VTy[|o
msgHds db 0dh,0a,"Heads:$" 3Tn)Z1o
msgspt db 0dh, 0a,"SectorsPerTrack:$" M$0u1~K
msgTotal db 0d,0a, "Total Sectors:$" +~xn
Xb1
msgSS db 0dh,0a, "Sector Size:$" \rVQQ|l
b;)~wU=
msgReadErr db 0dh,0a,"Error Reading Sectors:$" w8g,a]p
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" LH:i| I
msgReset db 0dh,0a, "Reseting drive to Cyl 0" a0Ik`8^`
DE2a5+^
E*# ]**
buffer db 32768d dup(0); _fZZ_0\Q
#Rg|BfV-
data ends ;数据段结尾 VUI|.76g
j5
g# M
stack segment -s9P8W
db 400 dup(?) )xb|3&+W
stack ends bzdb|I6Z
6U^\{<h_c
code segment ;定义代码段 DJP2IP
assume cs:code ;规定cs的内容 ^
wY[3"{
assume ds:data ;规定ds的内容 k</%YKk
assume ss:stack [:^-m8QC
!QDQ_
start: 0rGSH*(
pusha 88c<:fK
JHf
PMfkA!.Y
mov ax,data ;程序从start开始 7LO%#
No",
mov ds,ax ;ds置初值,data的段地址 XQ4G)
'ejvH;V3i
;设置缓冲区 lg047K
lea bx, buffer _ Ro!"YVX
mov bufferaddr,bx Hcc"b0>}{
mov buff1,bx V/LQ<Yke
mov bx,ds E~LTb)
!
mov bufferaddr+2,bx !"+'A)Nve
mov buff1,bx )[1)$-Ru
&-5_f*{
lea di,infosize G;f/Tch
mov dl,80h \,J/ r!
mov ah,48h Isx#9C
int 13h 8ssJ<LP
3s"0SLS4
lea bx,msgcyl PQ@L+],C
mov dx,bx J)mhu}
mov ah,09 Jvun?J
m
int 21h \6;=$f/?t
mov dx,cylinders v\`9;QV5
call dispdx K-&V,MI
y>*xVK{D
lea bx,msghds 8EVgoJ.
mov dx,bx p$ bnK]
mov ah,09 K(XN-D/c
int 21h a,78l@d(
mov dx,heads %T7nO %p
call dispdx
&YDK (&>
+:3*
lea bx,msgspt 0euuT@_$
mov dx,bx "bDs2E+W
mov ah,09 sBV4)xM
int 21h uUKcB:
mov dx,spt+2 0@2mXO9f"
call dispdx lC=~$c:
mov dx,spt e[Abp~@M1
call dispdx %%cHoprDa
Z'H5,)j0R
lea bx,msgtotal yjJ5P`j]
mov dx,bx JoSJH35=:
mov ah,09 pIbdN/z
int 21h D5~n/.B"
lea bx,sectors eHDef
call dispqword nYbhy}y
Py`N
4y~
lea bx,msgss [b:e:P 2
mov dx,bx "T H6o:x
mov ah,09
j[Uxa
int 21h
=}PdH`S
mov dx,sectorsize 8( btZt
call dispdx WW~+?g5
#$3yz'"QF
sbb word ptr sectors, 63d ^( Rvk
jnc subok f<A5?eKw
sub word ptr sectors+2,1 fvb=#58N_
jnc subok xV%6k{_:G
sub word ptr sectors+4,1 ]tY
^0a
jnc subok C{2xHd/*
sub word ptr sectors+6,1 qH['09/F6
0j C3fT!n
subok: oA1a /[#
|AC1\)2tT
h5yzwj:C?
)G7=G+e;
xor ax,ax /*|oL#hK
mov blocknumL, ax wCk~CkC?
mov blocknumL+2, ax 85;b9k&\M
mov blocknumL+4, ax Y<0 4RV
mov blocknumL+6, ax ]jpu,jz:
*6(kbe s
startread: HNL42\Kz!
#lU9yv
call rwsect .k[o$z\EkF
1
,5E`J
adc word ptr blocknuml,63d LL$_zK{
jnc addok )*c>|7G
adc word ptr blocknuml+2,1 @(C1_
jnc addok lD mtQk-SN
adc word ptr blocknuml+4,1 2 1PFR:lP7
jnc addok UU8pz{/
adc word ptr blocknuml+6,1 fL]Pztsk+
jnc addok /t-fjB{=G
^fz+41lE\
addok: ;\MW$/[JCy
mov ax, word ptr sectors+6 hR5_+cuIp
cmp ax, blocknuml+6 S(:l+JP
jg complete mw5?[@G-
jl startread 2S' {!A
mov ax, word ptr sectors+4 ^*\XgX
cmp ax, blocknuml+4 US
jg complete 'H7x L
jl startread KR"M/#
mov ax, word ptr sectors+2 ;l}- Z@! /
cmp ax, blocknuml+2 ,.gQ^^+=
jg complete _4 c
vX
jl startread _e9:me5d"$
mov ax, word ptr sectors JMdPwI
cmp ax, blocknuml c)0amM
jg complete "`[!L z
jl startread 3Tq\BZ
>
hH0Q5aL
complete: ud fe
yz2Ci0Dwy
lea bx,msgready u{z``]
mov dx,bx G^"Vo x4
mov ah,09 %&
_V0R\k
int 21 0P>OJYFr'
c]B$i*t
popa nADX
0KI
mov ax,3100h LK"
bC
int 21h 34!dYr%
<)*2LBF@]
; e|4&b@
dispdx proc near 'Peni1_
pusha OiDh
J
lea bx, dsp+3 5'a3huRtV
mov cx,4 g,:j/vR
mZIoaF>t
repeat0: 5d@t7[]
mov al,dl 2BCtJ`S`
and al,0fh c%*($)#
cmp al,09h ET];%~ ^
jg add40 LI)!4(WH
add al, 30h 6!^[];%xN
jmp okadd >yJ9U,Y
add40: wM[~2C=vx
add al,37h Q%aU42?_1
okadd: a}S
d W
mov byte ptr [bx],al E+C5 h
;p&
dec bx NA,CZ
shr dx,4 `"@ X.}\
loopnz repeat0 4 g.
bR
lea bx,dsp _lW+>xQ
mov dx,bx W(RF n`g\
mov ah,09h 'Pvm8t
int 21h ny-7P;->8
?X?&~3iD%
popa n}xhW'3hU=
ret d2s OYCKe
dispdx endp Yl;^ k0ZI
ceGa([#!\_
dispqword proc near ^TB>.c@ `*
pusha d*pF> j
mov cx ,4 1y^K/.5-
add bx,6 fFjH "2WD
repeatdecbx: D|qk_2R%
mov dx,[bx] ?[x49Ux,P
call dispdx lt$zA%`odc
sub bx,2 1{_A:<VBl
loopnz repeatdecbx DP/J(>eG
popa H UoyLy
ret .}')f;jH5<
dispqword endp >!6i3E^
rwIeqV{:
rwsect proc near W0jZOP5_.$
2k6 X,
lea bx,msg 80M;4nH^5
mov dx,bx ;O 0+,
mov ah,09h ^w~23g.
int 21h aAu>Tn86D.
vILy>QS)
lea bx,BlockNumL G#Ou[*O'
call dispqword .k4W_9
~7!7\i,Y8\
lea di, packetsize Lfl
Fe@2
mov dl,80h }6 5s'JB
mov ah,42h w
#i[_
int 13h qC!&x,}3
jnc readok :Sg_tOf
VGL#!4wK
mov cx,5 v6\F
Q9|t
;出错后重试(定位0道后再重读) fx8EB8A7K7
retryrd: d7Ur$K\=y
lea bx, msgReadErr X}P$emr7
mov dx,bx >s3gqSDR
mov ah,09 \n0Oez0z!B
int 21h 0tk#Gs[
[~D|peM3
i~J;G#b
lea di,dap0 I &* _,d
mov dl,80h *=Z26
mov ah,44h ^% Q|s#w.
int 13h Ff^@~X+W<
l!E7AKk8
lea bx,BlockNumL 0:KE@=
call dispqword #[MJ|^\i
eK /?%t
lea di, packetsize (SVWd
gb
mov dl,80h ydv3owN
mov ah,42h >Q,zNs
int 13h {5*|C-WWtG
jnc readok M9!AIHq4
loopnz retryrd S'~o,`xy
C}
IbxKl
readok: ')S;
[= v
lea di, packetsize uR6w|e`
mov dl,80h vFrt|JC_{
mov ah,43h }G$]LWgQx
int 13h T2?HRx
1r r@
rwsect endp ~#\i!I;RY}
4(?G6y)
code ends ;代码段结尾 Q
'(ihUq*k
end start ;结束汇编 N^VD=<#T
,~zj=F