第一个宏汇编程序 ~-o^eI4_
yx`r;|ds}
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 JOL Z2
&<[]X@ bY
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! k(w9vt0?
5p(t")
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! Yg:74; .
=*U%j
比较长啊!所以可以自动跳过。 ttJ:[ R'
b;t}7.V'%
.286 d/-0B
<ts
.radix 16 ix_$Ok
data segment ;定义数据段 XV0<pV>
#L)4|
uDMUy"8&!
msg db 0dh, "Reading sector:$" ` wsMybe#
msg1 db 0dh, "Writing sector:$" ^LQ lfd
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" FC/>L
ES2d9/]p-
dsp db " $" Qnu&GBM
u3ri6Y`
;DAP V!aC#^
PacketSize db 16d; // 数据包尺寸(16字节) "S:NU.c?
Reserved db 0; // ==0 /Va&k4
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) [fJFH^&?hr
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) RQ$o'U9A
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 LI5cU
Cl
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 85d7IB{28
1 _:1/~R1
;定位用DAP (复位到0磁道) Z<
m'he
DAP0 db 16d ZLFdnC@
db 0 bvxxE/?Ni
dw 1 ybuSqFy`$
buff1 dw 0,0 tz \:r>3vI
dw 0,0,0,0 3M>FU4Ug2
@'G ( k;
c]/O^/
;DiskParameters 75BOiX
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) &VBD2_T
falgs dw 0; WORD Flags; // 信息标志 i}&mz~
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 <:_]Yl
Heads DW 0; DWORD Heads; // 磁盘磁头数 E&Zx]?
~
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 pC?1gc1G
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 @bVh?T0~F,
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) p|O-I&Xd
C
#u)$Ds
cmpsect dw 0 CI3_lWax%
SBB
bniK-
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 2
3XAkpzp$
msgHds db 0dh,0a,"Heads:$" Fw8X$SE"
msgspt db 0dh, 0a,"SectorsPerTrack:$" 3dzqVaV
msgTotal db 0d,0a, "Total Sectors:$" kgI.kT(=
msgSS db 0dh,0a, "Sector Size:$" 9FR1Bruf
&@.=)4Y
msgReadErr db 0dh,0a,"Error Reading Sectors:$" MCO$>QL
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" +cplM5X
msgReset db 0dh,0a, "Reseting drive to Cyl 0" 'E6gEJ
}od7YL
e]y=]}A3{
buffer db 32768d dup(0); 7n3x19T
]ge^J3az$u
data ends ;数据段结尾 qI/r_
1k70>RQ&69
stack segment V
IRv
db 400 dup(?) l Ib
>t
stack ends `^4>^
AFF>r#
e
code segment ;定义代码段 C&#KdvN/r
assume cs:code ;规定cs的内容 H]n0JG9K
assume ds:data ;规定ds的内容 eVNBhR}HS
assume ss:stack &>^Ympr
Ga/\kO)x_
start: 7^Q$pT>
pusha ( ;S]{z%
e+=G-u5}-
W0 ,"V'C
mov ax,data ;程序从start开始 9#$V1(}?
mov ds,ax ;ds置初值,data的段地址 -<HvhW
Ia>th\_&
;设置缓冲区 :?o
f./Df|
lea bx, buffer eRWF7`HH+
mov bufferaddr,bx l`w|o
mov buff1,bx w<^2h
}5
mov bx,ds ->#@rF:S
mov bufferaddr+2,bx DB?PS^
-2
mov buff1,bx E/Gs',Y
yl;$#aZB
lea di,infosize whp\*]8
mov dl,80h )T~ +>+t
mov ah,48h ."@a1_F|
int 13h MxvxY,~{0
wQ/@+$>
lea bx,msgcyl !6i
mov dx,bx ]Pl6:FB8%@
mov ah,09 QBT-J`Pz
int 21h :^.8 7>V7
mov dx,cylinders ?+JxQlVDt-
call dispdx $S-;M0
G
x
HFCFEamBMP
lea bx,msghds 9g,L1 W*
mov dx,bx o9SfWErZ
mov ah,09 {m*J95[
int 21h {]^%?]e
mov dx,heads >|&OcU
call dispdx p 7E{es|J
{xb%P!o`
lea bx,msgspt RgzSaP;;
mov dx,bx [Kj#KJxy
mov ah,09 oDiv9jm
int 21h U3iyuE
mov dx,spt+2 Sy7^;/(ZZ
call dispdx kQiW 5
mov dx,spt [g
68O*
call dispdx Q~8&pP8I!
\(7# N<-
lea bx,msgtotal |k9j )Hg(
mov dx,bx w5JC 2
mov ah,09 ]KPg=@Q/
int 21h G&@RLht
lea bx,sectors O5n]4)<
call dispqword hI#M {cz
QMfy^t+I
lea bx,msgss RBojT
mov dx,bx ^
cd5Zl
mov ah,09 j`-y"6)
int 21h TKutO0
mov dx,sectorsize (Y@|h%1W
call dispdx !urd
$Ta
G5@fqh6ws
sbb word ptr sectors, 63d
ykl=KR
jnc subok N#-\JlJ)
sub word ptr sectors+2,1 Ku,A}5-6
jnc subok )ZT0zIG
sub word ptr sectors+4,1 Q
X5#$-H@
jnc subok }[R@HmN
sub word ptr sectors+6,1 rQ-z2Pw
nf@u7*#6
subok: o_+Qer=O6
~w}[
._'#M
gJfL$S'w
_A0avMD}
xor ax,ax 38S&7>0@|q
mov blocknumL, ax -bX.4+U
mov blocknumL+2, ax J_br%AG<p
mov blocknumL+4, ax ;;J98G|1
mov blocknumL+6, ax 5v-;*
^RDXX+
startread: #a>!U'1|
Kpbber
call rwsect >qGR^yvb
p:n^c5
adc word ptr blocknuml,63d wI]>0g
eb*
jnc addok R$,iDv.jI
adc word ptr blocknuml+2,1 :s985sEv
jnc addok lcJumV=%>
adc word ptr blocknuml+4,1 ^)]*10
jnc addok F[giq1#
adc word ptr blocknuml+6,1 Z8_gI[Zn
jnc addok 9 7qS.Z27
g<5Pc,
addok: rnr8t]
mov ax, word ptr sectors+6 s~ZC!- [;
cmp ax, blocknuml+6 ?'_7#0R_0
jg complete FQ ^^6Rl
jl startread nU#q@p)Xg
mov ax, word ptr sectors+4 /XK`v=~(l{
cmp ax, blocknuml+4 iS
W73P;)
jg complete [5d][1=
jl startread ~(E8~)f)
mov ax, word ptr sectors+2 ':>*=&
cmp ax, blocknuml+2 u\;dUnr
jg complete S#z8H+'
jl startread lNPbU ~k
mov ax, word ptr sectors &l*dYzqq
cmp ax, blocknuml C+IE<=%F
jg complete vF\zZ<R/
jl startread 5}aC'j\
j`pR;XL1[
complete: M|]1}8d?
Nm.>C4
lea bx,msgready ee?ZkU#@
mov dx,bx $7
Uk;xV
mov ah,09 P9chRy
int 21 c|a|z}(/J
="eum7
popa ]xeyXw84k
mov ax,3100h Xr;noV-X
int 21h JF=ABJ=
bo/!u
s#
; h>Pg:*N,(
dispdx proc near 6spk* 8e
pusha ;|%JvptwW%
lea bx, dsp+3 7VBw@Rh
mov cx,4
F}4 0
tB?S0;yXjd
repeat0: 31 ;T$5 v1
mov al,dl q%&7J<
and al,0fh -k{R<L
cmp al,09h oeKc-[r
jg add40 \r9%;?f
add al, 30h lfG's'U-z
jmp okadd 2^lT!X@
add40: #I wB
add al,37h z=pV{'
okadd: =KD*+.'\/
mov byte ptr [bx],al NX",
e=
dec bx ?b$zuJ]
shr dx,4 1g.9R@Kc$
loopnz repeat0 6-YR'ikU
lea bx,dsp pU'sADC
mov dx,bx 1qN9bwRO
mov ah,09h + # >%bq x
int 21h T+"y8#:
3k0%H]wt
popa G{Q'N04RA
ret T#f@8 -XUE
dispdx endp v%Q7 \X(
PTZ1oD
dispqword proc near @]3Rw[%z
pusha ><7`$ 2Or
mov cx ,4 ZEJadR
add bx,6 J8DbAB4X
repeatdecbx: ~jTnjx
mov dx,[bx] Kn\(Xd.>
call dispdx F}[;ytmUS
sub bx,2 *G=AhH$t
loopnz repeatdecbx B)`X7uG
popa 'Mqa2o'M
ret B.WkHY%/
dispqword endp {G&g+9c&
R/YL1s
rwsect proc near zPc;[uHT
H
>{K]7D/y
lea bx,msg 7y7y<`)I5
mov dx,bx 9Q1GV>j>B
mov ah,09h Z.(x|Q9
int 21h `roSOX1f
WcG&W>
lea bx,BlockNumL []Ea0jYu
call dispqword (%!R
8PS:yBkA|
lea di, packetsize ,~iAoxD5jY
mov dl,80h c!T{|'?
mov ah,42h 0GVok$r@
int 13h cyE2=
jnc readok c[7qnSH
%%[TM(z
mov cx,5 _
4]dPk#^
;出错后重试(定位0道后再重读) uK5Px!
retryrd: h)`vc#"65k
lea bx, msgReadErr .).<L`q
mov dx,bx Bb`^,?m
mov ah,09 zghm2{:`?g
int 21h 1w^[Eno$$
\ChcJth@o<
k~dr;j
lea di,dap0 SLo/7
$rct
mov dl,80h UQ~rVUo.c
mov ah,44h Q.
AM
int 13h uoHhp 4>^
FCPRg^=<!~
lea bx,BlockNumL /GaR&
call dispqword E9hWn0 e
=SnR9In
lea di, packetsize l$KcS&{w9
mov dl,80h h`j gF
mov ah,42h .D`#a
int 13h Dw3!
ibg
jnc readok 0xcqX!(
loopnz retryrd M(jH"u&f
B E)l77=/
readok: X>>rv
lD N
lea di, packetsize /B7
GH5
mov dl,80h M3kE91
mov ah,43h RGLqn{<