第一个宏汇编程序 ig4mj47wJ
i 8:^1rHp)
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 tFX!s;N[
WP4"$W
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! ,pa=OF
#A^(1
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! J;Eg"8x]
g>-u9%aa
比较长啊!所以可以自动跳过。 W"1=K]B
VevDW }4q*
.286 zOMU&;.\
.radix 16 n
w
data segment ;定义数据段 9~}.f1z
6<9gVh<=w
yGlOs]>n
msg db 0dh, "Reading sector:$" e%KCcU
msg1 db 0dh, "Writing sector:$" Kj*$'('
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" YT)@&HaF
lVS.XQ2<
dsp db " $" 'E %+ O
;a`I8F j
;DAP ]SNcL
[U
PacketSize db 16d; // 数据包尺寸(16字节) m]/sR3yF
Reserved db 0; // ==0 =xM:8
hm
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) vp`s< ;CA
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) :xsNn55b
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 ihopQb+k^m
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 D@yu2}F{IY
YbuS[l8
;定位用DAP (复位到0磁道) F^X:5g~K
DAP0 db 16d {GS$7n
db 0 P]`m5 N
dw 1 u-HBmL
buff1 dw 0,0 6G<gA>V
dw 0,0,0,0 "M=1Eb$6=
(r"2XXR
{'[S.r`
;DiskParameters fk(h*L|sI
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) YFs!
,fw'
falgs dw 0; WORD Flags; // 信息标志 {S5j;
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 WS1#i\0
Heads DW 0; DWORD Heads; // 磁盘磁头数 .a
`ojT
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 O
718s\#
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 w>6cc#>q
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) q 1+{MPJ
4_h?E:sBb
cmpsect dw 0 KNqs=
:i
X>ck.}F
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" '%[r 9w
msgHds db 0dh,0a,"Heads:$" EGK7)O'W
msgspt db 0dh, 0a,"SectorsPerTrack:$" Yk
yB
msgTotal db 0d,0a, "Total Sectors:$" <{1=4PA
msgSS db 0dh,0a, "Sector Size:$" Pe?b#
G
1ika'
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 0-Vx!(
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" M]A!jWtE
msgReset db 0dh,0a, "Reseting drive to Cyl 0" YCo qe,5
t? [8k&Z
Y]H,rO
buffer db 32768d dup(0); YY
8vhnw
0Y9fK? (
data ends ;数据段结尾 +cC$4t0$^A
P6u%-#
stack segment Un\
T}
c
db 400 dup(?) ^_JByBD
stack ends Ep1p>s^
[PL]!\NJ
code segment ;定义代码段 ?TY/'-M5
assume cs:code ;规定cs的内容 #iP5@:!Wm~
assume ds:data ;规定ds的内容 \Qei}5P,
assume ss:stack z-?WU
c_FnJ_+ +f
start: & _mp!&5XV
pusha JId|LHf*P
UGK,+FN
oE'Flc.
mov ax,data ;程序从start开始 =x}p>#o,J
mov ds,ax ;ds置初值,data的段地址 Qi\"b
)UAkg
;设置缓冲区 ZA'Qw2fF0
lea bx, buffer ) (l=_[1Z5
mov bufferaddr,bx ~?uch8H
mov buff1,bx qt4^e7
o
mov bx,ds 0'~Iv\s
mov bufferaddr+2,bx )P
#MUC
mov buff1,bx eWTbHF
vJ0Zv>
n-
lea di,infosize fkJE lO-F
mov dl,80h TtP2>eh-
mov ah,48h 5FwVR3,
int 13h )1o<}7
btWvoKO*
lea bx,msgcyl do=s=&T
mov dx,bx HiTj-O
mov ah,09 HR$;QHl~F
int 21h Y@Ti2bI`v
mov dx,cylinders 9O\N
K:2
call dispdx W,ik
;P\
MNd[Xzm
lea bx,msghds >
0.a#-u^
mov dx,bx q,*([yX
mov ah,09 lbiMB~rwI
int 21h y(*#0fJrTV
mov dx,heads fQ_(2+FM
call dispdx ^ 9 FRI9?
<F<jx"/)
lea bx,msgspt %M
u$0~ct"
mov dx,bx QT7PCHP
mov ah,09 B dKD%CJ[
int 21h @"'$e_jj"
mov dx,spt+2 .fD%*-
call dispdx FFpG>+*3
mov dx,spt R>dd#`r"
call dispdx Vc$y^|=
.Fm@OQr
lea bx,msgtotal !TeI Jm/l
mov dx,bx Bf{c4YiF
mov ah,09 |}naI_Qudv
int 21h !\/J|~XZ
lea bx,sectors G2!J`}
call dispqword @szr '&\%A
J0,;F9<C#X
lea bx,msgss z 3N'Xk
mov dx,bx E% d3}@
mov ah,09 pW1(1M)[%Z
int 21h L1YiXJ,T,
mov dx,sectorsize I"bz6t\~|
call dispdx d.t$VRO
3jDAj!_ea
sbb word ptr sectors, 63d y]b&3&
jnc subok vmIt!x
sub word ptr sectors+2,1 x5%x""VEK
jnc subok G'f5MP1
sub word ptr sectors+4,1 ,@0D_&JAl
jnc subok .+$ox-EK8
sub word ptr sectors+6,1 H/N4tWk"
5:|=/X%#qp
subok: RGy+W-
<#~n5W{l
ki'
CW4x
/a?qtRw
xor ax,ax -~v1@
mov blocknumL, ax &AP`k
mov blocknumL+2, ax *I9O+/,
mov blocknumL+4, ax /MZ^;XG
mov blocknumL+6, ax Ri;_
8v[H|
{pk]p~
startread: )SyU
][`% vj9r
call rwsect njckPpyb@
?,^Aoy
adc word ptr blocknuml,63d @^Y
r=d ba
jnc addok OU'm0Jlk
adc word ptr blocknuml+2,1 9A ?)n<3
d
jnc addok }va>jfy
adc word ptr blocknuml+4,1 \h5!u1{L
jnc addok +l<l3uBNS
adc word ptr blocknuml+6,1 4}F~h
jnc addok 5&TH\2u
2(H-q(
addok: {3!E8~
mov ax, word ptr sectors+6 P$5K[Y4f
cmp ax, blocknuml+6 .JX9(#Uk
jg complete Kjt\A]R%
jl startread FA!!S`{\
mov ax, word ptr sectors+4 D";@)\jN
cmp ax, blocknuml+4 tR(nD UHV5
jg complete RAj>{/E#W
jl startread ~DP_1V?
mov ax, word ptr sectors+2 9nSfFGu
cmp ax, blocknuml+2
{[dY$
jg complete tr|)+~x3
jl startread KvXFzx|A
mov ax, word ptr sectors I`;SA~5
cmp ax, blocknuml 3@\J#mR
jg complete y~^-I5!_ u
jl startread }56WAP}Z 4
Bu
"5NB
complete: D|$Fw5!^k6
_BZ6Ws$C2
lea bx,msgready wEC,Mbn
mov dx,bx (!%9#
mov ah,09 a!B"WNb+
int 21 uF+0nv+
ziC%Q8
popa ;@xlrj+
mov ax,3100h .?kq\.rQ
int 21h :*Y2na)qQ
:B:6ezDF6
; Go(Td++HS
dispdx proc near 2]=`^rC*
pusha i>e?$H,/
lea bx, dsp+3 n&3}F?
mov cx,4 `#"xgOSP>
1P?|.W_^1
repeat0: Y`rl
i
mov al,dl u6SQq-)d
and al,0fh ||4T*B06
cmp al,09h Vrs?VA`v$
jg add40 *USG
p<iH
add al, 30h g
cb6*@u!
jmp okadd ZlP+t>
add40: 0+F
--E4
add al,37h E
YA=f
U
okadd: LB`{35b-
mov byte ptr [bx],al <.&84c]/&
dec bx 8p]9A,Uq&
shr dx,4 (dTQ,0
loopnz repeat0 ;OZl'
. %`
lea bx,dsp
0ZJj5<U
mov dx,bx Up5 |tx7
mov ah,09h 33g$mUB
int 21h 2P ^x'I
PU8dr| !
popa }:57Ym)7w
ret BhhFij4
dispdx endp )3k?{1:
B>g(i=E
dispqword proc near 1Eb2X}XC
pusha JJK-+a6cX
mov cx ,4 y/+IPR
add bx,6 Bk[C=< X
repeatdecbx: rFaG-R
mov dx,[bx] QD%!a{I
call dispdx e,
fZ>EJ
sub bx,2 2'u%
loopnz repeatdecbx </2 aQn
popa +t3o5&
ret Ub/ZzAwq
dispqword endp " =6kH,
[:uHe#L
rwsect proc near fUr%@&~l^
%%NT m
lea bx,msg qw1W}+~g
mov dx,bx t<o7 S:a"
mov ah,09h XJ5@/BW
int 21h tQas_K5
CK1A$$gnz
lea bx,BlockNumL @JGFG+J}
call dispqword RLZfXXMn
)/)[}wN;j
lea di, packetsize |Z)}-'QUJ
mov dl,80h [>t;P,
mov ah,42h 7hTp
jox2
int 13h Jy\0y[f*
jnc readok U$Z<lx2P
$JUkwsc
mov cx,5 k||dX(gl
;出错后重试(定位0道后再重读) #ID
fJ2
retryrd: Wf^sl
lea bx, msgReadErr [!4xInS
mov dx,bx @T:J<,
mov ah,09 2vh }:A_
int 21h "YaT1`Kr
`!$6F:d_l
@<`V q
lea di,dap0 ==Xy'n9'
mov dl,80h QO^V@"
N
mov ah,44h iD*
Hh-
int 13h g9fYt&
,J,Rup">h
lea bx,BlockNumL [$;cjys
call dispqword lrj&60R`w
at4JLbk
lea di, packetsize @Pf9;7,TV
mov dl,80h b$yIM
mov ah,42h h3-^RE5\`S
int 13h (Ldvx_
jnc readok %P D}VF/Y
loopnz retryrd tDRo)z
HNCu:$Wr@
readok: `S0`3q}L3%
lea di, packetsize E- [Eg
mov dl,80h *CPp U|
mov ah,43h yjsj+K
pL
int 13h 0N~kq-6.\
qoOwR[NDcq
rwsect endp FSm.o?>
(~o"*1fk>
code ends ;代码段结尾 +Gg|BTTL/
end start ;结束汇编 /QWXEL/M=
7e\Jg/FU