第一个宏汇编程序 +zrAG24q
8i|w(5m;
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 zS\E/.X2
so)"4
SEu
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! H~GQ;PhRx
b3S.-W{p.
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! ZIPl7tTw
Na$Is'F&p
比较长啊!所以可以自动跳过。 .~Fp)O:!
[vMvV4,
.286 CSGz3uC2D
.radix 16 fBgEnz/
data segment ;定义数据段 pAb.c
nt;haeJ
8~9030>Q
msg db 0dh, "Reading sector:$" _$wmI/_JM
msg1 db 0dh, "Writing sector:$" af#pR&4}
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" <EPj$::
?6L&WB
dsp db " $" &ZghMq~
uHH/rMV
;DAP "VkTY|a
PacketSize db 16d; // 数据包尺寸(16字节) \%/#x V
Reserved db 0; // ==0 CNQC^d\ h
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) lZyG)0t,g
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) pWPIJ>2G:
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 *.~6S3}
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 &L
F`
W
BYO"u6
;定位用DAP (复位到0磁道) s7g(3<(
DAP0 db 16d qb5#_1qz+^
db 0 6el;Erp
dw 1 p/JL9@:'
buff1 dw 0,0 ?pYKZg/c
dw 0,0,0,0 (
{1e%
%ObLWH'
!O.[PH(,*
;DiskParameters _<=S_<$2
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) P&j(,7
falgs dw 0; WORD Flags; // 信息标志 }Ow>dV?
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 hX`hs-*qM
Heads DW 0; DWORD Heads; // 磁盘磁头数 N2oRJ,:B
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数
c1$ngH0
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 G P:FSprP
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ~/ 8M 3k/
89n:)|rWq
cmpsect dw 0 $U$V?xuE
.!1S[
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" h Ggx
msgHds db 0dh,0a,"Heads:$" z\0CE]#T
msgspt db 0dh, 0a,"SectorsPerTrack:$" Z|_K6v/c
msgTotal db 0d,0a, "Total Sectors:$" Pt@%4 :&-h
msgSS db 0dh,0a, "Sector Size:$" qOSg!aft{Q
'"?C4mbSl
msgReadErr db 0dh,0a,"Error Reading Sectors:$" ,ldI2]
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" Zm"{V iv]
msgReset db 0dh,0a, "Reseting drive to Cyl 0" =Zu^8 0/
CT KG9 T
q(zJ%Gv)
buffer db 32768d dup(0); >N;F8v
<&&SX
;
data ends ;数据段结尾 fLSXPvm
U~}
U\_
stack segment j
[rB"N`0
db 400 dup(?) R+nMy=I%8
stack ends {fha`i
MZTx:EN!
code segment ;定义代码段 "t({D
assume cs:code ;规定cs的内容 Tn eq6>
assume ds:data ;规定ds的内容 ZunCKc
assume ss:stack ~7$&WzD
Xcrk;!IB?
start: vKq^D(&cl
pusha L7= Q<D<
Z.W66\8~}^
!).}u,*'no
mov ax,data ;程序从start开始 z
>YFyu#LF
mov ds,ax ;ds置初值,data的段地址 Rl qQ
+2K :qvzZ
;设置缓冲区 -b9;5eS!
lea bx, buffer :Xn7Ha[f
mov bufferaddr,bx q}/WQ]p} <
mov buff1,bx {/X4(;~0
mov bx,ds M
t*6}Cl
mov bufferaddr+2,bx i
`s|,"0o
mov buff1,bx :N<.?%Kf
"S&@F/
lea di,infosize Mn$]I) $
mov dl,80h ~6pr0uyO`
mov ah,48h DHw&+MY
int 13h *[r!
z-@=+4~
lea bx,msgcyl `+zWu55;
mov dx,bx ~go
fQ
mov ah,09 -29gL_
dk.
int 21h 6*qL[m.F[o
mov dx,cylinders oEx\j+}@n
call dispdx JOb*-q|y
Y 2Q=rj
lea bx,msghds ]c<qM_HWg
mov dx,bx :}h>by=
mov ah,09 _(d.!qGz
int 21h X=6
y_^
mov dx,heads 4B4Z])$3
call dispdx 6\u!E~zy
cFN'bftH4
lea bx,msgspt L4b:F0
mov dx,bx r6;$1K*0
mov ah,09 4-
kZJ\]
int 21h < -uc."6\
mov dx,spt+2 '8fk+>M
call dispdx bae\Zk%`^
mov dx,spt $xOI 1|d
call dispdx 7}GK%H-u
1VF
lea bx,msgtotal `C_jP|[e
mov dx,bx Tx1vL
mov ah,09 Fi.aC;sx
int 21h T;diNfgg
lea bx,sectors &O)&k
call dispqword 9U {y1}
OdQT2PA_
lea bx,msgss +vNZW@_$D
mov dx,bx
d\H&dkpH
mov ah,09 hY*0aZ|(
int 21h ^A][)*SZ
mov dx,sectorsize 6vp *9
call dispdx i\4hR?
8>7RxSF
sbb word ptr sectors, 63d q;fKcblKj
jnc subok +B'8|5tPX
sub word ptr sectors+2,1 \.f}W_OF
jnc subok X*g(q0N<S
sub word ptr sectors+4,1 4<lQwV6=
jnc subok 7_wJpTz
sub word ptr sectors+6,1 qC_mu)6
Tzt ,/e
subok:
l
akp
'
lo
kWlAY%
6oinidB[l
xor ax,ax RQkyC
AGx
mov blocknumL, ax *d(SI<j
mov blocknumL+2, ax 8K;Y2
#
mov blocknumL+4, ax X; 5Jb
mov blocknumL+6, ax LuR,f"%2
=?])['VaA
startread: IcrL
_TUk(Qe
call rwsect < AI;6/
lJzl6&
adc word ptr blocknuml,63d V $|<
jnc addok X53mzs
adc word ptr blocknuml+2,1 'JdkUhq1V
jnc addok 4J|t?]ij|E
adc word ptr blocknuml+4,1 x lsqj`=
jnc addok B-*E:O0y
adc word ptr blocknuml+6,1 3IR
^
jnc addok ZkP{[^6d\
FZ|CqD"#
addok: B_ja&) !s1
mov ax, word ptr sectors+6 dl5=q\1=
cmp ax, blocknuml+6 N7%TYs
jg complete nx:KoB"ny
jl startread M wab!Ya
mov ax, word ptr sectors+4 rVtw-[p
cmp ax, blocknuml+4 Y4F6qyP)"
jg complete PSRzrv$l
jl startread .6m "'m0;
mov ax, word ptr sectors+2 4Hb $0l
cmp ax, blocknuml+2 li]
6Pj,
jg complete l;"Ab?P\
jl startread _1*7Z=|
mov ax, word ptr sectors
EQIUSh)M
cmp ax, blocknuml [EY`am8[
jg complete
0G <hn8>
jl startread 2 $ !D* <
c=[q(|+O!
complete: Z?NEO>h7
2b=)6H1
lea bx,msgready _Cy:]2o
mov dx,bx G~wF nl%
mov ah,09 U{~SXk'2+
int 21 `_5GG3@Ff
8ZcU[8r
popa Z~6[ Z
mov ax,3100h {kLGWbo|Q
int 21h <&pKc6+{
3Db3xN
; `W `0Fwu9
dispdx proc near D-IR!js ]
pusha B/J&l
lea bx, dsp+3 ?X9]HlH
mov cx,4 :%JC^dV(
H]\Zn%.#
repeat0: 85IMdZ7I
mov al,dl _Mc>W0'5@
and al,0fh (X +s-4%
cmp al,09h
Ch_xyuJ
jg add40 xMs]Hs
add al, 30h p<`+sf}A:
jmp okadd J4tcQ
add40: TFR(
4W
add al,37h pi@Xkw
okadd: 6P`)%zj
mov byte ptr [bx],al E2AW7f(/
dec bx !r+IXuqV,!
shr dx,4 Ogg#jx(4
loopnz repeat0 kax\h
lea bx,dsp p T[gdhc
mov dx,bx ~~F2Ij
mov ah,09h _M,lQ~
int 21h -6=<#9R
?
0<w
popa D H
^T x
ret `@`1pOb
dispdx endp Y-~~,Yl~
u/Fj'*M
dispqword proc near td{O}\s7D
pusha a
:HNg
mov cx ,4 PfG`C5
d
add bx,6 `C_'|d<HA
repeatdecbx: }:z5t,u6
mov dx,[bx] y69J%/c
ra
call dispdx
7S
$&S;
sub bx,2 i2J q|9,g
loopnz repeatdecbx k_GP>b\"k
popa R4e&^tI@*
ret oc{EuW{Ag
dispqword endp PoShQR<
!EF(*~r!9L
rwsect proc near p"`%
OQ4c#V?
lea bx,msg >0Ev#cX4
mov dx,bx rrs"N3!aT
mov ah,09h
f+Dn9t
int 21h Ep ~wWQh
7Bz*r0 9S
lea bx,BlockNumL =y%rG :!
call dispqword U5/qf8)yO
Y7U&Q:5'
lea di, packetsize gJ3c;
mov dl,80h 7ODaX.t->
mov ah,42h 2GWDEgI1o
int 13h 9.M{M06;
jnc readok wH"kk4^
*s)}Bj
mov cx,5 {SG>'KXZ
;出错后重试(定位0道后再重读) RbQ <