第一个宏汇编程序
h/~BUg'
/'^>-!8_1
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ,colGth54
Y-k~ 7{7
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! kF~e3A7C
fszeJS}Dw
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! f3B8,>
X51$5%
比较长啊!所以可以自动跳过。 AS^$1i
:
wDY7B
.286 1MFpuPJk
.radix 16 mK/P4]9g
data segment ;定义数据段 tdK^X1
$ aBSr1
}ZGpd
9D
msg db 0dh, "Reading sector:$" 2G>
]W?>
msg1 db 0dh, "Writing sector:$" #mxfU>vQ:
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" 9uoj3
Rh<
F09AX'nj
dsp db " $" Gl:T
5!fW&OiY
;DAP ;XuEMq,Di
PacketSize db 16d; // 数据包尺寸(16字节) eT
Hh
Reserved db 0; // ==0 ITPpT
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) AdW7 vn
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) <T[ui
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 J~`%Nj
5>
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 -\v8i.w0
vK~KeZ\,p=
;定位用DAP (复位到0磁道)
@n'ss!h
DAP0 db 16d $ !=:ES
db 0 UwT$IKR
dw 1 Y|jesa {x
buff1 dw 0,0 [m&ZAq
dw 0,0,0,0 S*@0%|Q4r
r}Av
"
H5t`E^E
;DiskParameters @x
]^blq
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) Qj[O$L0 $
falgs dw 0; WORD Flags; // 信息标志 J, >PLQAa
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 xM,(|p(
Heads DW 0; DWORD Heads; // 磁盘磁头数 4u7>NQUDu
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 XmR5dLc8
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ZJM^P'r.1c
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) Ka2tr]+s
Mc^7FWkw
cmpsect dw 0 kfECC&"
h(up1(x
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" /a)=B)NH
msgHds db 0dh,0a,"Heads:$" DMW:%h{
msgspt db 0dh, 0a,"SectorsPerTrack:$" 8nR,G
W\
msgTotal db 0d,0a, "Total Sectors:$" 'mR+W{r
msgSS db 0dh,0a, "Sector Size:$" j"8N)la
bUL9*{>G
msgReadErr db 0dh,0a,"Error Reading Sectors:$" A2S9h,t
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" S*:w\nXP~
msgReset db 0dh,0a, "Reseting drive to Cyl 0" ^<+heX
2a-hf|b1
cNvcpv
buffer db 32768d dup(0); p8J"%Jq}
W}3vY]
data ends ;数据段结尾 j)*nE./3
9h pM*wt
stack segment oPZ4}>uV
db 400 dup(?) F\72^,0
stack ends bd}SB -D
o)WSMV(&f
code segment ;定义代码段 wB"Gw` D
assume cs:code ;规定cs的内容 Wbxksh:)Q
assume ds:data ;规定ds的内容 ;Nij*-U4~
assume ss:stack #0H[RU?
y$NG ..S
start: " V2$g
pusha 4+bsG6i
x*)O<K
L<`g}iw
mov ax,data ;程序从start开始 ;Bi{;>3
mov ds,ax ;ds置初值,data的段地址 Dw,f~D$+ic
C
=U4|h ~W
;设置缓冲区 O,#[m:Ejb
lea bx, buffer c>.X c[H
mov bufferaddr,bx CgE5;O
mov buff1,bx Ev#aMK
mov bx,ds 6>J#M
mov bufferaddr+2,bx
S45_-aE
mov buff1,bx 5)6%D
yK3z3"1M?
lea di,infosize eQj/)@B:V
mov dl,80h -C<aB750O)
mov ah,48h WQ`T'k#ESW
int 13h s50ln&2
\ }f*
lea bx,msgcyl net9KX4\
mov dx,bx UlytxWkUX
mov ah,09 rfpxE>_|G
int 21h i*j
+<R@
mov dx,cylinders `$- Ib^
call dispdx [N)M]u
INpub5
lea bx,msghds m,O!Mt
mov dx,bx
LcF3P
4
mov ah,09 _r'M^=yx[
int 21h OK(d&
mov dx,heads !CKUkoX
call dispdx ,iUx'U
"<#:\6aym
lea bx,msgspt rg.if"o
mov dx,bx &.B6P|N'
mov ah,09 xM\ApN~W
int 21h Eq{TZV
mov dx,spt+2 #w6CL
call dispdx c
@R6p+
mov dx,spt pT tX[CE
call dispdx v^'~-^s
9f`Pi:*+/
lea bx,msgtotal c-d}E!C:
mov dx,bx CXZeL 1+
mov ah,09 Xi.?9J`@
int 21h Jmx}r,j
lea bx,sectors :DJ@HY
call dispqword 3s2M$3r)6
3R {y68-S
lea bx,msgss v(~m!8!TI
mov dx,bx C"<@EMU9
mov ah,09 2oLa`33c1
int 21h -^DB?j+
mov dx,sectorsize ?f&I"\y
call dispdx oJ:J'$W(
jfamuu 7
sbb word ptr sectors, 63d R3A^VE;qP
jnc subok <&iBR
sub word ptr sectors+2,1 ;0'v`ob'.?
jnc subok R
kzBn
sub word ptr sectors+4,1 *_wBV
M=2
jnc subok UepBXt3)
sub word ptr sectors+6,1 67?5Cv
M='Kjc>e
subok: _!zY(9%
H;1}Nvvd
qZe"'"3M
pkx>6(Y
xor ax,ax M5uN1*
mov blocknumL, ax zdE^v{}|
mov blocknumL+2, ax IIkJ"Qg.
mov blocknumL+4, ax oDa{HP\O]W
mov blocknumL+6, ax |e\%pfZ
Km7
startread: 2Fi*)\{
{J$aA6t:"T
call rwsect Z
D(gYNi
-s"lW 7N^
adc word ptr blocknuml,63d %3j5Q
jnc addok 8vK&d>
adc word ptr blocknuml+2,1 A$cbH.
jnc addok k7*q.2 0
adc word ptr blocknuml+4,1 2wCRT}C
jnc addok -yeT $P&|
adc word ptr blocknuml+6,1 nCU4a1rZ
jnc addok tw66
XxE
[eRMlSXA
addok: _rd{cvdR
mov ax, word ptr sectors+6 Z]<_a)>
cmp ax, blocknuml+6 "RL
b wm~
jg complete {W]
jVh p
jl startread L%FL{G
mov ax, word ptr sectors+4 HV@:!zM
cmp ax, blocknuml+4 s? Kn,6Y
jg complete 30@ GFaab
jl startread nKdLhCN'=
mov ax, word ptr sectors+2 CggEAi~
cmp ax, blocknuml+2 7_,gAE:kG
jg complete #eYVZ=E
jl startread b3+PC$z2h
mov ax, word ptr sectors kns]P<g
cmp ax, blocknuml j7&l&)5
jg complete tS$Ne7yk e
jl startread Fm"$W^H
@V)WJ{
complete: +Sfv.6~v
HdM;c*K
lea bx,msgready 'Nh^SbD+_|
mov dx,bx F*f)Dv$p
mov ah,09 /
<p HDY
int 21
.+>}},
LxT ]-
popa _q 8m$4
mov ax,3100h ,ME9<3
Ac
int 21h n>WS@b/o
-bwl~3ZTi
; }kpkHq"`f
dispdx proc near 00i9yC8@6
pusha JFZ
p^{
lea bx, dsp+3 Cp%|Q.?
mov cx,4 i weP3u##
ioggD
repeat0: W=!f
mov al,dl #82B`y<<y/
and al,0fh I1gu<a
cmp al,09h $Tg$FfD6&
jg add40 Y{KJk'xN5W
add al, 30h ;Peyo1
jmp okadd q)
*0G*
add40: KVuv%?
add al,37h Y~R wsx
okadd: Z>l>@wN m
mov byte ptr [bx],al w8qI7/
dec bx |{
kB
`
shr dx,4 cu-WY8n
loopnz repeat0 J}J
nJV8|G
lea bx,dsp `f'P
mov dx,bx k
bY@Y,:w
mov ah,09h K_i2%t3
int 21h VZ8L9h<{"
5S1m&s5k
popa @lwqkJ
ret H|Ems}b
dispdx endp C7{w I`
~
tz,FK
;8
dispqword proc near ]l%j>Vb!L
pusha y_6HQ:
mov cx ,4 DjIs"5Iei
add bx,6 G;e}z&6<k
repeatdecbx: l_:%?4MA
mov dx,[bx] KjadX&JD
call dispdx U:Y?2$#
sub bx,2 T1E{NgK
loopnz repeatdecbx t`Sh!e
popa $IHa]9 {
ret ]9' \<uR
dispqword endp ;c`B'
ydt1ED0Q-
rwsect proc near gP3[=a"\
_PIk,!<
lea bx,msg y{&,YV&_h
mov dx,bx pPE4~g 05h
mov ah,09h
W>~V?%F&'
int 21h Z]tz<YSkG
DCj!m<Y&
lea bx,BlockNumL <Wpz\U
call dispqword Y3[@(
$)U
RY~;i
lea di, packetsize Oe$C5KA>LW
mov dl,80h <6@Db$-
mov ah,42h
Dg@6o
int 13h zSu2B6YU}
jnc readok n#*cVB81
<XNLeJdY
mov cx,5 *$QUE0
;出错后重试(定位0道后再重读) g0l- n
retryrd: O%Mh
g\#B
lea bx, msgReadErr \m<*3eS
mov dx,bx xRfX:3
mov ah,09 f c91D]c
int 21h rZLMYM
wNlp4Z'[
.MKxHM7
lea di,dap0 ZM" t.
mov dl,80h [K5afnq`
mov ah,44h FQ5# v{
int 13h 9:1ZL_yf
=6Z1yw7s
lea bx,BlockNumL -8]$a6`{_
call dispqword 8:f(PN
m\(a{x
lea di, packetsize u%FA.
mov dl,80h TtzB[F
mov ah,42h zIu1oF4[
int 13h kW"N~Xw)
jnc readok '
{Q L`L
loopnz retryrd BsJClKp/
8g3 6-8
readok: j'Fni4;
lea di, packetsize W|:WAxJ*d
mov dl,80h ,-):&V:jF
mov ah,43h /#tOi[0[
int 13h WDcjj1`l
Pu=YQ
#F'
rwsect endp fIu/*PFPVY
~%]+5^Ka]
code ends ;代码段结尾 K$4Ky&89
end start ;结束汇编 2n\EZ
-{dwLl_