第一个宏汇编程序 &}FYz8w 2/
+Il=gL1
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 TaC)N
rcK*",>
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! }Z6/b
_kV
?|33Np)
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! ~-6;h.x=
E(oN
S\4
比较长啊!所以可以自动跳过。 `u U@(
Rg6>6.fk*
.286 1pK7EK3R
.radix 16 nxt1Y04,H
data segment ;定义数据段 cZYX[.oIB
)mEF_ &
uzo}?X
#
msg db 0dh, "Reading sector:$" $lqV(s
msg1 db 0dh, "Writing sector:$" jmIP c3O0
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" uxcj3xE#d
fTeo
,N
dsp db " $" _D:/?=y;e
5v3B8 @CsA
;DAP n RGH58
PacketSize db 16d; // 数据包尺寸(16字节) ^vPa{+N
Reserved db 0; // ==0 f6XWA_[i@
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) uO6_lOT9n
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) S8y4 p0mV
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 im'0^
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 Ov9.qNT
NF.SGga
;定位用DAP (复位到0磁道) l^_X?L@
DAP0 db 16d g41LpplX
db 0 f,1rmX1
dw 1 VltWY'\Wu;
buff1 dw 0,0 (ZnA#%
dw 0,0,0,0 0nS6<:
jK{MU) D+
!xvPG
;DiskParameters >Cf`F{X'U
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) Qhr:d`@^]
falgs dw 0; WORD Flags; // 信息标志 SbZk{lWcq
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 |qr[*c 3$1
Heads DW 0; DWORD Heads; // 磁盘磁头数 ~`BOzP
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 Y/+ D4^L
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 TwH(47|?Nt
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) KpE#Ye&
*0U(nCT&m
cmpsect dw 0 U +]ab
2/~v
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" i ]_fh C
msgHds db 0dh,0a,"Heads:$" a'\`Mi@rb
msgspt db 0dh, 0a,"SectorsPerTrack:$" QV't+)uUVo
msgTotal db 0d,0a, "Total Sectors:$" y`BLIEI
msgSS db 0dh,0a, "Sector Size:$" "7l}X{b
\yxr@z1_b
msgReadErr db 0dh,0a,"Error Reading Sectors:$" E,r PM
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" )#Id2b~
msgReset db 0dh,0a, "Reseting drive to Cyl 0" eAqQ~)8^
;(afz?T
gR6:J
buffer db 32768d dup(0); AT%0i
Nwc(<
data ends ;数据段结尾 ij TtyTC
M *}$$Fe|
stack segment =_XcG!"
db 400 dup(?) 1#@'U90xf
stack ends e7;]+pN]J
sJD"u4#y
code segment ;定义代码段 giTlXz3D9
assume cs:code ;规定cs的内容 ABSeX
assume ds:data ;规定ds的内容 &M2x`
assume ss:stack -P?}
qy^j(
Bj2rA.M
start: ?{[H+hzz0
pusha 6!'yU=Z`
G'("-
9
JdAjKN
mov ax,data ;程序从start开始 )SQ g
mov ds,ax ;ds置初值,data的段地址 )u
aB^L1
9\;EX
;设置缓冲区 ZibODs=f;
lea bx, buffer UX0tI0.tg
mov bufferaddr,bx "~;jFB8
mov buff1,bx :Cuae?O,
mov bx,ds ,s2.l/5r;C
mov bufferaddr+2,bx L{=z}QO
mov buff1,bx QSLDA`
qq/Cn4fN8
lea di,infosize ?ix,Cu@M
mov dl,80h 8]c`n!u=`
mov ah,48h HP8pEo0Y
int 13h vxgm0ZOMN
OY)x
Kca
lea bx,msgcyl 2H /a&uo@n
mov dx,bx _#+9)*A
mov ah,09 .{}t[U
int 21h KIS.4nt#d"
mov dx,cylinders ]uZH 0
call dispdx v
ipmzg(S
jlB3BwG{w
lea bx,msghds Ns $PS\
mov dx,bx spI
{d!c
mov ah,09 DXiD>1(q
int 21h p$V+IJtO(
mov dx,heads lL^7x
call dispdx &a:aW;^A7
%`TLs^
lea bx,msgspt 07#!b~N
mov dx,bx RS1
oPY
mov ah,09 '-x%?Ll
int 21h @
!S$gTz
mov dx,spt+2 qvscf_%FM
call dispdx '=2t(@aC
mov dx,spt CuGk?i
call dispdx wVvU]UT
&yN<@.
lea bx,msgtotal (y36NH+
mov dx,bx c1/x,1LnMf
mov ah,09 @4|/| !
int 21h Jq!($PdA
lea bx,sectors k9,"`dk@
call dispqword l{R)yTO
KV6S-
lea bx,msgss ]+lr
mov dx,bx 3l^pY18H'
mov ah,09 Mc8^{br61
int 21h n5i}J/Sa2
mov dx,sectorsize H0HYb\TX ?
call dispdx 1Y`MJ\9
%(]rc%ry0
sbb word ptr sectors, 63d pg<>Ow5,~l
jnc subok HI?>]zz|
sub word ptr sectors+2,1 vfm-K;,#
jnc subok 4EK[g
M8
sub word ptr sectors+4,1 |(V3
jnc subok @|@43}M]C-
sub word ptr sectors+6,1 Nh))U
+~@Y#>+./l
subok: NWvxbv
5J;c;PF
t0q@]
0B5
p
hdN9<Z
xor ax,ax @^ e@.)
mov blocknumL, ax :uEp7Y4
mov blocknumL+2, ax pIXQ/(h31
mov blocknumL+4, ax ox6rR
mov blocknumL+6, ax .DQ]q o]OG
Ojs\2('u
startread: L:<'TXsRA
GZ={G2@=I
call rwsect cMg/T.O
5"Yw$DB9
adc word ptr blocknuml,63d g9
XtE
jnc addok F)@<ZE
adc word ptr blocknuml+2,1 e#('`vGB
jnc addok v^tKT&
adc word ptr blocknuml+4,1 Ie~~L U
jnc addok EkX6> mo
adc word ptr blocknuml+6,1 0#JBz\
jnc addok R<=t{vTJ5
QZlUUj\
addok: 6D0,ME#
mov ax, word ptr sectors+6 G!\xc
cmp ax, blocknuml+6 ($s{em4L
jg complete }dz(DPd
jl startread b\2"1m0H
mov ax, word ptr sectors+4 F0\ry "(t
cmp ax, blocknuml+4 NEk [0
jg complete =FnZk J
jl startread Jj " {r{
mov ax, word ptr sectors+2 S&*pR3,u
cmp ax, blocknuml+2 2?j1~ ]DvZ
jg complete AMdS+(J
jl startread %?fzT+-=%
mov ax, word ptr sectors +[ zo2lBx
cmp ax, blocknuml =m:W
jg complete 7r>W r#
jl startread Oq5k4
@jHio\/_
complete: (a?Ip)`I
Q1Ao65
lea bx,msgready ${wE5^ky
mov dx,bx e?>suIB
mov ah,09 R 6Em^A/>
int 21 ui1m+
jq)|U
q'6
popa keOW{:^i
mov ax,3100h C)w*aU,(
int 21h [78
.%b'
qE}YVKV*
; M6iKl
dispdx proc near OT i3T1&
pusha w3>|mDA}I
lea bx, dsp+3 H[
q{R
mov cx,4 YqgW8EM
3)Y:c2
repeat0: <.ky1aex7
mov al,dl {9
O`/|
and al,0fh z7
C1&bGe
cmp al,09h =*jcO1
19L
jg add40 -e>)yM `i
add al, 30h s`RJl V
jmp okadd '9@R=#nd
add40: A]$+
`uS\
add al,37h Ziimz}WHF
okadd: _ GSw\r
mov byte ptr [bx],al [<QWTMjR
dec bx 5eA]7$ic
shr dx,4 W+?[SnHL/
loopnz repeat0 Z >=Y
lea bx,dsp kqw? X{
mov dx,bx QEa=!O
mov ah,09h CN(4;-so)
int 21h sfE8b/Z8
MFuI&u!g:
popa
+`-a*U94
ret W?-BT >#s
dispdx endp ;0}2@Q2@ZK
+_P
2S
dispqword proc near -QDgr`%5
pusha ~b0qrjF;O
mov cx ,4 0(x@
NGb>{
add bx,6 A#&qoZ(C
repeatdecbx: p)xI5,b$9
mov dx,[bx] )7
g_v*
call dispdx *(B[J
sub bx,2 VAGMI+ -
loopnz repeatdecbx 4tJ4X' U
popa _`>7
Q),7
ret \*aLyyy3
dispqword endp /}_c7+//
q}Z
T?Xk?
rwsect proc near ]xEE7H]\h
RI3{>|*
lea bx,msg |wQZ~Ux:
mov dx,bx ZGhoV#T@
mov ah,09h +z0}{,HX
int 21h ^]&{"!
}TJ|d=
lea bx,BlockNumL 5C1Rub)
call dispqword c0q)
5l0rw)
lea di, packetsize `e>F<{
M6@
mov dl,80h x=Jn&4q
mov ah,42h /? 1Yf
int 13h B@inH]wq
jnc readok fMPq
&xroms"S=
mov cx,5 k<zGrq=8J
;出错后重试(定位0道后再重读) i03}f%JnuO
retryrd: pm@Z
[g
lea bx, msgReadErr AO$PuzlLh
mov dx,bx %L>n
Xj
mov ah,09 % 3-\3qx*
int 21h %yM'
Z[-
^@L
l(?
1[g!^5W
lea di,dap0 }lUpC}aq_
mov dl,80h u;ooDIq@
mov ah,44h p6Dv;@)Yn
int 13h tW"ptU^9)
k5QD5/Ej
lea bx,BlockNumL m:fouMS
call dispqword 8~(+[[TQ@
LiD |4(3
lea di, packetsize LYg$M@
mov dl,80h [2 w<F[
mov ah,42h m4U+,|Fa
int 13h 0$ 9;pzr
jnc readok 3hf;4Mb
loopnz retryrd ZHD0u)ri=J
&xuwke:[
readok: 6
Y_O^f
lea di, packetsize dN\P&"`
mov dl,80h |+xtFe
mov ah,43h ca3BJWY}J
int 13h )):22}I#
GHC?Tp
rwsect endp (<R\
<
ivqe"m
code ends ;代码段结尾 p/WH#4Xdr
end start ;结束汇编 8
]06!7S}
*tfDXQ^mN