第一个宏汇编程序 U{HBmSR
e^hI[LbNC
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 n5*m x7
BIT<J5>
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! F_V/&OV
$- GwNG
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! f6#1sO4"
Nxm '*
-A
比较长啊!所以可以自动跳过。 ]YB,K)WQ
_~!c%_
.286 X C'|
.radix 16 % "ZC9uq?
data segment ;定义数据段 @~IZ%lEQsD
=z}M(<G
X
u
>]$+u#
msg db 0dh, "Reading sector:$" al4X}
msg1 db 0dh, "Writing sector:$" &VVvZ@X;
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" !'=<uU-
gyCXv0*z
dsp db " $" quFNPdP
|(9l_e|
;DAP A.<M*[{q
PacketSize db 16d; // 数据包尺寸(16字节) SqoO
"(1x
Reserved db 0; // ==0 5"Y:^_8
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) "}uV=y
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset)
0'R
}'
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 o7yvXrpG(U
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 YRj"]=
5N
; VQ:\fG
;定位用DAP (复位到0磁道) P_M!h~
DAP0 db 16d ~vfPsaRh
db 0 ) =|8%IrB
dw 1 N$cAX^~
buff1 dw 0,0 @%6"xnb`
dw 0,0,0,0 kO
,vHg$
S#\Cyn2(t
]yas]5H
;DiskParameters O{=@c96rl
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) I&5cUj{GX-
falgs dw 0; WORD Flags; // 信息标志 z>spRl,dr
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 {.r9l
Heads DW 0; DWORD Heads; // 磁盘磁头数 =Unu>p}2V
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 d*:J0J(
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 0|(6q=QK
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) CW~c<,"
M+L0 X$}NZ
cmpsect dw 0 0Rh*SoYrC
@DyMq3Gt?&
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" &GI'-i
msgHds db 0dh,0a,"Heads:$" E|=]k
msgspt db 0dh, 0a,"SectorsPerTrack:$" .kDJuJ^
msgTotal db 0d,0a, "Total Sectors:$" gq+#=!(2
msgSS db 0dh,0a, "Sector Size:$"
;.~D!
(z%OK[
msgReadErr db 0dh,0a,"Error Reading Sectors:$" W1O Y}2kj
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" =%+xNOdN7?
msgReset db 0dh,0a, "Reseting drive to Cyl 0" +qyx3c+
qn `
\g
^]$rh.7&
buffer db 32768d dup(0); qvRs1yr?q
Y,X0x-
data ends ;数据段结尾 4n2*2
yTg
eak+8URo
stack segment lq)[
db 400 dup(?) g=S|lVQm
stack ends tU>4?`)E
{JW_ZJx
code segment ;定义代码段 J8DKia|h(
assume cs:code ;规定cs的内容 ]?hl
pL
assume ds:data ;规定ds的内容 N\zUQ
J
assume ss:stack @Sz7*p
Kj|\ALI':
start: t},71Ry
pusha >7QC>ws%
<z{,@Z}
7*47mJyc
mov ax,data ;程序从start开始 0Y*Ag,S
mov ds,ax ;ds置初值,data的段地址 6,skF^
N
!13QI
H
;设置缓冲区 [<#`
@Kr
lea bx, buffer 2%j"E{J&
mov bufferaddr,bx l/bZE.GJ
mov buff1,bx Bv}nG|
mov bx,ds ,uS}wJAX
mov bufferaddr+2,bx 8*(|uX
mov buff1,bx kT&GsR/
F=$U.K~1?
lea di,infosize 2Vg+Aly4D
mov dl,80h Dfd%Z
;Yu
mov ah,48h r6}-EYq=
int 13h MNKY J
E}|IU Pm
lea bx,msgcyl "%+9p6/
mov dx,bx R
"e53 3
mov ah,09 vt}A6mF
int 21h R%;dt<Dh
mov dx,cylinders
s%)>O{{)
call dispdx .IORvP-M&
CSMx
]jbb
lea bx,msghds 6am<V]Hw0F
mov dx,bx ^+9i~PjL
mov ah,09 f`p"uLNo<
int 21h ]U5/!e
mov dx,heads AXpyia7nU
call dispdx '6Yx03t
M}9PicI?7
lea bx,msgspt .OD{^Kq2
mov dx,bx E^V4O l<
mov ah,09 =OooTZb:x-
int 21h (APGz,^9#
mov dx,spt+2 f >\~h,SLL
call dispdx o>\epQt~/p
mov dx,spt Br"K{g?
call dispdx vi0nJ -Xg
Bet?]4\_
lea bx,msgtotal ]U3@V#
*
mov dx,bx wmFS+F4`2
mov ah,09 5f#]dgBe
int 21h /3d6Og
lea bx,sectors @5TJ]=
call dispqword S{qsq\X
2r#W#z%vS
lea bx,msgss B%KfB
VC
mov dx,bx rh6m
mov ah,09 ~
6Hi"w
int 21h h7>`:~
mov dx,sectorsize DgC;1U'
call dispdx l~GcD
(Bu-o((N@0
sbb word ptr sectors, 63d ((]Sy,rdk
jnc subok AM4
:xz
sub word ptr sectors+2,1 f.Ms3))
jnc subok rNX]tp{j
sub word ptr sectors+4,1 p}-B>v
jnc subok )dI `yf
sub word ptr sectors+6,1 5x'
^.$K >
h, P#)^"
subok: 6ieP` bct
K=;oZYNd
UQ+!P<>w
=' #yG(h
xor ax,ax Z~DR,:
mov blocknumL, ax }<G#bh6;Q
mov blocknumL+2, ax >/DlxYG?
mov blocknumL+4, ax ykG^(.E
mov blocknumL+6, ax
LW+^m6O
0I[3%Q {
startread: -{S:sK.o
-Deqlaf(
call rwsect T3^(I~03
O.
OSLezTQ
adc word ptr blocknuml,63d 3[iHe+U(
jnc addok Y
f;Slps
adc word ptr blocknuml+2,1 Z=>#|pW,)
jnc addok UoKXo*W2
adc word ptr blocknuml+4,1 i^&^eg'.5
jnc addok .V|o-~c
adc word ptr blocknuml+6,1 Z66q0wR7
jnc addok ,c[f/sT\
4'0rgS
addok: N(L?F):fT
mov ax, word ptr sectors+6 psE&Rx3)
cmp ax, blocknuml+6 3 3b 3v\N
jg complete Vw b6QIs
jl startread z<n&P7k5j
mov ax, word ptr sectors+4 NEX{vZkgw
cmp ax, blocknuml+4 (T2\
jg complete 3X}>_tj
jl startread b)@b63P_
mov ax, word ptr sectors+2 M`.v/UQn
cmp ax, blocknuml+2 !Ytr4DtM
jg complete r7n-Xe
jl startread ;bes#|^F
mov ax, word ptr sectors nL&[R}@W
cmp ax, blocknuml ^EmI;ks
jg complete Y%)@)$sK
jl startread #N `Z)}Jm
>^
M=/+<c
complete: x8E!Ko](
R3@$ao
lea bx,msgready I?%iJ%
mov dx,bx _9b;8%?Yf
mov ah,09
.'^
Pg
int 21 $qh?$a
:LBRyBV
popa SHP_
mov ax,3100h 5<L+T
int 21h }`$Sr&n 1
y4~;H{!
; TTzvH;S
dispdx proc near S(h+,+289
pusha Ce_ES.
lea bx, dsp+3 j43-YdCJ
mov cx,4 Tjza3M
D$G:#z*
repeat0: GJ4R f%
mov al,dl ^jZ4tH3K
and al,0fh :sXn*k4v
cmp al,09h haIH `SY
jg add40 RS[>7-9
add al, 30h B]5G"4,
jmp okadd [5TGCGxP{
add40: Kq2,J&Ca3
add al,37h YCEdt>5PA
okadd: o<8=@ ^T
mov byte ptr [bx],al <46
fk*
dec bx @If ^5s;z
shr dx,4 x9VR>ux&
loopnz repeat0 rP7f~"L
lea bx,dsp 8!u8ZvbFG
mov dx,bx ,xsFBNCC
mov ah,09h `f+l\'.s
int 21h }o MY
2/V9Or52
popa u.L{3gkT
ret IJV1=/NJW
dispdx endp gN/6%,H}
uPveAK}h
dispqword proc near or]kXefG3
pusha 0'4V*Y
mov cx ,4 %,[p[`NRYR
add bx,6 Uk|(VR9
repeatdecbx: @`
Foy
mov dx,[bx] D\i8WU
call dispdx r__Y{&IO
sub bx,2 Fb9!x/$tGV
loopnz repeatdecbx V50FX}i
popa %vFoTu)2
ret !`?*zf
dispqword endp Z 361ko}
kA%"-$3
rwsect proc near Q7@.WG5
"] 0sR
lea bx,msg c@~j}(A
mov dx,bx |]8Hh>
mov ah,09h ;;g'C*_
int 21h eW^_YG%(
beCTOmC
lea bx,BlockNumL /K<.$B8
call dispqword ;OynkZs)
rkz_h
lea di, packetsize n; fUwon
mov dl,80h sM$gfFx
mov ah,42h UN6Du\)]d
int 13h _MC\\u/C/
jnc readok a+Z95~*sZ"
NRgNW1#
mov cx,5 YFY$iN~B,
;出错后重试(定位0道后再重读) #^~[\8v>
retryrd: ]K(>r#'nH
lea bx, msgReadErr ?E:L6,a
mov dx,bx (:2,Rr1"
mov ah,09 [exIK
int 21h ?XNQ_m8f
_.y0QkwV
K}p!W"!o
lea di,dap0 WbW@V_rr
mov dl,80h vPA {)l\K
mov ah,44h Ot#O];3
int 13h jk'.Gz
=UW!
7OzC
lea bx,BlockNumL G 0;5I_D/
call dispqword T,eP&IN
dJ}E,rW}
lea di, packetsize Ysz&/
ry
mov dl,80h A$]&j5nh|
mov ah,42h DoA+Bwq@
int 13h i-`n5,
jnc readok
,Bg)p_B
loopnz retryrd /?wH1 ,
|p"E0av
readok: UBy<
vwnU
lea di, packetsize =Vm"2g,aA
mov dl,80h ` kG}NJf
mov ah,43h
YYc.e T<
int 13h Vx6/Rehj
sHSD`mYq
rwsect endp nR1QS_@{L
{2Jn#&Z29
code ends ;代码段结尾 _H+|Ic
end start ;结束汇编 -$js5Gx1
-1 Ok_h"