第一个宏汇编程序 0Md.3kY
UBW,Q+Q
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 D6lzcf
#Db^*
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! VM5'd
VTL_I^p
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! [H\0
'
\1<aBgKi
比较长啊!所以可以自动跳过。 =A,T:!}'
S}Wj.l+F
.286 /D9#v1b
.radix 16 kO`!!M[Oo
data segment ;定义数据段 v @M6D}
1^]IuPxq
XS2/U<sd
msg db 0dh, "Reading sector:$" x$jLB&+ICz
msg1 db 0dh, "Writing sector:$" F/Js K&&
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" p}==aNZK
F\&wFA'J
dsp db " $" 56YqYu.
,k.")
;DAP 0
J"g
"=
PacketSize db 16d; // 数据包尺寸(16字节) uDG>m7(}/h
Reserved db 0; // ==0 i;~.kgtq4
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) U= GJuixy
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) W"s/8;
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 5+{oQs_
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 b&E"r*i|
~h<T0Zc
;定位用DAP (复位到0磁道) |^Yz*r?BJ
DAP0 db 16d \'g7oV;>cI
db 0 vO?sHh
dw 1 <z60EvHg
buff1 dw 0,0 Wx#l}nD
dw 0,0,0,0
]Z UE !
T*B`8P
s w>B
;DiskParameters 7~"eT9WV
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) *lZ V3F
falgs dw 0; WORD Flags; // 信息标志 _T.`+0UV
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 l-r$czY
Heads DW 0; DWORD Heads; // 磁盘磁头数 uUp>N^mmVH
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 E
dc3YSg%;
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 g3'dkS!
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) F&p42!"
U43U2/^
cmpsect dw 0 CEkf0%YJ
_~1O #*|4
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" a"4X7
D+
msgHds db 0dh,0a,"Heads:$" g'k m*EV
msgspt db 0dh, 0a,"SectorsPerTrack:$" ;K l'[~z
msgTotal db 0d,0a, "Total Sectors:$" @ukL!AV?Y
msgSS db 0dh,0a, "Sector Size:$" -h|[8UG^b
]7,0>
msgReadErr db 0dh,0a,"Error Reading Sectors:$" A+Un(tU2(
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" rvhMu}.
msgReset db 0dh,0a, "Reseting drive to Cyl 0" GZ5 DI+3
j."V>p8u$
l(QntP
buffer db 32768d dup(0); Z! /_H($
,*V%
data ends ;数据段结尾 >G?*rg4
Q+a&a]*KL^
stack segment !+Cc^{
db 400 dup(?) bly `mp8#
stack ends D)4#AI
!}mM"|<
code segment ;定义代码段 iX2exJto
assume cs:code ;规定cs的内容 KX\=wFbP)
assume ds:data ;规定ds的内容 qMVuBv
assume ss:stack TRgj`FG
;x_T*} CH
start: t#f-3zd9
pusha =<(6yu_
xzx~H>M
.j)DE}[q>
mov ax,data ;程序从start开始
`|nJAW3
mov ds,ax ;ds置初值,data的段地址 AVz907h8
7/]Ra
;设置缓冲区 j/wQ2"@a
lea bx, buffer xG4 C 6
s
mov bufferaddr,bx \
D>!&
mov buff1,bx RK&RMN8@
mov bx,ds V@G|2ZI
mov bufferaddr+2,bx l9%ckC*q
mov buff1,bx b
H5lLcdf
u1'l
4VgT
lea di,infosize l:~ >P[
mov dl,80h
OS(Ua
mov ah,48h aY,'^S
int 13h { O=_c|u{N
H2g#'SK@
lea bx,msgcyl =yJc pj
mov dx,bx |P9Mhf N
mov ah,09 Z~w?Qm:/
int 21h z6qx9x|Ij
mov dx,cylinders [p0_I7
call dispdx W`#E[g?]
T.{]t6t$U
lea bx,msghds #K-O<:s=y
mov dx,bx DM)Re~*
mov ah,09 )ARV>(
int 21h Q'e[(^8
mov dx,heads qpf|.m
call dispdx G!F_Q7|-
K.? S,qg
lea bx,msgspt j=Q ?d]
mov dx,bx @&E7Pg5
mov ah,09 |n s9ziTDI
int 21h Y!u">M#@
mov dx,spt+2 44B9JA7u
call dispdx T-oUcuQB
mov dx,spt 1X&scVw
call dispdx 1TN+pmc}@
rc{F17~vX
lea bx,msgtotal vHymSU/J
mov dx,bx iqd7
mov ah,09 Z2]\k|%<Fa
int 21h o(i?_4E
lea bx,sectors /T&+vzCF
call dispqword 1OK~*=/4
FSZ :}Q
lea bx,msgss u]3VK
mov dx,bx CfOhk
mov ah,09 WR*<|
int 21h 9Pm|a~[m
mov dx,sectorsize W H+Sd
call dispdx sPX~>8}|VP
NU7k2`bqAk
sbb word ptr sectors, 63d gHvkr?Cg
jnc subok YMwL(m1
sub word ptr sectors+2,1
]>(pQD
jnc subok NQbgk+&wD
sub word ptr sectors+4,1 G@dw5EfF9
jnc subok %LL?' &&
sub word ptr sectors+6,1 P=4o)e7E!
RDqQ6(e"
subok: :?3y)*J!
tF!C']
8\`otJY
OBM&N
xor ax,ax 2Nx#:Rz
mov blocknumL, ax 3SF J8
mov blocknumL+2, ax ?+{qmqN
mov blocknumL+4, ax Pz' Zn
mov blocknumL+6, ax -A"0mS8L
l2
#^}-
startread: 6bpO#&T
!V0)eC50
call rwsect _cc9+o
=fK F#^E@
adc word ptr blocknuml,63d #|cr\\2*
jnc addok <qx qlEQT
adc word ptr blocknuml+2,1 "SwM%j
jnc addok A$J?-
adc word ptr blocknuml+4,1 EhIa31>X
jnc addok PrEfJ?
adc word ptr blocknuml+6,1 2\xEMec
jnc addok u,S}4p&l
G:PcV_ihx
addok: $olITe"$g
mov ax, word ptr sectors+6 G8hDR^ra
cmp ax, blocknuml+6 XV<{tqa
jg complete >D$NEO^
jl startread 4
g/Ly8
mov ax, word ptr sectors+4 ^ G>/;mZ
cmp ax, blocknuml+4 lz0'E'%{P
jg complete vo'{phtF)M
jl startread NK(; -~{P
mov ax, word ptr sectors+2 9D& 22hL4
cmp ax, blocknuml+2 z]Mu8
jg complete J*f..:m
jl startread * p,2>[e
mov ax, word ptr sectors m-
|~tve
cmp ax, blocknuml IlP@a[:_
jg complete l$!g#?w
jl startread bdyE9t
:P\RiaZAT
complete: ')v<MqBr
'miY"L:| O
lea bx,msgready |Z{
DU(?[b
mov dx,bx 0o&c8?@j
mov ah,09 OD1>s6uA7
int 21 .l]w4Hf
'ul~f$
V
popa -*"Q-GO
mov ax,3100h %VzCeS9
int 21h h<f]hJ`ep
)@.6u9 \
; xcu:'7'K[
dispdx proc near $x1PU67
pusha 'uV;)~
lea bx, dsp+3 P'CDV3+
mov cx,4 }?z_sNrDk
JdA3O{mT)
repeat0: 2sqNTuO6,|
mov al,dl RVe UQ%
and al,0fh [=KA5c<
cmp al,09h tv7A&Z)Rh
jg add40 iN@+,]Yjl
add al, 30h ;1woTAuD
jmp okadd wWUt44:0O
add40: f{u3RCfX~2
add al,37h J*'#!
xIa
okadd: K.2l)aRd
mov byte ptr [bx],al /M8&`
dec bx ye1hcQ
shr dx,4 U6R~aRJ;
loopnz repeat0 &o*f*(C2
lea bx,dsp .UJjB}4$f
mov dx,bx >Sh"/3%q
mov ah,09h g_t1(g*s
int 21h IgU65p
SXf Aw)-n
popa ob;$yn7ZO1
ret <gc\,P<ru
dispdx endp qx3`5)ef
aJ}Cqk
dispqword proc near h;8^vB y
pusha $P%b?Y/
mov cx ,4 h"+|)'*n
add bx,6 lCMU{)
repeatdecbx: 9-?[%8
mov dx,[bx] 4XL]~3 c
call dispdx ^ s@'nKc
sub bx,2 W"L;8u
loopnz repeatdecbx Z3]ut#`
popa nd1%txIsr
ret 7|eD}=jy
dispqword endp /6@Wm?`DB
DU%j;`3
rwsect proc near V:8ph`1
3[O;HS3|
lea bx,msg %o9;jX
mov dx,bx ^(8(z@y
mov ah,09h PE-P(T3s[8
int 21h MX{p)(HW
ir*T,O
2J
lea bx,BlockNumL %.*?i9}
call dispqword ?sBbe@OC?
}28,fb
/
lea di, packetsize b!Z-HL6
mov dl,80h ,|
EaW& 2
mov ah,42h =W~K_jE5lo
int 13h w %sHA
jnc readok N [iv.B
:.
ja~Q
mov cx,5 ?3
l4U
;出错后重试(定位0道后再重读) e)2s2y@zi
retryrd: g0BJj=
lea bx, msgReadErr )cX6o[oia
mov dx,bx <_"^eF+fZ
mov ah,09 3Vj,O?(Z
int 21h 7 Ed6o
(X"WEp^Q{I
,3`RM$
lea di,dap0 i;
3^vhbQ
mov dl,80h 1Gojuey
mov ah,44h #D-L>7,jA
int 13h 6mi:%)"
K8UgP?c;0
lea bx,BlockNumL ITu6m<V
call dispqword C4jqT
,mE*k79L6
lea di, packetsize )Ekp <2B:0
mov dl,80h W 6m
oFn
mov ah,42h 3K57xJzK
int 13h iYJzSVO
jnc readok M)oy3y^&
loopnz retryrd MH>CCT
Q'~2,%3<
readok: *MEDV1l_T
lea di, packetsize 7EKQE>xj
mov dl,80h )`ZTu -|
mov ah,43h 7]~65@%R-&
int 13h \*V`w@
P'4jz&4
rwsect endp p/a)vN+*x'
V@xlm
h,
code ends ;代码段结尾 8W|qm;J98
end start ;结束汇编 ^=nJ,-(h_
iS{8cN3R