第一个宏汇编程序 y)zZ:lyIq
l/3=o}8q
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 G=y~)B}
97
Dq;
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧!
G#[A'tbKk
RKLE@h7[?
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! V
u")%(ix
eb7UA=[Z
比较长啊!所以可以自动跳过。 -k + jMH
6UCF w>
.286 hh4R
.radix 16 &G2&OFAr]q
data segment ;定义数据段 #ss/mvc3
$W
IE`P%
n1%2sV)>
msg db 0dh, "Reading sector:$" GZO:lDdA
msg1 db 0dh, "Writing sector:$" NL]_;\ h
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" f2 ~Aug
F'M X9P
dsp db " $" b |:Y3_>
8SpG/gl"
;DAP yeyDB>#Va.
PacketSize db 16d; // 数据包尺寸(16字节) Hn >VPz+I
Reserved db 0; // ==0 ;PaU"z+Je~
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) aV5M}:D
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) [~Ky{:@)[
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 rp\`uj*D
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 1v&!%9
et5lfj
;定位用DAP (复位到0磁道) lEl.'X$
DAP0 db 16d 7R:j^"I@
db 0 7 "eK<qJ
dw 1 I^EZ s6~
buff1 dw 0,0 =rymd3/
dw 0,0,0,0 Tdh(J",d
*zUK3&n~I
N]FRL\K
;DiskParameters '( I0VJJ
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) Muwlehuq
falgs dw 0; WORD Flags; // 信息标志 \me5"ZU
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 D>k(#vYKB
Heads DW 0; DWORD Heads; // 磁盘磁头数 6y!U68L;B
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 '$Z)2fn7
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 m 3UK`~ji
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) kNK0KL
uxyj6(
cmpsect dw 0 +a39 !j
1_
-ED}
6E
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" \^6 [^\@[
msgHds db 0dh,0a,"Heads:$" .@): Uh
msgspt db 0dh, 0a,"SectorsPerTrack:$" .xqi7vVHZ
msgTotal db 0d,0a, "Total Sectors:$" }E ]l4N2
msgSS db 0dh,0a, "Sector Size:$" UYxn?W.g
U[MeK)*
msgReadErr db 0dh,0a,"Error Reading Sectors:$" z&QfZs
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" a4UwhbH
msgReset db 0dh,0a, "Reseting drive to Cyl 0" JPF6zz
l)
rf H1Zl
~AjPa}@ f
buffer db 32768d dup(0);
MWme3u)D
7j)ky2r#
data ends ;数据段结尾 wU|@fm"
$y6 <2w%b
stack segment x^@oY5}cr
db 400 dup(?) cFc(HADM`r
stack ends L ~'98C
_<RTe
s
code segment ;定义代码段 c5%}*
"z
assume cs:code ;规定cs的内容 tAq0Z)
assume ds:data ;规定ds的内容 | Uics:cQC
assume ss:stack j4,y+9U
.K84"Gdx
start: 1UK= t
pusha p-IJ':W
G_?U?:!AC
dwk%!%
mov ax,data ;程序从start开始 W`PJflr|
mov ds,ax ;ds置初值,data的段地址 )!v"(i.5Xo
i.'"`pn_
;设置缓冲区 9h|6"6
lea bx, buffer T; tY7;<
mov bufferaddr,bx O*v&CHd3
mov buff1,bx fV4rVy8
mov bx,ds 7;|"1H:cmw
mov bufferaddr+2,bx _yg;5#3
mov buff1,bx ~;9n6U
YzjRD:
lea di,infosize ,=\.L_'
mov dl,80h 0Xb\w^
mov ah,48h PS"rXaY
int 13h x</4/d
ntLEk fK{
lea bx,msgcyl ^2}HF/
mov dx,bx T#Q7L~?zY
mov ah,09 !-tw
int 21h f2[R2sto@
mov dx,cylinders t$du|q(
call dispdx ?fH1?Z\'K
Uj
;JN}k
lea bx,msghds /69yR
mov dx,bx @\nQ{\^;
mov ah,09 "x R6~8
int 21h cW>=/
mov dx,heads z=KDkpV
call dispdx Eu' ;f_s
pMT7 /y-
lea bx,msgspt C jf<,x$
mov dx,bx ~-Kx^3(#
mov ah,09 7Tk//By7
int 21h FBwG3x
mov dx,spt+2
<=
p>0L
call dispdx y>}r
mov dx,spt L9O;K$[s
call dispdx .^*;hZ~4%
nHm29{G0
lea bx,msgtotal O`0r'&n
mov dx,bx zYV{ |Z
mov ah,09 _%R^8FjH*
int 21h
)YgntI@
lea bx,sectors /i8OyRpSyk
call dispqword kf>3T@
>=97~a+.
lea bx,msgss &V1d"";SZ
mov dx,bx =q0V%h{
mov ah,09 la<.B^
int 21h }Q4Vy
mov dx,sectorsize Pw<' rN8''
call dispdx QTBc_Z
Dx1(}
D
sbb word ptr sectors, 63d V<#KFm$>C
jnc subok Awa|
(]
sub word ptr sectors+2,1 Eo2`Vr9g
jnc subok )Mdddz4
sub word ptr sectors+4,1 27N;>
jnc subok l,l qhq\
sub word ptr sectors+6,1 ]fzXrN_
OW#0$%f
subok: qK7:[\T|?T
S>I` y]qlR
%d];h
!O%!A<3
xor ax,ax R/x3+_.f
mov blocknumL, ax EA(4xj&:U
mov blocknumL+2, ax ZeuL*c \
mov blocknumL+4, ax !*Is0``
mov blocknumL+6, ax w[d8#U
Bk\Y v0
startread: lGr=I-=
c45s
#6
call rwsect w\s`8S
B>c$AS\5y
adc word ptr blocknuml,63d )Xg5=zn$
jnc addok xgMh@@e
adc word ptr blocknuml+2,1 &u
[{V R:
jnc addok rmzzbLTu
adc word ptr blocknuml+4,1 |hxiARr4
jnc addok ?Fx~_GT
adc word ptr blocknuml+6,1 *VhEl7
jnc addok lXTE#,XVf
jz_Y|"{`v
addok: C0[U}Y/r2
mov ax, word ptr sectors+6 MrB#=3pT
cmp ax, blocknuml+6 Qu[QcB{ro-
jg complete Hh
Q0>
jl startread .F8[;+
mov ax, word ptr sectors+4 ZN#b5I2Pf
cmp ax, blocknuml+4
^Zz^h@+
jg complete Lo'pNJH;$
jl startread B?i#m^S
mov ax, word ptr sectors+2 zEU[u7%
cmp ax, blocknuml+2 z(A[xN@/W<
jg complete _?H3*!>3
jl startread [-*&ZYp
mov ax, word ptr sectors &*>.u8:r
cmp ax, blocknuml pDlrK&;\z
jg complete V3ozaVk;
jl startread mq[=,,#
:pdX
complete: I3.. Yk%7
Y[f]L4,V
lea bx,msgready aGC3&c[Wx
mov dx,bx Rm=p}
mov ah,09 `sqr>QD
int 21 =gI41Y]
%<-OdyM
popa OiQf=Uz\
mov ax,3100h [TOo 9W
int 21h I+H~ 5zq.
NH|I>vyN
; E>s+"y
dispdx proc near ]uox ^HC
pusha 7
tlK'j'
lea bx, dsp+3 UgAp9$=z
mov cx,4 Ht;Rz*}
9{OO'at?
repeat0: e:Y+-C5
mov al,dl vQLYWRXiA
and al,0fh
J{b#X"i
cmp al,09h H9)n<r
jg add40 6}-No
add al, 30h R ?iCJ5 m
jmp okadd g0j)k6<6(Y
add40: ,:PMS8pS
add al,37h c+3`hVV
okadd: ywJ [WfCY
mov byte ptr [bx],al P6.PjK!Ar
dec bx Q~nVbj?c2v
shr dx,4 g6%]uCFB
loopnz repeat0 v|(]u3=1_
lea bx,dsp ns>$
mov dx,bx iY/2 `R
mov ah,09h q~
aFV<Q
int 21h w@^J.7h^
nRc\!4
popa xH\\#4/
ret Mc.{I"c@
dispdx endp \ji\r ]k
0\XWdTj{
dispqword proc near pFS@yHs
pusha Fge%6hu
mov cx ,4 .4^+q9M
add bx,6 (0.oE%B",1
repeatdecbx: :rU.5(,
mov dx,[bx] \85%d0@3
call dispdx f;^ +q-Q
sub bx,2 +"-l~`+<es
loopnz repeatdecbx nDdY~f.B
popa FzX ;~CA
ret ,Suk_aX>
dispqword endp IOZw[9](+
?pZU'5le`
rwsect proc near jKmjZz8L]%
< 8'
b
lea bx,msg LH(P<k&
mov dx,bx /al56n
mov ah,09h ybiTWM
int 21h Ck
)W=
<VhmtT%7
lea bx,BlockNumL a
C[G_ACwc
call dispqword L"
ejA
_y[C52,
lea di, packetsize $B-/>Rz
mov dl,80h 9Of;8R
mov ah,42h zN!W_2W*
int 13h |p[Mp:^^
jnc readok Hi={(Z5tC4
6:G&x<{
mov cx,5 -+@N/d5
;出错后重试(定位0道后再重读) `.J)Z=o
retryrd: n7bVL#Sq[
lea bx, msgReadErr ]%D!-[C%1
mov dx,bx ((A@VcX
mov ah,09 X1(ds*'Kv
int 21h F%-@_IsG#
"O>~osj
y\^zxG*]'
lea di,dap0 P^<3 Z)L
mov dl,80h "b`#RohCi
mov ah,44h [<f2h-V$
int 13h e2c'Wab
[T_[QU:A
lea bx,BlockNumL ]|g2V
a~-
call dispqword d]e36Dwk
6d]4
%Q T
lea di, packetsize 39 }e
}W"
mov dl,80h k_]'?f7Z
mov ah,42h ;SU<T^a
int 13h w{DU<e:
jnc readok !6=s{V&r1
loopnz retryrd %cn1d>M+I
s 1M-(d Q
readok: +h"i6`g
lea di, packetsize "L]v:lg3
mov dl,80h zK~8@{l}_"
mov ah,43h !6-t_S
int 13h : ir#
7/
;GM`=M4
rwsect endp +:@^nPfHy
P_3IFHe
code ends ;代码段结尾 ^$P_B-C N
end start ;结束汇编 =F_uK7W
Ld*Ds!*'/