第一个宏汇编程序 8Pn#+IvCE
O
SWYGnZg
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 K'Tm_"[u
kmsb hYM)
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! $i}y 8nlQ
A gg<tM{yB
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! >WQMqQ^t@
aS{n8P6vW
比较长啊!所以可以自动跳过。 rc>4vB_ha
st3l2Q
.286 6YLj^w] %
.radix 16 )=Z>#iH1
data segment ;定义数据段 Ng>5?F^v
!&ayYu##{
3kIN~/<R+7
msg db 0dh, "Reading sector:$" ]&xk30
msg1 db 0dh, "Writing sector:$" 1 s2>C!\
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" ?{|q5n
_jI,)sr4ic
dsp db " $" RO VW s/
+[A QUc
;DAP zRl3KjET
PacketSize db 16d; // 数据包尺寸(16字节) 4Lh!8g=/
Reserved db 0; // ==0 THbh%)Zv+
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) k_qd|
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) %C'?@,7C
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 J^nBdofP
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 }Jve cRtg1
V>)OpvoT#
;定位用DAP (复位到0磁道) H*QIB_
DAP0 db 16d $@Rxrx_@M
db 0 M7a.8-!1
dw 1 ^aMg/.j
buff1 dw 0,0 R{3N&C
dw 0,0,0,0 }QcCS2)Ud
"Hb"F?Yb
EXwo,?I
;DiskParameters 3yY}04[9<
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节)
V!ZC(
falgs dw 0; WORD Flags; // 信息标志 goRL1L,5
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 /-ch`u md
Heads DW 0; DWORD Heads; // 磁盘磁头数 >#;.n(y
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 iNz=e=+Si
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 {3p4:
*}
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) HU}7zK2
]Svt`0|}
cmpsect dw 0 7 60Y$/Wz
YTX,cj#D^&
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" ^f
&XQQY
msgHds db 0dh,0a,"Heads:$" 1k5Who@
msgspt db 0dh, 0a,"SectorsPerTrack:$" L9\1+rq
msgTotal db 0d,0a, "Total Sectors:$" .hP D$o
msgSS db 0dh,0a, "Sector Size:$" Ic:(Gi- %
Ovt.!8
msgReadErr db 0dh,0a,"Error Reading Sectors:$" el<s8:lA
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" /y#f3r+*2
msgReset db 0dh,0a, "Reseting drive to Cyl 0" ooL!TSGD
e7r-R3_
mpEK (p
buffer db 32768d dup(0); g
^2OkV(
$s c
data ends ;数据段结尾 !/*\}\'4
<#y[gTJ<'>
stack segment #$+*;
db 400 dup(?) )!Z*.?
stack ends BB$>h}
p8H'{f\G
code segment ;定义代码段 OU(8V^.
assume cs:code ;规定cs的内容 D/B8tf+V
assume ds:data ;规定ds的内容 A*R^n}sh
assume ss:stack u+e{Mim
uk]$#TV*q>
start: *74MWF@IY
pusha Y3cMC)
+I:Unp
Mzw<{*:r
mov ax,data ;程序从start开始 D|L9Vs`
mov ds,ax ;ds置初值,data的段地址 n
QtWvT
fZzoAzfv2
;设置缓冲区 %2/EaaR
lea bx, buffer Oo8VeRZ
mov bufferaddr,bx qIE9$7*X
mov buff1,bx `$<.pOm
mov bx,ds p*
(JjH
mov bufferaddr+2,bx [M}{G5U.
mov buff1,bx Nk
8 B_{
S6M}WR^,
lea di,infosize B+VubUPMS
mov dl,80h mPK:R^RjG&
mov ah,48h Mj?`j_X
int 13h eIEeb,#i
B6As,)RjD:
lea bx,msgcyl E *6Cw
l
mov dx,bx |`,2ri*5A
mov ah,09 H8zK$!
int 21h :WS@=sZN
mov dx,cylinders IH&|Tcf\
call dispdx V-2
(?auZd
=/+-<px
lea bx,msghds Bz-c$me1
mov dx,bx 4qh?,^Dq
mov ah,09 gHEu/8E
int 21h ,~$p,ALwN7
mov dx,heads cJ
n=
call dispdx gNrjo=
n;C
:0
lea bx,msgspt ]^'Kd*x
mov dx,bx 6|%?te x
mov ah,09 GPv1fearl
int 21h L>NL:68yN
mov dx,spt+2 {
Fb*&|-n
call dispdx #s(BuVU
mov dx,spt "]x'PI 4J
call dispdx vHc%z$-d
S9D<8j^
lea bx,msgtotal fLD,5SN
mov dx,bx SC!RbW@3
mov ah,09 oUr66a/[U
int 21h c(E{6g?
lea bx,sectors AW'0,b`v
call dispqword J26V nK
{n.PF8A5X
lea bx,msgss "'.UU
$]d
mov dx,bx ww3-^v
mov ah,09 7\[@m3s
int 21h "1*:JVG
mov dx,sectorsize
1;8UC;,
call dispdx r~8 $1"
vjCu4+w($Z
sbb word ptr sectors, 63d EIAc@
$4
jnc subok <C iSK!
sub word ptr sectors+2,1 ^4hO
jnc subok SrJGTuXg
sub word ptr sectors+4,1 O`\;e>!t
jnc subok HTS0
s\R$
sub word ptr sectors+6,1 tBWrL{xLe
Hqx-~hQO
subok: 9c'xHO`
P{jbl!UD7
b<ZIWfs
CL;}IBd a
xor ax,ax I@~QV@U
mov blocknumL, ax _p/UsJ
mov blocknumL+2, ax ~2N"#b&J
mov blocknumL+4, ax Tc:)-
z[o
mov blocknumL+6, ax 1Z2HUzqh.
j#x
6
startread: ({)+3]x
4G0m\[Du
call rwsect 9uO 2Mm
|4zIfAO
adc word ptr blocknuml,63d |O+H[;TB6
jnc addok RnE4<Cy
adc word ptr blocknuml+2,1 su(1<S}
jnc addok .bg~>T+<
adc word ptr blocknuml+4,1 >J?fl8
jnc addok F6|]4H.3Q
adc word ptr blocknuml+6,1 `r':by0M
jnc addok SmH=e@y~Lx
[Ek7b*
addok: fu ,}1Mq#
mov ax, word ptr sectors+6
QXFo1m
cmp ax, blocknuml+6 ZzpUUH/r
jg complete $G+@_'
jl startread 70nqD>M4
mov ax, word ptr sectors+4 ^|>PA:%
cmp ax, blocknuml+4 5yo%$i8I
jg complete ]Sz:|%JP1
jl startread P=Jo+4O
mov ax, word ptr sectors+2 )[IC?U:5I
cmp ax, blocknuml+2 n\'4
jg complete RJ&RTo
jl startread H;LViP2K*
mov ax, word ptr sectors MUc$j&
cmp ax, blocknuml ?4&e;83_#y
jg complete 7"x;~X
jl startread E_wCN&`[
MK~ 8}x 2K
complete: xml7Uarc
j0aXyLNX
lea bx,msgready .
iI
mov dx,bx -20bPiM$A
mov ah,09 ]^7@}Ce_
int 21 KC6.Fr{
9>/4W.
popa b3[
!V{|
mov ax,3100h `25yE/
int 21h 9T9!kb
zxl@(hd
; w3_>VIZJl
dispdx proc near Y=I'czg
pusha ,PW'#U:
lea bx, dsp+3 OLGE !&!>
mov cx,4 iy!=6
i$#;Kpb`^
repeat0: itP,\k7>d
mov al,dl [yQt^!
;
and al,0fh R|, g<
cmp al,09h 783,s_
jg add40 Rsk4L0
add al, 30h TDjm2R~9FS
jmp okadd *n
]GsOOn
add40: ]p GL`ge5
add al,37h @n /nH?L
okadd: aFm_;\
mov byte ptr [bx],al eJ-xsH*8
dec bx $( kF#
shr dx,4 m?}6)\ob
loopnz repeat0 ,^< R{{{-A
lea bx,dsp #q$HQ&k
mov dx,bx P|E| $)m
mov ah,09h ED( Sg
int 21h hWLA<wdb
1(R}tRR7 R
popa + GN(Ug'R
ret @Uvz8*b6
dispdx endp /-'}q=M
_ <V)-Y
dispqword proc near 5Ln,{vsv
pusha i9|Sa6vuI
mov cx ,4 ,R\ \ %
add bx,6 1n8/r}q'H
repeatdecbx: |aS.a&vwR
mov dx,[bx] MKk\
u9
call dispdx H$t_Xw==
sub bx,2 4e7-0}0
loopnz repeatdecbx xm~`7~nFR
popa -@2iaQ(5a2
ret ksUcx4;a@F
dispqword endp |SSSH
k]|~>9eY]
rwsect proc near JFmC\
J!(<y(l
lea bx,msg lfgq=8d
mov dx,bx 7xlkZF
mov ah,09h gZXi]m&
int 21h ;ef}}K
8kIksy
lea bx,BlockNumL my1@41
H
call dispqword ? :%@vM
ML
9' |
lea di, packetsize 3;9^
mov dl,80h I$G['`XX/
mov ah,42h +TL%-On
int 13h V2EUW!gn
2
jnc readok JPHL#sKyz
K@]4g49A/j
mov cx,5 >uRI'
24
;出错后重试(定位0道后再重读) iWkWR"ysy
retryrd: Dm
l;#'IF3
lea bx, msgReadErr \*?~Yj
#
mov dx,bx C.-,^+t;g
mov ah,09 {S)6;|ua'
int 21h Q3~H{)[Kq
Ll't>)
>Cp0.A:UC#
lea di,dap0 =y*IfG9b
mov dl,80h +Kc
mov ah,44h
jB2[(
int 13h ;H*T^0
nR~@#P\
lea bx,BlockNumL K5h
call dispqword ;igIZ$&
BDDlQci38
lea di, packetsize <xm7
qmqI
mov dl,80h ^{`exCwMx
mov ah,42h F/
{!tx
int 13h >]TWXmx/w
jnc readok ="H`V V_
loopnz retryrd Sz`,X0a
C{rcs'
readok: |HQW0
lea di, packetsize 0#hlsfc]\
mov dl,80h 2F.;;Ab
mov ah,43h ;$|nrwhy
int 13h T7%S
#
0,p
'IQ0{&E
I
rwsect endp Wn2NMXK
/{_:{G!Q0
code ends ;代码段结尾 }($5k]]clP
end start ;结束汇编 hn@08t G
q3!bky\