第一个宏汇编程序 \a
.^5g
}+F&=-P)
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 9r e
fv
+'@j~\>^yJ
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! j$5S_]2
w|AHE
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! KbcmK(`_
*MG*]\D
比较长啊!所以可以自动跳过。 3rUuRsXn
$ncJc
.286 .:nV^+)
.radix 16 [2 y
xTK
data segment ;定义数据段 \D<w:\P
A.%MrgOOX
/ta5d;@
msg db 0dh, "Reading sector:$" :|V`QM
msg1 db 0dh, "Writing sector:$" 0<n*8t?A-
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" t
5{Y'
PE\.J U
dsp db " $" hYI0S7{G
gI
/#7Cr
;DAP
RM(MCle}
PacketSize db 16d; // 数据包尺寸(16字节) jk\04k
Reserved db 0; // ==0 #3h~Z)+y
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) gjGKdTr'
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) ?}tWI7KI
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 O2n[`9*
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 W|yFjE&dr
A'=,q
;定位用DAP (复位到0磁道) _Z>I"m
DAP0 db 16d Z.iQm{bI
db 0 ^s;xLGl]
dw 1 ?e. Ge0&
buff1 dw 0,0 e-`=?tct
dw 0,0,0,0 ,2R7AHk
_>LI[yf{
tS@J)p+_(
;DiskParameters {+SshT>J
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) |RA|nu
falgs dw 0; WORD Flags; // 信息标志 #j?SdQ
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 l[
P VWM
Heads DW 0; DWORD Heads; // 磁盘磁头数 ;GjZvo
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 cj5;XK
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 _^(}6o
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) XS&oW
@7fx0I'n
cmpsect dw 0 w9W0j
H
/I1 n\
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" UgBD|~zu
msgHds db 0dh,0a,"Heads:$" Ne=o+ $.(
msgspt db 0dh, 0a,"SectorsPerTrack:$" 0YApaL+jt
msgTotal db 0d,0a, "Total Sectors:$" wyVQV8+&>
msgSS db 0dh,0a, "Sector Size:$" ] C&AU[U*
iem@K
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 'ZUB:R@[
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" }nO[;2Na
msgReset db 0dh,0a, "Reseting drive to Cyl 0" 9eh9@~mU"l
VOY#Y*)g
p3L0
'rY|+
buffer db 32768d dup(0); `-J$7)d@
Q6e;hl
data ends ;数据段结尾 )}[:.Zg,3/
jO9w7u6
stack segment *Bj7\8cKC
db 400 dup(?) \GFFPCi4D
stack ends 'cpO"d?{
p#
4@
code segment ;定义代码段 p[&6hXTd
assume cs:code ;规定cs的内容 DJ
Gq=*
assume ds:data ;规定ds的内容 Shm$>\~=
assume ss:stack - UMPt"o
@}r2xY1
start: iYE7BUH=
pusha @8jc|X<A
,o{|W9
M#U #I:z%
mov ax,data ;程序从start开始 .R<Ke\y
/
mov ds,ax ;ds置初值,data的段地址 l[cBDNlrC;
O*:8gu'Y2
;设置缓冲区
YO3$I!(
lea bx, buffer OfAh?^R
mov bufferaddr,bx B4>kx#LR
mov buff1,bx [D
v6z t>
mov bx,ds rF*L@HI
mov bufferaddr+2,bx VY#:IE:T
mov buff1,bx jr=>L:
S7A[HG;
lea di,infosize f]*_]J/
mov dl,80h OS
Dx
mov ah,48h 8!!iwmH{
int 13h ^-Knx!z
,];4+&|8kW
lea bx,msgcyl 5IsRIz[`TK
mov dx,bx - 2`D(xC
mov ah,09 Vjc*D]
int 21h /;K?Y#mf~j
mov dx,cylinders D{J+}*y
call dispdx 3!OO_
[tP6FdS/M=
lea bx,msghds </%n:<z4
mov dx,bx -l ?J
mov ah,09 1I1Z),
int 21h
j_I
mov dx,heads 6 pQbh*
call dispdx TX%W-J_
*
I{)8
lea bx,msgspt ENEn Hu^
mov dx,bx Z
^w5x :
mov ah,09 TfFuHz
ZZ
int 21h .0eHP
mov dx,spt+2 HfN:oww
call dispdx )}KQtkU8:
mov dx,spt +1]xmnts
call dispdx )RFE<
Qcj
-$8M#n,
lea bx,msgtotal !6 k{]v
mov dx,bx rP=!!fC1;
mov ah,09 {Y p;R
int 21h NyTGvBf
lea bx,sectors |}O9'fyU8
call dispqword 5V($|3PI
MUs~ZF
lea bx,msgss dl
%KD8
mov dx,bx DOzJ-uww1
mov ah,09 }_A#O|dxO
int 21h <r1N6(n
mov dx,sectorsize
Du*O|
call dispdx jl:dKL@
!:7aXT*D$
sbb word ptr sectors, 63d pH'1be{K
jnc subok J6s55
v
sub word ptr sectors+2,1 'h:[[D%H`
jnc subok -H;%1y$A-
sub word ptr sectors+4,1 POouO/r$
jnc subok 6$l6>A
sub word ptr sectors+6,1 -nvK*rn>}
x9Qa.Jmj
subok: 4=T>Iy
hny):59f
G]T A7~VT
G3.MS7J
xor ax,ax >h+G$&8[y
mov blocknumL, ax ti)4J2c,8
mov blocknumL+2, ax yU"'h[^
mov blocknumL+4, ax T5jZd@VT,
mov blocknumL+6, ax v.aSf`K
>UQ`@GdafR
startread: ,XZ[L?
>
~5f|L(ODX
call rwsect n*
7mP
| gou#zi
adc word ptr blocknuml,63d 2qY+-yOEt
jnc addok P!Mz5QZ+
adc word ptr blocknuml+2,1 pK
M5<1J
jnc addok =h"*1`
adc word ptr blocknuml+4,1 "E><:_,\
jnc addok CLU[')H0
adc word ptr blocknuml+6,1 )%}?
p2.
jnc addok ua'dm6",:
jgb>:]:
addok: lYz$~/sd
mov ax, word ptr sectors+6 DJF-J#
cmp ax, blocknuml+6 x!<?/I)X
jg complete BU|
bo")
jl startread
r$7D;>*O{
mov ax, word ptr sectors+4 d_5wMK6O6
cmp ax, blocknuml+4 ?D^l&`S
jg complete ?b&~(,A{
jl startread XP$ 1CWI
mov ax, word ptr sectors+2 X[XSf=
cmp ax, blocknuml+2 A^a9,T
jg complete B_B~Y8=3`
jl startread ZUW~ZZ7Z:
mov ax, word ptr sectors wF`9}9q
cmp ax, blocknuml |0wUOs*5
jg complete m9Z 3q ;
jl startread <^Hh5kfS'
f17pw
J~=
complete: 6
s+ Z
bN#)F
lea bx,msgready +QqEUf<U*,
mov dx,bx -ty_<m]
mov ah,09 cX64 X
int 21 |c]Y1WwDx
7;_./c_@
popa t-vH \m
mov ax,3100h !7:~"kk
int 21h &
f\ng{
~IB~>5U!
; mxpncM=q
dispdx proc near p:,(r{*?
pusha xV
h-Mx+M
lea bx, dsp+3 f"0{e9
O]2
mov cx,4 Tn# >"Ag
S"Q$ Ol"
repeat0: mh4NZ @;
mov al,dl {FavF 9O
and al,0fh )eFq0+6*)
cmp al,09h E+
65
jg add40 "ct_EPr`
add al, 30h *d,u)l :S
jmp okadd k($N_XlE
add40: CPI7&jqu
add al,37h TV>UD
q
okadd: 8^H <dR
mov byte ptr [bx],al *(~=L%s
dec bx uQ;b'6Jcp
shr dx,4 XG5mfKMt+
loopnz repeat0 h4x RRyK
lea bx,dsp C?FUc cI
mov dx,bx jocu=Se@
mov ah,09h Ef;OrE""
int 21h 8bB'[gJ]{
|7jUf$Q\p
popa ypuW}H%`
ret 7[l
"=
dispdx endp !5~{?sr>
kCRP?sj
dispqword proc near ~6nq$( #
pusha nl 7=Nhh
mov cx ,4 !/w<F{cl
add bx,6 kpkN GQ2
repeatdecbx: 07T"alXf:A
mov dx,[bx] v:YW[THre
call dispdx FS%Xq-c
sub bx,2 |WiK*
loopnz repeatdecbx nnU
&R
popa crJyk #_
ret Um
k9
dispqword endp c
D6$C31Y]
zl:
5_u=T
rwsect proc near Ny;(1N|&3
a9ab>2G?FR
lea bx,msg c%u
X+\-$
mov dx,bx (~r"N?`
mov ah,09h :VPZGzK4
int 21h p5!=Ur&Ac
B6gSt3w.
lea bx,BlockNumL r )cGee
call dispqword r lalr+Rf
5]WpH0kzO
lea di, packetsize 5o~
;0K]
mov dl,80h ,qgph^C
mov ah,42h g`jO
int 13h tZtyx;EP
jnc readok Ld[zOx
29?{QJb
mov cx,5 1)aB']K%
;出错后重试(定位0道后再重读) ;[-dth
retryrd: NU*6MT4
lea bx, msgReadErr FuNc#n>
mov dx,bx
5PPV`7Xm9
mov ah,09 nQc]f*
int 21h +oY[uF
-Fodqq@,
7P`|wNq
lea di,dap0 +jFcq:`#UG
mov dl,80h 05zBB
mov ah,44h zR'lQ<u
int 13h A| #9
R1YRqk
lea bx,BlockNumL +8FlDiP
call dispqword Q'
]
_3
Ly?gpOqu5
lea di, packetsize 21$YZlhJ
mov dl,80h ,%+i}H,3
mov ah,42h {XMF26C#
int 13h ?qviJDD|f
jnc readok /-wAy-W
loopnz retryrd -d+q +l>0
a;Q6S
readok: g4WN+y`
lea di, packetsize 7_WD)Y2yS
mov dl,80h |0?h6
mov ah,43h .`84Y
int 13h 8_MR7'C1hi
;Cdrjx
rwsect endp "CdL?(
(u81p
code ends ;代码段结尾 n"dC]&G'
end start ;结束汇编 [N}:Di,S
!"2nL%PW~