第一个宏汇编程序 p ?Ij-uo"o
wM2)KM}$
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 4acP*LkkQ
+[ZMrTW!0C
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! X1
0"G~0
qJbhPY8Ak
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! HiS,q0
@Le ^- v4
比较长啊!所以可以自动跳过。 _4XoUE\\
#um1?V
.286 : e0R7sj
.radix 16 do?S,'(g
data segment ;定义数据段 Q)%8NVs
OxmlzQ"vM
+_-)0[+p
msg db 0dh, "Reading sector:$" %(dV|,|v
msg1 db 0dh, "Writing sector:$" T ?<'=
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" m"?'hR2
;*j6d3E
dsp db " $" l7D4`i<F
k
Nf!j
;DAP 3u"J4%zg|L
PacketSize db 16d; // 数据包尺寸(16字节) Mi%1+
Reserved db 0; // ==0 H(5ui`' s
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) YQB]t=Ha
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) DS[l,x
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 oC@"^>4
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 '
EH
6/V{>MTZg
;定位用DAP (复位到0磁道) "x=@,*Bk
DAP0 db 16d lo>-}xd
db 0 xRTg
[
dw 1 c^dl+-{Mc
buff1 dw 0,0 9+N._u
dw 0,0,0,0 p)[BB6E
a?U%l 9F
9`gGsC
;DiskParameters F-reb5pt.=
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) ]X"i~$T1 S
falgs dw 0; WORD Flags; // 信息标志 kDceBs s
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 tx|"v|&e2
Heads DW 0; DWORD Heads; // 磁盘磁头数 )z*$`?)k
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 "ojD f3@{
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 LfjS[
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) !5'
8a5
)@lo ';\
cmpsect dw 0 DoCQFSL
x#}j3"
PP
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" qhn&;{{
msgHds db 0dh,0a,"Heads:$" 4?*"7t3
msgspt db 0dh, 0a,"SectorsPerTrack:$" qu#@F\gX
msgTotal db 0d,0a, "Total Sectors:$" 79c 9+
msgSS db 0dh,0a, "Sector Size:$" F|n$0vQ*
,<
)/45
msgReadErr db 0dh,0a,"Error Reading Sectors:$" *~t$k56
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" YiI:uG!|D
msgReset db 0dh,0a, "Reseting drive to Cyl 0" yw3U"/yw
[pC-{~
b3 %&
buffer db 32768d dup(0); (8m\#[T+R
}HA2ce\
data ends ;数据段结尾 jQK2<-HZ3
1,;qXMhK`;
stack segment aP6%OI
db 400 dup(?) v^lm8/}NO
stack ends *C:q _/
%;B(_ht<-w
code segment ;定义代码段 O7<V@GL+
assume cs:code ;规定cs的内容 Lct+cKKU
assume ds:data ;规定ds的内容 i>kNz(*
assume ss:stack fB @pwmu
qS/71Kv'
start: b$`4Nn|
pusha `v/tf|v6
j|$y)FBX
EBn:[2
mov ax,data ;程序从start开始 )V+Dqh,-g
mov ds,ax ;ds置初值,data的段地址 E/ed0'|m
.n|3A3:
;设置缓冲区 ,9l!fT?iH
lea bx, buffer Rp@}9qijb
mov bufferaddr,bx C>K"ZJ
mov buff1,bx C7*Yg$`{
mov bx,ds N(({2'Rr
mov bufferaddr+2,bx hwol7B>
mov buff1,bx J<P/w%i2
0\ytBxL
lea di,infosize Nm:|C 3_I
mov dl,80h t"74HZO>
mov ah,48h MgK(gL/&[
int 13h
?k7/`gU
7zkm
lea bx,msgcyl zKAyfn.A
mov dx,bx {*]=qSz
mov ah,09 $m%/veD k
int 21h #.G>SeTn2}
mov dx,cylinders &MGgO\|6
call dispdx @ :
jQwg)E+o;
lea bx,msghds D<L{Z[
mov dx,bx
c,s<q j
mov ah,09 ^MWW,`
int 21h ewff(e9
mov dx,heads LM`tNZ1Fc!
call dispdx CYic_rF$
K
v>#
lea bx,msgspt pcxl2I
mov dx,bx
NN pa69U
mov ah,09 8'_
]gfF
int 21h #(Yb
lY
mov dx,spt+2 1.OXkgh
call dispdx PQ!?gj
mov dx,spt );.<Yf{c
call dispdx zZ"')+7q&%
[?r\b
lea bx,msgtotal 1p5q}">z
mov dx,bx 8#JyK+NU
mov ah,09 ah@GSu;7
int 21h RkXLE"G'
lea bx,sectors M+&eh*:z:
call dispqword -3XnK5
F
Uv)<rK
lea bx,msgss WaO;hy~us
mov dx,bx c$Nl-?W
mov ah,09 6I.+c
int 21h 1~ZHC[ `
mov dx,sectorsize l=OC?d*m
call dispdx -){^
Q:u
H(ftOd.y
sbb word ptr sectors, 63d gdn,nL`dP
jnc subok PT*@#:MA
sub word ptr sectors+2,1 [~r$US
jnc subok +
+RmaZ
sub word ptr sectors+4,1 $HnD|_*
jnc subok <h>fip3o
sub word ptr sectors+6,1 'A@Oia1;{
_f2iz4
subok: *q9$SDm
%RF
/SM#hwFxJ&
!m.')\4<
xor ax,ax )UU6\2^
mov blocknumL, ax WRyv
>Y
mov blocknumL+2, ax oTa+
E'q
mov blocknumL+4, ax Ita!07
mov blocknumL+6, ax `];[T=
RoXOGVo
startread: / z>8XM&
Uc;IPS
call rwsect #S74C*'8
(YH{%8
Z0
adc word ptr blocknuml,63d -`<N,
jnc addok a+Qj[pS
adc word ptr blocknuml+2,1 -8J@r2 \
jnc addok z&G3&?Z
adc word ptr blocknuml+4,1 fHp#Gi3Lz
jnc addok Rn^N+3o'M
adc word ptr blocknuml+6,1 |8?{JK
sg
jnc addok
k`zK
?=o]Wx0(9
addok: (HgdmN
%
mov ax, word ptr sectors+6 y&|{x "
cmp ax, blocknuml+6 sN/Xofh
jg complete w9?wy#YI
jl startread [
^ \)
mov ax, word ptr sectors+4 -kS5mR
cmp ax, blocknuml+4 +?eAaC7s
jg complete Iz=E8R g
jl startread j
W]c9u
mov ax, word ptr sectors+2 8{^GC(W{]
cmp ax, blocknuml+2 :z5Ibas:
jg complete H;}ue
jl startread Z`h_oK#y15
mov ax, word ptr sectors 97
X60<
cmp ax, blocknuml *m Tc4&*
jg complete x-k/rZ
jl startread 4>eg@s N
UVRV7^eTe
complete: @)B5^[4(;
X~VZ61vNu
lea bx,msgready `)_FO]m}jS
mov dx,bx |&*rSp2iH
mov ah,09 :<G+)hIK
int 21 #Y b9w3N
T{2//$T?
popa ^O9m11
mov ax,3100h ~9 nrS9)
int 21h VFp)`+8
-PuVI5L<
; 9CSz<[
dispdx proc near 2MrR|hLx
pusha \FX3=WW
lea bx, dsp+3 fO|u(e
mov cx,4 \DdVMn
VH*(>^OfF
repeat0: Ppn ZlGQ6
mov al,dl xGQ:7g+qu
and al,0fh ^Q:`2C5
cmp al,09h 6h"?3w
jg add40 +K4v"7C
V
add al, 30h KUV{]?'
jmp okadd q:eAL'OkM
add40: _'v )Fy
add al,37h obk
v ]~
okadd: F#9KMu<<cI
mov byte ptr [bx],al 9GOyVKUv
dec bx \shoLp
shr dx,4 4SO{cst
loopnz repeat0 o[*i
h\d
lea bx,dsp <