第一个宏汇编程序 /?*]lH.
q%i-`S]}qL
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 R[jEvyD>(
KC#/Z2A|<
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! a`!@+
6yC
[0y$! f4
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! /.1.MssQM
gE])!GMM3
比较长啊!所以可以自动跳过。 _>yoX
_zMgoc7
.286 f0>!qt
.radix 16 :J/M,3
data segment ;定义数据段 f-SuM% S_
oD.r`]k
g[[;w*;z
msg db 0dh, "Reading sector:$" F_H82BE+3
msg1 db 0dh, "Writing sector:$" T.mmmT
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 2
=iH$v
@t*t+Vqw
dsp db " $" Vsnuy8~k
u0Nm.--;_3
;DAP 8gy_Yj&{P
PacketSize db 16d; // 数据包尺寸(16字节) }H"kU2l
Reserved db 0; // ==0 . (}1%22
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) eOI (6U!
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) y[?-@7i
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 Ul+Mo&y-
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 i+{yMol1
\tN-(=T
;定位用DAP (复位到0磁道) r]Lc9dL
DAP0 db 16d !?!C'-ps
db 0 .(CP. d
dw 1 )"+2Z^1-
buff1 dw 0,0 {Ui=b+
dw 0,0,0,0 >e,mg8u6$
Qf $|_&|
_iV]_\0W2
;DiskParameters EYX$pz(x;
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) )#iq4@)|g
falgs dw 0; WORD Flags; // 信息标志 04U")-\O
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 ,yd= e}lQx
Heads DW 0; DWORD Heads; // 磁盘磁头数 iyta;dw9
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 alq%H}FF
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 [U/(<?F{(
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) Ch \&GzQ
.iD*>M:W
cmpsect dw 0 hrGH}CU"
w= P9FxB
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" x1&W^~
msgHds db 0dh,0a,"Heads:$" JW.=T)
msgspt db 0dh, 0a,"SectorsPerTrack:$" v<Kmq-b
msgTotal db 0d,0a, "Total Sectors:$" tptN6Isuh
msgSS db 0dh,0a, "Sector Size:$" Av' GB
\ZU1Jb1c
msgReadErr db 0dh,0a,"Error Reading Sectors:$" Yz$3;
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" W ~f(::
msgReset db 0dh,0a, "Reseting drive to Cyl 0" fw6UhG
h vka{LD
67SV~L#%O
buffer db 32768d dup(0); G
L{57
%zk$}}ti.
data ends ;数据段结尾 Uyx!E4pl(
!> }.~[M
stack segment :GpDg
db 400 dup(?) XolZonJr
stack ends L|@
y&di
y:m_tv0~0
code segment ;定义代码段 $37
g]ZD
assume cs:code ;规定cs的内容 ?';OD3-
assume ds:data ;规定ds的内容 !V2/A1?
assume ss:stack :j }fC8'
:>R
v!x`
start: M-V&X&?j
pusha UFAL1c<V
9o*,P,j'}
/,=@8k!t?
mov ax,data ;程序从start开始 D,qu-k[jMI
mov ds,ax ;ds置初值,data的段地址 mE%$HZ}
>9e(.6&2XZ
;设置缓冲区 3I\n_V<
lea bx, buffer !`41q=r
mov bufferaddr,bx /zDi9W*~1
mov buff1,bx ,L bBpi=TJ
mov bx,ds _BdE<
!r
mov bufferaddr+2,bx
.
\
mov buff1,bx Ig]iT
:0& X^]\
lea di,infosize +5VLw
mov dl,80h ';Zi@f"
mov ah,48h s, k
int 13h B33$pUk
yeDsJ/L
lea bx,msgcyl p~HW5\4
mov dx,bx %1}K""/
mov ah,09 D(-yjY8aG
int 21h om?-WJI
mov dx,cylinders +6wiOHB`
call dispdx JRCrZW}
M" ^PW,k
lea bx,msghds EnOU?D
mov dx,bx J]f3CU,<N
mov ah,09 ^uv<6
int 21h 2MZCw^s>
mov dx,heads JRo?s~Ih
call dispdx w2_bd7Wp<
;4
N;D
lea bx,msgspt ;q N+^;,2
mov dx,bx E|'h]
NY
mov ah,09 M@0;B30L
int 21h @
2'Mt}R>
mov dx,spt+2 EdZ\1'&/9
call dispdx gUyR_5q)8l
mov dx,spt jReXyRmo({
call dispdx Xp0F
[>h
u#
}[ZoI
lea bx,msgtotal 5onm]V]
mov dx,bx V3 ~~
mov ah,09 P ;IrBq6|o
int 21h ]?*I9
lea bx,sectors y~()|L[
call dispqword ")=X4]D
_6ay-u
lea bx,msgss RV@*c4KvO+
mov dx,bx 6 G=j6gK%P
mov ah,09 ^%O]P`
$
int 21h xhcK~5C
mov dx,sectorsize ZXm/A0)S
call dispdx Y ')x/H
0}_[DAd6
sbb word ptr sectors, 63d !%$`Eq)M^7
jnc subok qucq,Yw
sub word ptr sectors+2,1 L:@7tc.
jnc subok +\v?d&.f0
sub word ptr sectors+4,1 Q7W>qe%4
jnc subok dAy?EO0\7
sub word ptr sectors+6,1 Q-1vw6d
)7h$G-fe
subok: W.kM7z>G
6{txm+U
_a1x\,R|DB
)"pF R4
xor ax,ax O{#=d
mov blocknumL, ax F_CYYGZ
mov blocknumL+2, ax +SwR+H)?
mov blocknumL+4, ax JQ"U4GVp
mov blocknumL+6, ax ~6p[El#tS
JH7<
startread: T#>7ub
o}ZdTf=
call rwsect `]%|f
i[ mEi|
adc word ptr blocknuml,63d >y,-v:Vy
jnc addok thhwN
A
adc word ptr blocknuml+2,1 D-c`F
G'
jnc addok K.0:
C`C
adc word ptr blocknuml+4,1 Hw4%uS==V
jnc addok M3q|l7|9
adc word ptr blocknuml+6,1 x)@G;nZ
jnc addok w!D|]L
oE
irfp!(r
addok: L*:jXmUM_~
mov ax, word ptr sectors+6 >D4#y
cmp ax, blocknuml+6 d QqK^#
jg complete Oeok; :
jl startread w4gJoxY-`
mov ax, word ptr sectors+4 /HaHH.e
cmp ax, blocknuml+4 9E6_]8rl
jg complete `E>1>'
jl startread Ig
f&l`\
mov ax, word ptr sectors+2 RNe^;
B
cmp ax, blocknuml+2 P}4QQw
jg complete .4E&/w+
jl startread .nVa[B|.
mov ax, word ptr sectors nR-YrR*k
cmp ax, blocknuml -X"p:=;j
jg complete }R{
ts
jl startread -[wGX}}
aJ>65RJ^=
complete: ;<ZLcTL
S Em Q@1
lea bx,msgready |AozR ~
mov dx,bx h%uZYsK
mov ah,09 =o$sxb
E(
int 21 ye,>
A.
+8Rg F
popa VcXq?f>\
mov ax,3100h Jt}Bpg!J
int 21h 85LAYaw
MB~=f[cUnd
; ,Pdf,2
dispdx proc near IhVO@KJI
pusha y#3j`. $3p
lea bx, dsp+3 GU( _
mov cx,4 sG92XJ
md"!33 @
repeat0: vbyH<LPz5
mov al,dl qm"
rY\:
and al,0fh ~=uWD&5B4
cmp al,09h T9Nb`sbV]
jg add40 _I:/ZF5
add al, 30h f,kZ\Ia'r
jmp okadd ']2E {V
add40: xe^Gs]fm
add al,37h ,X`)ct
okadd: sTn<#l6
mov byte ptr [bx],al J4fi'
dec bx rustMs2p
shr dx,4 Z$/xy"
loopnz repeat0 &E.^jR~*
lea bx,dsp ewctkI$,5
mov dx,bx tFp Ygff<
mov ah,09h s~5[![1
K
int 21h K<>oa[B9
w5Y04J
popa u>2
l7PA|
ret qVH1}9_
dispdx endp @$[?z9ck"
Brf5dT49
dispqword proc near PoG-Rqe
pusha 6WXRP;!Q
mov cx ,4 ^")Q YE
add bx,6 lh7jux
repeatdecbx: U:^PC
x`
mov dx,[bx] Vex{.Vh,"
call dispdx [XEkz#{
sub bx,2 onz?_SAW
loopnz repeatdecbx snobT Q
popa y1dDO2mA
ret n*[XR`r}
dispqword endp ;:\<gVi:
L ~lxXTG\
rwsect proc near au:
fw
_Xk.p_uh
lea bx,msg -?V-*jI
mov dx,bx bk;?9%TW
mov ah,09h }fb#G<3
int 21h 0IBhb(X
Lr$go6s
lea bx,BlockNumL ~A'!2
call dispqword }`%*W`9b
RtTJ5@V(
lea di, packetsize |$8~?7Jv
mov dl,80h QdF5Cwf4
mov ah,42h >=:&D)m"
int 13h ILEz;D{]
jnc readok 2$+bJJM
cW@Zd5&0S
mov cx,5 +ElfZ4
;出错后重试(定位0道后再重读) TN+iA~kQ
retryrd: 9K{%vK
lea bx, msgReadErr le/,R@]B9
mov dx,bx ,(qRc(Ho
mov ah,09 B-ngn{Yc
int 21h ^o3"#r{:+
YIoQL}pX
8']M^|1
lea di,dap0
M+||rct
mov dl,80h #U!
_U+K
mov ah,44h a,
k'Vk{
int 13h CZud&
<
6Ypc`
lea bx,BlockNumL We$:&K0
call dispqword n}F&1Z
JTO~9>$ B
lea di, packetsize de.&`lPRf
mov dl,80h nAW:utTB
mov ah,42h y{ibO}s
int 13h uwzvb gup?
jnc readok }vxw*8d?
loopnz retryrd ~zCEpU|@N
iU$] {c2;A
readok: \?[v{WP)
lea di, packetsize 5na~@-9p
mov dl,80h ;RDh~EV
mov ah,43h @XLy7_}
int 13h 0m%|U'm|j
ub^h&=\S
rwsect endp ~$Tkn_w#
\KMToN&2
code ends ;代码段结尾 !=;+%C&8y
end start ;结束汇编 [I'0,y
nw -xSS{