第一个宏汇编程序 pJ_>^i=
wb6$R};?
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 A[ N>T\
ZowPga
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! XaYgl&x'!x
p/?T
U
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! :snn-e0l
% ^&D,
比较长啊!所以可以自动跳过。 C72btS
C/!8NV1:4
.286 (^= Hq'D
.radix 16 l]mn
4cn3
data segment ;定义数据段 Cz#3W8jV
B=hJ*
;:p
5YgUk[J
msg db 0dh, "Reading sector:$" F>rf
cW2
msg1 db 0dh, "Writing sector:$" &:Sb$+z
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" K9Bi2/N
5h>t4 [~
dsp db " $" /[Sy;wn
D;OR?NdgvW
;DAP l&m'?.gf
PacketSize db 16d; // 数据包尺寸(16字节) `*Jw[Bnh8
Reserved db 0; // ==0 ,E8~^\HV
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) BX
X1G
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) Wg5i#6y8w
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 E3E$_<^
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 g#<M/qn
Q)ZkUmW
;定位用DAP (复位到0磁道) c$]NXKcA
DAP0 db 16d <=&7*8u0+
db 0 'W|@d8}h
dw 1 fSzX /r
buff1 dw 0,0 ZUUfn~ORc
dw 0,0,0,0 {bPcr hB
eZ
+uW0
\ /6m
;DiskParameters l%9nA.M'
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) b}jLI_R{
falgs dw 0; WORD Flags; // 信息标志 V39)[FH}
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 ^1NtvQe@Y\
Heads DW 0; DWORD Heads; // 磁盘磁头数 o!M*cyq
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 AZadNuL/
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ^p!bteA>
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) &<%U7?{~
kC2_&L
cmpsect dw 0 8v']>5S]#
1~ZKpvu
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 0B[eG4
9
msgHds db 0dh,0a,"Heads:$" sYY=
MD
msgspt db 0dh, 0a,"SectorsPerTrack:$" od~`q4p1(-
msgTotal db 0d,0a, "Total Sectors:$" Ue0Q| h
msgSS db 0dh,0a, "Sector Size:$" QTjOLK$e$
DwC8?s*2H
msgReadErr db 0dh,0a,"Error Reading Sectors:$" z/t:g
c.
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" /WIHG0D
msgReset db 0dh,0a, "Reseting drive to Cyl 0" 7<%Rx19L*
o'nrLI(t
=AJ I3'x
buffer db 32768d dup(0); h\^> s$
bNO/CD4
data ends ;数据段结尾 B^G{k3]t
yy-\$<j
stack segment zVs|go>F
db 400 dup(?) aXefi'!6
stack ends
~+Da`Wp
zwKm;;v8
code segment ;定义代码段 6'N!)b^-
assume cs:code ;规定cs的内容 rKys:is
assume ds:data ;规定ds的内容 5CuK\<
assume ss:stack u3H2\<
]]Da/^K=Z
start: +kTa>U<?
pusha
0yxMIX
`g iCytv
q3E_.{t
mov ax,data ;程序从start开始 kV Z5>D$
mov ds,ax ;ds置初值,data的段地址 v`$9;9
u!DSyHR
'
;设置缓冲区 U"v}br-kb
lea bx, buffer N:@C%
UW
}
mov bufferaddr,bx x9NLJI21/
mov buff1,bx (FAd'$lhX}
mov bx,ds {1
94u%'
mov bufferaddr+2,bx x 1"ikp}
mov buff1,bx {G%!M+n<
jq&$YmWp
lea di,infosize =}~hbPJM
mov dl,80h kM?p >V6
mov ah,48h S,,3h0$X
int 13h 3f:I<S7
B1A5b=6G<
lea bx,msgcyl
<&'r_m
mov dx,bx ngN_,x7yc
mov ah,09 eMvb*X6
int 21h ; (+r)r_
mov dx,cylinders oa?eK
call dispdx U{>e
E8l
Mr(~
*
lea bx,msghds *<! W k\
mov dx,bx e+F5FAMR68
mov ah,09 )Oz( <vxw
int 21h K5)G+Id*
mov dx,heads
t=]&q.
call dispdx r\"O8\
u-h3xj
lea bx,msgspt Ga%]$4u
mov dx,bx %zyM
WC
mov ah,09 G JItGq`)
int 21h '.@R_sj
mov dx,spt+2 ?Ib/}JST
call dispdx 05MtQB
mov dx,spt V|.aud=7z
call dispdx va8V{q@t'
OR^Wd
lea bx,msgtotal r Q'tab.,]
mov dx,bx G1~|$X@@
mov ah,09 Sh]x`3 ).
int 21h @"HR"@pX
lea bx,sectors ?Y'S
/
call dispqword u
hP0Zwn
HJ5m5':a
lea bx,msgss S~F:%@,*
mov dx,bx 43-%")bH
mov ah,09 88U4I
int 21h y+?tUSPP
mov dx,sectorsize IR%a+;Xs
call dispdx =3oz74O[
"=<lPi
sbb word ptr sectors, 63d UUY-E
C7X
jnc subok d#a
sub word ptr sectors+2,1 }FMl4 _}u
jnc subok [
JVI@1T
sub word ptr sectors+4,1 FV$= l
%
jnc subok S_:(I^
sub word ptr sectors+6,1 q'2PG@
g#_?Vxt
subok: 4ij`
&u"*vG (U[
A0rdQmrOL
@WEem(@
xor ax,ax B:z -?u#B
mov blocknumL, ax S/d})8~.
mov blocknumL+2, ax S53%*7K.
mov blocknumL+4, ax H8K<.R
Y
mov blocknumL+6, ax P+3G*M=}
}C7tlA8,7
startread: ^l^_ K)tw*
^^?DYC
call rwsect n/@/yJ<EFi
5.[{PJ]bq
adc word ptr blocknuml,63d 2,&lGyV#
jnc addok &J hN&Ur
adc word ptr blocknuml+2,1 ~~zw[#'
jnc addok jD^L <
adc word ptr blocknuml+4,1 ,0 &lag
jnc addok :/%Vpdd@
adc word ptr blocknuml+6,1 YC=BP5^
jnc addok R/^JyL
{u.V8%8
addok: bOck^1Hk y
mov ax, word ptr sectors+6 /2dK*v0
cmp ax, blocknuml+6 m4Wn$Z
jg complete sD{b0mZT
jl startread L''0`a. +S
mov ax, word ptr sectors+4 4!k={Pd
cmp ax, blocknuml+4 @?B=8VHR
jg complete R|+R4'
jl startread ?3}UO:B
mov ax, word ptr sectors+2 c(#`z!FB
cmp ax, blocknuml+2 % C
3jxt
jg complete P1)
80<t
jl startread _;B!6cRLps
mov ax, word ptr sectors N@MeaO
cmp ax, blocknuml 4E
|6l
jg complete iY|YEi8
jl startread qfSoF|
{sm={q
complete: _f3A6ER`
k) v[/#I
lea bx,msgready Msd!4TrBJ
mov dx,bx !W%HAlUAG[
mov ah,09 4(aesZ8h
int 21 cZ!s/^o
?f
Yn<0D|S;X
popa ($S{td;
mov ax,3100h ^
Nsl5
int 21h Bd
NuhV`0
i9!Urq-
; =|U2 }U;
dispdx proc near p fBO5Ys
pusha "ZyHt HAK
lea bx, dsp+3 k@8#By l|
mov cx,4 )%y~{j+ M
uPF yRWK
repeat0: "}OFwes
mov al,dl rmMO-!s
and al,0fh #>v7"
<
cmp al,09h 2 !;4mij,
jg add40 g
Go
add al, 30h #h3+T*5} 6
jmp okadd `90v~OF
add40: S-rqrbr|AT
add al,37h b(SV_.4,'
okadd: #`p>VXBj!
mov byte ptr [bx],al $k`8Zx w
dec bx KV5lpN PC
shr dx,4 %C3cdy_c
loopnz repeat0 1=;QWb6
lea bx,dsp HQ
s)T
mov dx,bx pK8nzGQ
l7
mov ah,09h =O;SXzgE
int 21h @l(Y6m|v\
DYWC]*
popa N6J$z\
P
ret sN
C?o[9l!
dispdx endp E
kL\~^
W1@;94Sb~
dispqword proc near AltE~D/4
pusha H*\[:tPa
mov cx ,4 )2FO+_K?T
add bx,6 pt4xUu{
repeatdecbx: %UQ{'JW?K
mov dx,[bx] jO,<7FPs5
call dispdx =wj~6:Bf
sub bx,2 FvJSJ.;E,
loopnz repeatdecbx Wl#^Eu\g1W
popa 0&.lSw
a
ret (t]>=p%4g
dispqword endp aqM_t
Q
jBCkx]g
rwsect proc near r\
%O$zu
9#(QS+q~
lea bx,msg
?:FotnU*p
mov dx,bx !X8UP{J)L
mov ah,09h =P#!>*\ar
int 21h KB"iF}\P0
r{Q< a
lea bx,BlockNumL V^{!d}
call dispqword ZWa#}VS}-n
s =5H.q%PV
lea di, packetsize
q],R6GcVr
mov dl,80h qE{cCS
mov ah,42h $McO'Bye{h
int 13h q8h{-^"
jnc readok w3w*"M
# 0!IUSa
mov cx,5 J
:lwq@u
;出错后重试(定位0道后再重读) V[I<9xaE
retryrd: -*lP1Nbp
lea bx, msgReadErr YxtkI:C?
mov dx,bx ? g{,MP5
mov ah,09 cP2R24th
int 21h 8QN8bGxK
m6x. "
jG
`az`?`i7
lea di,dap0 Ozv.;}SE
mov dl,80h ]-'9|N*}l
mov ah,44h wY.g-3
int 13h ]= NYvv>H
:'dc=C
lea bx,BlockNumL X}-H=1T?
call dispqword l1)pr{A
n`}&,UA$4
lea di, packetsize 3rY /6{
mov dl,80h D%idlL2%J
mov ah,42h 4LjSDgA
int 13h >Y'yM4e*
jnc readok jp^WsHI3
loopnz retryrd _;q-+"6L;
nTU~M~gky
readok: H ZLOn
lea di, packetsize lDU:EJ&DHE
mov dl,80h h<K;VpL6
mov ah,43h WHZng
QmY
int 13h tKeO+6 l
XC1lo4|
rwsect endp ;0!Wd
zzQH@D1
code ends ;代码段结尾 <PN;D#2bh
end start ;结束汇编 I|IlFu?O=
6h_ k`z