第一个宏汇编程序 xhB
-gG=
jHV)
TBr
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 Pjq()\/[Z
"s@q(J
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! "Id1H
b=SCyGxlZ5
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! ke)<E98DC
<S12=<c?'
比较长啊!所以可以自动跳过。 t Q.%f:|
9S<V5$}
.286 ']Z%6_WF
.radix 16 :W+%jn
data segment ;定义数据段 e488}h6#m
JM53sx4&
'<O.J(N~4!
msg db 0dh, "Reading sector:$" 6zGeGW
msg1 db 0dh, "Writing sector:$" &y-z[GR[{
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Ql,WKoj*
hE'>8 {
dsp db " $" v|@EuN14<
`X B$t?xi
;DAP ]@CXUa,>a
PacketSize db 16d; // 数据包尺寸(16字节) $^YHyfh
Reserved db 0; // ==0 c @KNyBy2
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ?uW}
XAi
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) '>T hn{
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 &4*f28 s
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 M}
+s_h9
j{/5i`5m
;定位用DAP (复位到0磁道) Ga pM~~
DAP0 db 16d i1
GQ=@
db 0 AdzdYZiM_
dw 1 Fu[GQ6{f
buff1 dw 0,0 (^]3l%Ed
dw 0,0,0,0 MVEh<_
bP%X^q~]A
a%QgL&_5
;DiskParameters n'1LNi
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) }n
+MVJ;dG
falgs dw 0; WORD Flags; // 信息标志 a|k*A&5u2
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 Rhw+~gd*F
Heads DW 0; DWORD Heads; // 磁盘磁头数 74hRG~
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 7Q~$&G
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 M7YbRl
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ziv+*Qn_b4
Un&rP7
0
cmpsect dw 0 _*xY>?Aq
G
sz$H_
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" -oY8]HrXfK
msgHds db 0dh,0a,"Heads:$" VmZDU(M
msgspt db 0dh, 0a,"SectorsPerTrack:$" ^Of\l:q*
msgTotal db 0d,0a, "Total Sectors:$" )"63g
msgSS db 0dh,0a, "Sector Size:$" ?Iag-g9#=m
c4bv Jy8
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 8<J3Xe
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" a;&0u>
msgReset db 0dh,0a, "Reseting drive to Cyl 0" TeyFq0j@'
>;}(?+|f
OUN"'p%%
buffer db 32768d dup(0); th5UzpB4
3w/z$bj
data ends ;数据段结尾 !P6?nS
Rk{vz|
stack segment 7_eV.'h
db 400 dup(?) (v$
i
stack ends j|b
$b,rF\
{yMkd4v
code segment ;定义代码段 TZdJq
assume cs:code ;规定cs的内容 z$VVt?K
assume ds:data ;规定ds的内容 fe}RmnAC
assume ss:stack V=Z%y$1Bc
:J+ANIRI
start: tv;?W=&P
pusha ^__P;Gr`
+^.xLTX`$
-.-@|*5
mov ax,data ;程序从start开始 :]LW,Eql
mov ds,ax ;ds置初值,data的段地址 L\"eE'A
51ILR9 Bc_
;设置缓冲区 !lp7}[k<y
lea bx, buffer JtF)jRB
0,
mov bufferaddr,bx iL~(BnsF
mov buff1,bx Vq^b_^
mov bx,ds }Q-Tw,j
mov bufferaddr+2,bx cVSns\QO
mov buff1,bx 'Hu+8,xA
lGJ&\Lv:
lea di,infosize },O7NSG<o
mov dl,80h X@7:Fz
U9
mov ah,48h AU;Iif6
int 13h ;x/.8fA
46H@z=5
lea bx,msgcyl gA 19f
mov dx,bx fS%B/h=
mov ah,09 }T53y6J#
int 21h z*o2jz?t4
mov dx,cylinders ^C}f|{J
call dispdx ZR8y
9mx2"
`u8(qGg7GF
lea bx,msghds ]UZP dw1D
mov dx,bx ghk"XJ|
mov ah,09 SXV2Y-
int 21h ft!D2M
mov dx,heads r/QI-Cf&
call dispdx s,M]f,T
)[=C@U
lea bx,msgspt u5`b")a
mov dx,bx eUD 5V
mov ah,09 m`4N1egCt
int 21h Wq<HsJd/
mov dx,spt+2 P75@Yu(
call dispdx
af/0e}-
mov dx,spt }hXmK.['
call dispdx ~x J#NC+
_9S"rH[
lea bx,msgtotal `'pfBVBz
mov dx,bx
C k
/DV
mov ah,09 *]DO3Zw'
int 21h 'a~F'FN$
lea bx,sectors ~SXqhX-`
call dispqword 9|K:\!7
vpdT2/F
lea bx,msgss m,F4N$
mov dx,bx Tq8U5#NF
mov ah,09 p.,`3"C1
int 21h !VHw*fL|r
mov dx,sectorsize C @P$RVS
call dispdx
:1~4X
hl8oE5MU
sbb word ptr sectors, 63d qporH]J-E
jnc subok -)DxF<8B
sub word ptr sectors+2,1 $4]4G=o
jnc subok p#>,{
sub word ptr sectors+4,1 DH.CAV
jnc subok 6f+@@=Xc
sub word ptr sectors+6,1 j3[kG#
8C I\NR{x8
subok: WGUd@lC~
Q=epUHFs
(T.j3@Ko
<co:z<^lqu
xor ax,ax SN$3cg]z
mov blocknumL, ax &-Q_%eM^
mov blocknumL+2, ax A'*#UYn(
mov blocknumL+4, ax R,-DP/ (im
mov blocknumL+6, ax O_*tDq,e
2=|Ks]<P
startread: raM{!T
:
]DZ~"+LaG
call rwsect
FWLLbL5t
k7 Ne(4P
adc word ptr blocknuml,63d [9yy<Z5
jnc addok 8]4
W@~c
adc word ptr blocknuml+2,1 ~e5E%bXxC
jnc addok
?O9|
adc word ptr blocknuml+4,1 /8/N
jnc addok 41+@!`z7
adc word ptr blocknuml+6,1 %)e&"
mq!|
jnc addok Z/OERO
#zc$cr
addok: Z[kVVE9b?
mov ax, word ptr sectors+6 ,X\qlT5C
cmp ax, blocknuml+6 i1Y<[s
jg complete .pblI
jl startread .RbPO#(
mov ax, word ptr sectors+4 }RQHsS
cmp ax, blocknuml+4 u!McPM8Yk
jg complete uzS;&-nA
jl startread 3X9
mov ax, word ptr sectors+2 r6nWrO>y
cmp ax, blocknuml+2 EIOP+9zP
jg complete %htwq ]rZd
jl startread |#B)`r8
mov ax, word ptr sectors jTqEV
(
cmp ax, blocknuml iS`ok
jg complete *(sv5c!0M8
jl startread ]'z 5%'
Y*S(uqM
complete: XMLl>w2z
Ls
&-8
lea bx,msgready ^[q/w<_j~
mov dx,bx ;Ji3|=4u
mov ah,09 {$C
"yksr
int 21 $-39O3
UxnZA5Lk*
popa :6
Gf@Z&+
mov ax,3100h i~m;Ah,#
int 21h mzf^`/NO
p)~EG=p
; d 0:;IUG
dispdx proc near c >xHaA:V
pusha 4v`;D,dIu
lea bx, dsp+3 TR:4$92:H
mov cx,4 =!($=9
U \F ?{/
repeat0: i,l$1g-i
mov al,dl }50s\H._C
and al,0fh (?P\;yDG
cmp al,09h 5+/XO>P1m|
jg add40 1Q$/L+uJ5
add al, 30h )%hW3w
jmp okadd A!a.,{fZ
add40: ~;oaW<"
add al,37h WH.3
okadd: +,eF(VS!
mov byte ptr [bx],al bFJ>+ {#
dec bx )Zfb
M|
shr dx,4 RuOse9
loopnz repeat0 so@ijl4{
Z
lea bx,dsp n9k-OGJ
mov dx,bx x,
'KI?TyQ
mov ah,09h g,f
AVM
int 21h pc;`Fz/`7
35fj-J$8
popa 9]|C$;kw@
ret U<"k-
dispdx endp H$6;{IUz~
(^~~&/U_U$
dispqword proc near D#d/?\2
pusha !@FzP@
mov cx ,4 E/ ^N
add bx,6 t]ID
repeatdecbx: ,oJ$m$(Lj
mov dx,[bx] :79u2wSh
call dispdx <
WQ
~X<1D
sub bx,2 tjcsT>
loopnz repeatdecbx 2WB`+oWox
popa "l B%"}
ret J #;|P
-pt
dispqword endp u_Xp\RJ
N \woFrG
rwsect proc near w|-m*v
.
Crezo?
lea bx,msg >ni0:^vp
mov dx,bx 26=G%F
6
mov ah,09h
ixB"6O
int 21h "?'9\<>
>Xxi2Vy
lea bx,BlockNumL OS=~<ba
call dispqword IJLuu@kRm,
43!E> mq
lea di, packetsize -CTLQyj)
mov dl,80h ye4GHAm,p
mov ah,42h (b7',:_U7
int 13h s=<65
jnc readok sLc,Dx"+
xQNGlVipZ@
mov cx,5 0*KL*G
n
;出错后重试(定位0道后再重读) v
`;Hd8
retryrd: V
P1z"j:
lea bx, msgReadErr Yd<9Y\W%?
mov dx,bx { ^R>H|~
mov ah,09 Dt'bbX'edw
int 21h pzT`.#N:M
D*g
K, `
L^Fb;sJYI
lea di,dap0 u/J1Z>0
mov dl,80h k:z)Sw
mov ah,44h *d-JAE
int 13h }RUK?:lEA
L$@qEsO
lea bx,BlockNumL R3*{"!O
call dispqword <_SdW 5BF<
9x#Tj/5%
lea di, packetsize jN/snU2\0
mov dl,80h )~ ^`[`
mov ah,42h Am >b 7Z!
int 13h pwA~?$B1
jnc readok p uW
loopnz retryrd ]#W9l\
P6`LUyz3
readok: $NBQv6#:
lea di, packetsize &3\3wcZ,q
mov dl,80h /wi/i*;A
mov ah,43h /Nhc|x6zQ
int 13h $?DEO[p.
#`%V/ #YK
rwsect endp V%voe
m1RjD$fM
code ends ;代码段结尾 `KieN/d%
end start ;结束汇编 /lc4oXG8
Q3[nS(#Z/=