第一个宏汇编程序 .0b4"0~T6
7rSads
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 gt|:K)[,6
T'${*NVn
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! \l71Q/y6u`
>4iVVs
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧!
?f&O4H
XZH\HK)K-]
比较长啊!所以可以自动跳过。 8h'*[-]70u
}J m~b9j
.286 Kk|4
.radix 16 d
SPye z
data segment ;定义数据段 >#EOCo
dO!5` ]
\@F~4,VT
msg db 0dh, "Reading sector:$" LnlDCbF;!
msg1 db 0dh, "Writing sector:$" i{2ny$55h
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" rfHAz
w6<zPrA
dsp db " $" I|/\ L|vo
F|!
i
b5
;DAP 0jmPj
PacketSize db 16d; // 数据包尺寸(16字节) o|bm=&f
Reserved db 0; // ==0 56 [+;*
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) vH)V\V
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) V PaW-o
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 .F^372hH3
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 uB>OS1=
;JV(!8[
;定位用DAP (复位到0磁道) 7L !$hk
DAP0 db 16d c#<p44>U
db 0 '8V>:dy>
dw 1 . g8db d
buff1 dw 0,0 MYMg/>f[
dw 0,0,0,0 cZl/8?dj}
9D,/SZ-v
ZMGthI}~-
;DiskParameters !63]t?QXMG
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) ukwO%JAr
falgs dw 0; WORD Flags; // 信息标志 G^&P'*
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 h;JO"J@H
Heads DW 0; DWORD Heads; // 磁盘磁头数 klxNGxWAX
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ^udl&>
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 Dg'BlrwbR
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) " gQJeMU
Xn
#v!
cmpsect dw 0 #CTeZ/g
45U!\mG
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" r9y(j
z
msgHds db 0dh,0a,"Heads:$" =niT]xf
msgspt db 0dh, 0a,"SectorsPerTrack:$" N
GL,j\(~7
msgTotal db 0d,0a, "Total Sectors:$" ~tB#Q6`nB
msgSS db 0dh,0a, "Sector Size:$" +XoY@|Djd
hzV= 7
msgReadErr db 0dh,0a,"Error Reading Sectors:$" kmu r={IR
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" :`<ME/"YE
msgReset db 0dh,0a, "Reseting drive to Cyl 0" bD4aSubN
xjH({(/B>a
.
l-eJ
buffer db 32768d dup(0); [/GCy0jk
K(75)/
data ends ;数据段结尾 Y@2v/O,\
:e!
3-#H
stack segment =l+~}/7'Z
db 400 dup(?) s~g0VNu Y
stack ends !.@F,wZvY
{jOV8SVL
code segment ;定义代码段 R>y/Y<5=
assume cs:code ;规定cs的内容 =BroH\
assume ds:data ;规定ds的内容 3fd?xhWbN
assume ss:stack ..;ep2jSs
Cd'`rs}3
start: $9rQ w1#e
pusha Ee097A?1vj
&b9bb{y_$K
k4+ Q$3"
mov ax,data ;程序从start开始 UJ7{FN=@t
mov ds,ax ;ds置初值,data的段地址 &\L\n}i-
v&r\Z @%
;设置缓冲区 M&J$9X
lea bx, buffer 0+ 3{fD/
mov bufferaddr,bx
0}qnq"
mov buff1,bx ]CGH )4Pe
mov bx,ds u`Abko<D
mov bufferaddr+2,bx :]uz0s`>
mov buff1,bx mJ JF
\Y^GA;AMQQ
lea di,infosize J
N>
h:
mov dl,80h Wo+^R%K'4
mov ah,48h
?cKe~Q?3
int 13h RhD
,ePl>m:Z
lea bx,msgcyl ~=k?ea/>
mov dx,bx xV>sc;PEb
mov ah,09 {pz7ADK<
int 21h nl+8C}=u
mov dx,cylinders NT;cTa=;
call dispdx `L7Cf&W\l8
UoOxGo
lea bx,msghds V|j{#;
mov dx,bx }I
I)<g'
mov ah,09 (,;4f7\
int 21h *_H^]wNJG
mov dx,heads >^J
call dispdx x9 i^_3Z
bT c^huP
lea bx,msgspt h%8C_mA
mov dx,bx "5b4fQ
;x
mov ah,09 H{I,m-
int 21h Qv;q*4_
mov dx,spt+2 ?L+|b5RS
call dispdx tf4clzSTa
mov dx,spt IXC2w
*'m
call dispdx \fSo9$
6oy[0hj
lea bx,msgtotal pz ~REsx
mov dx,bx %6cbHH
mov ah,09 MoC@n+Q+@
int 21h tJ9gwx7Pg
lea bx,sectors bsdT>|gW
call dispqword :@#6]W
<8YIQA
lea bx,msgss w"
,ab j
mov dx,bx /amWf^z
mov ah,09 1HBWOV7z.?
int 21h h)h%y
)1
mov dx,sectorsize DSL3+%KF#
call dispdx +O!4~k^
k\Z@B!VAq
sbb word ptr sectors, 63d pIl[)
%F
jnc subok {Y1&GO;
sub word ptr sectors+2,1
, )PpE&
jnc subok S0H|:J
sub word ptr sectors+4,1 7Y6b<:
4j
jnc subok 9O|k|FD
sub word ptr sectors+6,1 }.N~jx0R
e`bP=7`0
subok: (7w95xI
()(^B}VK
j5MUP&/g3
v(~E
O(n.
xor ax,ax CS\8ej}y
mov blocknumL, ax ZDbzH=[
mov blocknumL+2, ax _|wnmeL*
mov blocknumL+4, ax {-1N@*K
mov blocknumL+6, ax L!0}&i;u~5
GxS!Lk
startread: YYF.0G}
FE3uNfQs|
call rwsect BDT"wy8
K96N{"{iI%
adc word ptr blocknuml,63d iH>IV0
<
jnc addok }.r)
adc word ptr blocknuml+2,1 sGO+O$J
jnc addok (CrP6]=
adc word ptr blocknuml+4,1 6[\1Nzy>
jnc addok VU;98
adc word ptr blocknuml+6,1 `2
hLs _
jnc addok $%.,=~W7
W<T
Ui51Y
addok: VYnB&3%DF
mov ax, word ptr sectors+6 3v>w$6
cmp ax, blocknuml+6 z yrjb8
jg complete k|3hs('y|
jl startread EL(BXJrx{
mov ax, word ptr sectors+4 _@! yj
cmp ax, blocknuml+4 GsU.Lkf
jg complete o,[Em<
jl startread
.s\_H,
mov ax, word ptr sectors+2 9v?
rNJs
cmp ax, blocknuml+2 Dn:1Mtj-
jg complete B_S))3
jl startread R#4f_9e<Z
mov ax, word ptr sectors Q=t_m(:0
cmp ax, blocknuml 0.0r?T
jg complete Qt.|YB8
jl startread (je`sV
.$a|&P=S
complete: 0y3C
/>a
"GX k;Y
lea bx,msgready cS(=wC
mov dx,bx FYIz_GTk
mov ah,09 FB2{qG3
int 21 @
nOuFX4
yi*EE%
popa ZwMd 22
mov ax,3100h
3 EOuJ
int 21h g"v6UZ\
N*SUA4bnuM
; L b-xc]
dispdx proc near 9 e;8"rJ?C
pusha 58t~? 2E
lea bx, dsp+3 ;^cMP1SH
mov cx,4 (o4':/es
O:Wd
,3_
repeat0: =55V<VI
mov al,dl J+l#!gk$!
and al,0fh k_`YVsEYP
cmp al,09h V(;c#%I2
jg add40
Y}e3:\
add al, 30h uoTc c|Kc
jmp okadd +do*C=z
add40: \d-9Ndp
nf
add al,37h ]sJjV
A
okadd: J~)JsAXAI
mov byte ptr [bx],al py$i{v%
dec bx 9F7}1cH7g@
shr dx,4 ]-jaIvM
loopnz repeat0 >OKc\m2%Q
lea bx,dsp 8@r>`c
mov dx,bx 4@=[rZb9
mov ah,09h [~ !9t9+~
int 21h y(X^wC
"rHPcp"m
popa )!=fy']
ret q@i.4>x
dispdx endp th}&|Y)T2
u3\_![Jt?
dispqword proc near YM#J_sy@J.
pusha \ESNf
L5
mov cx ,4 J|CCTXT
add bx,6 zqxN/H]z
repeatdecbx: )}@Z*.HZL
mov dx,[bx] .p%V]Ka
call dispdx )i[K1$x2
sub bx,2 ='6@^6y
loopnz repeatdecbx o.wXaS8
popa _mTNK^gB
ret ?dmwz4k0
dispqword endp f('##pND@
# blh9.V&F
rwsect proc near #r QT)n
~^>g<YR[
lea bx,msg @ 1FWBH~
mov dx,bx #g~]2x
mov ah,09h 2XyC;RWJ%
int 21h VVqpzDoXG
&?#
YjU"
lea bx,BlockNumL !eP0b~$/^J
call dispqword x LGMN)@r
JPpNCC.b
lea di, packetsize ,15$$3z /E
mov dl,80h %'eaW
mov ah,42h j43i:c;F
int 13h ! q+>'Mt
jnc readok Tsocc5gWZ*
J9P\D!
mov cx,5 ;}'Z2gZB
;出错后重试(定位0道后再重读) 5")BCA
retryrd: ;ZTh(_7
lea bx, msgReadErr 0yxwsBLy
mov dx,bx :3D[~-/S
mov ah,09 Up*6K =Tny
int 21h o(D6
V o%GO9b;
6C!TXV'
lea di,dap0 O@>{%u
mov dl,80h O^IS:\JX&
mov ah,44h L#fS P
int 13h ([]\7}+8
-Fc 9mv(H
lea bx,BlockNumL 3iw.yR
call dispqword M7ug<
8i
wrVR[v>E<
lea di, packetsize F6"Qs FG
mov dl,80h X/H2c"!t
mov ah,42h *_"lXcG.
int 13h m Gx{Vpt
jnc readok EUS^Gtc
loopnz retryrd i}@5<&J
0OBw
e6*
readok: G{0f*
cH)
lea di, packetsize ~zDFL15w
mov dl,80h qWJap-hb
mov ah,43h a>S-50
int 13h `[~LMV&2U
Vk%W4P"l
rwsect endp ~>$z1o&}.
OT#foP
code ends ;代码段结尾 &Qt1~#1
end start ;结束汇编 Pt7C/
qM/
(, $Lp0mB7