第一个宏汇编程序 *hs<Ez.cC
H$amt^|zQ4
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 vXyo
K)&XQ`&
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! TSSt@xQ+
xm5FQ) T
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! J.2]k
m
/'6[*]IZP
比较长啊!所以可以自动跳过。 K=TW}ZO
\)ZX4rs{8
.286 Ko)T>8:
.radix 16 YBIe'(p
data segment ;定义数据段 ddDJXk)!0
NB5B$q_'#
Az9J{)
msg db 0dh, "Reading sector:$" 3b@1Zahz
msg1 db 0dh, "Writing sector:$" ;}~Bv<#
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" #0^3Wm`X;
$L8s/1up
dsp db " $" >5O y^u6Ly
BJxmW's/
;DAP "!6~*!]c
PacketSize db 16d; // 数据包尺寸(16字节) [KI`e
Reserved db 0; // ==0 G!Oq>7
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) -#;VFSz,9*
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) AdOAh y2H
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 V)QR!4De
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 h_G|.7!
#4 &N0IG
;定位用DAP (复位到0磁道) BC{J3<0bf@
DAP0 db 16d
MVP)rugU
db 0 OCO,-(
dw 1 l=~99mE
buff1 dw 0,0 t0H=NUP8
dw 0,0,0,0 B4Af
L_ qv<iM$
u6I0<i_KZ
;DiskParameters 5zw23!
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) >ha Ixs`9
falgs dw 0; WORD Flags; // 信息标志 8sF0]J[g{
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 s*/ G-
lY
Heads DW 0; DWORD Heads; // 磁盘磁头数 p]
|ME
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 lkWeQ)V
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 rbun5&RCyW
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) dzNaow*0&V
x ETVtq
cmpsect dw 0 Rn(F#tI
N|d.!Q;V.y
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$"
e=)*O
msgHds db 0dh,0a,"Heads:$" u$,Wyi )L
msgspt db 0dh, 0a,"SectorsPerTrack:$" (Zn3-t*
msgTotal db 0d,0a, "Total Sectors:$" _AHB|
P I
msgSS db 0dh,0a, "Sector Size:$" {R!TUQ5
Y_3YO2K]
msgReadErr db 0dh,0a,"Error Reading Sectors:$" *Gh8nQbh
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" +Y9D!=_lj
msgReset db 0dh,0a, "Reseting drive to Cyl 0" V'f5-E0
i^ cM@?
B
m@oB2x)
buffer db 32768d dup(0); IA 9v1:>
'a/6]%QFd!
data ends ;数据段结尾 f9XO9N,hE:
zHc 4e
stack segment h9w^7MbO
db 400 dup(?) rn[}{1I33Q
stack ends Ldj^O9p(
?Gv!d
code segment ;定义代码段 }:l%,DBw
assume cs:code ;规定cs的内容 ~uZLe\>K
assume ds:data ;规定ds的内容 obc^<ZD]
assume ss:stack <T.#A8c
.y_
bV=
start: 4f[M$xU&h
pusha UFAMbI
UH,4b`b
xKLcd+hCZ
mov ax,data ;程序从start开始 0R
5^p
mov ds,ax ;ds置初值,data的段地址 k&_u\D"^"%
-5,y
1_M
;设置缓冲区 -kri3?Y,
lea bx, buffer Gl
gORy=>
mov bufferaddr,bx (VI* c!N
mov buff1,bx 'j<:FUDJ
mov bx,ds VBsFT2XiL
mov bufferaddr+2,bx 0/00W6r0
mov buff1,bx <\9Ijuq}k
f+aS2k(e>
lea di,infosize h-+a;![
mov dl,80h ~v(M6dz~vk
mov ah,48h HD8"=7zJk
int 13h OK2/k_jXN'
=
']};
lea bx,msgcyl
9q)nNX<$)
mov dx,bx ><
_Z
mov ah,09 q{Ta?|x#
int 21h I;.!
hV>E
mov dx,cylinders 0CVsDVA
call dispdx a0/n13c?G
- Zoo)
lea bx,msghds qTa]th;
mov dx,bx ^%
8Hvy
mov ah,09 (zro7gKked
int 21h ]7R&m)16
mov dx,heads 9s6>9hMb)
call dispdx (VXx G/E3
n.Eoi4jV'
lea bx,msgspt K-Dk2(x
mov dx,bx O$u
mu_
mov ah,09 CbH T #
int 21h s?;<F
mov dx,spt+2 . I&)MZ>n
call dispdx uZ`d&CEh
mov dx,spt g9weJ6@}M
call dispdx "K$ Wh1<7
UFIA
gNKl
lea bx,msgtotal 8&A|)ur4
mov dx,bx B/9<b{6
mov ah,09 Jn@Mbl
int 21h J
XRf4QmG
lea bx,sectors N"
Jtg@w
call dispqword 0@e}hv;
"G-0i KW;
lea bx,msgss XG\a-dq[
mov dx,bx P
xVI{:Uz
mov ah,09 ;$tv8%_L[
int 21h 6=g]Y!o$
mov dx,sectorsize qfP"UAc{
/
call dispdx
T.w}6?2
d,J<SG&L&
sbb word ptr sectors, 63d 7k#${,k
jnc subok B[/['sD
sub word ptr sectors+2,1 fF9oYOh|
jnc subok
zEPx
sub word ptr sectors+4,1 e<O;pM:
jnc subok gC_s\WU
sub word ptr sectors+6,1 oB{}-[G
>upXt?
subok: o|^?IQ7bpf
:
`6$/DK
~ut& U
qnk,E-
xor ax,ax pJ$N@ID
mov blocknumL, ax tp0!,ne*
mov blocknumL+2, ax
G_, t\
mov blocknumL+4, ax At[n<8_|
mov blocknumL+6, ax w{zJE]7
%L \{kUam
startread: ?Str*XA;
B:A1W{l
call rwsect o S:vTr+$
?4,*RCaI
adc word ptr blocknuml,63d (|a$N.e&K
jnc addok {7![3`%7
adc word ptr blocknuml+2,1 R
!V5-0%
jnc addok o~.o^0Y
adc word ptr blocknuml+4,1 AR+\uD=\I-
jnc addok w(e+o.:
adc word ptr blocknuml+6,1 U3|&Jee
jnc addok sAjKf\][
.iP G /e
addok: @(,{_c]
mov ax, word ptr sectors+6 WP%{{zR$
cmp ax, blocknuml+6 MNf @HG
jg complete ahi57r[
jl startread DvRA2(M
mov ax, word ptr sectors+4 5Du>-.r
cmp ax, blocknuml+4 !8" $d_=h
jg complete
u5{5ts+:
jl startread X@h^T>["
mov ax, word ptr sectors+2 #-gGsj;F
cmp ax, blocknuml+2 ++Ys9Y)*,
jg complete =S[FJaIu7
jl startread n2y/zP>TC
mov ax, word ptr sectors i^s`6:rNu
cmp ax, blocknuml e2-70UvW^
jg complete S`2mtg
jl startread 9?l?G GmQ
vA"`0
complete: Gkodk[VuLs
srChY&h?<
lea bx,msgready k}f<'g<H
mov dx,bx ;( Ajf.i
mov ah,09 z7t'6Fy9'
int 21 _L:i=.hxN
@^:7UI_
popa s7UhC.>'@
mov ax,3100h bDh:!M
int 21h _sf#J|kQ
UP~WP@0F
; .XLV:6
dispdx proc near 7k`*u) Q
pusha =~W0 ~lxX
lea bx, dsp+3 yjOu]K:X
mov cx,4 AK~`pq[.
RP|>&
I
repeat0: =ve*g&
mov al,dl 0,~6TV<K
and al,0fh lEyG9Xvi
cmp al,09h Ah" 'hFY
jg add40 q(jkit~`A
add al, 30h GEe 0@q#YA
jmp okadd Kixr6\
add40: 7i+!^Qj?y
add al,37h
,3J`ftCV
okadd: m>abK@5na
mov byte ptr [bx],al h[-d1bKwS
dec bx rKy-u
shr dx,4 P"V{y|2
loopnz repeat0 aX[1H6&=7
lea bx,dsp 1|l)gfcP
mov dx,bx }W__ffH
mov ah,09h $xUzFLh=`
int 21h <>T&ab@dE(
dY4k9p8
popa L)R[)$2(g
ret ni"$[8U
dispdx endp [`hE^chd
e0~sUVYf
dispqword proc near k binf
pusha XYK1-m}2
mov cx ,4 n2jvXL
Jq
add bx,6 B
\_d5WJ<
repeatdecbx: MR?*GI's
mov dx,[bx] [yYH>~SuwZ
call dispdx "J8;4p
sub bx,2 C`yvBt40r
loopnz repeatdecbx :!+}XT7)/
popa u6iU[5
ret y} $P,
dispqword endp n ,&/D
EZ%w=
rwsect proc near l?o-!M{
Uxk[O
lea bx,msg T]Tdx.B
mov dx,bx ##EB; Y
mov ah,09h Z92iil;t
int 21h H4}%;m%
nL":0!DTRD
lea bx,BlockNumL O ':0V
call dispqword E VN-<=i^
mX<Fuu}E*Z
lea di, packetsize z.2r@Psk
mov dl,80h u0bfX,e2U
mov ah,42h %1-K);SJ
int 13h %]a
@A8o0
jnc readok c-4m8Kg?L
X$7Oo^1;
mov cx,5 Snc;p
;出错后重试(定位0道后再重读) JQKC;p
retryrd: |
((1V^
lea bx, msgReadErr .N~PHyXZR
mov dx,bx '%zN
mov ah,09 w24{_ N
int 21h ]>R`
;"(
,hpH!J'5f/
P"(z jG9-
lea di,dap0 g.B%#bfg
mov dl,80h
h`wMi}q'D
mov ah,44h ia%z+:G
int 13h m,W) N9 M
H&w:`JYDL3
lea bx,BlockNumL f7XQ~b
call dispqword (O)\#%,@R
ID67?:%r
lea di, packetsize a|DsHZ^6^
mov dl,80h
{fGd:2dh
mov ah,42h 8
uDerJ!
int 13h mR{CVU
jnc readok X,C*qw@
loopnz retryrd nS_Ta
Vq3gceo'0A
readok: GXDC@+$14
lea di, packetsize <Rcu%&;i
mov dl,80h N$\ bg|v
mov ah,43h s<[A0=LH
int 13h !
dU9sB2
doP$N3Zm
rwsect endp :a_BD
O1GDugZ
code ends ;代码段结尾 _GVE^yW~
z
end start ;结束汇编 ?QCmSK=L
A}t
%;V2