第一个宏汇编程序
rrphOG
Otf{)f
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 V&Rwj_Y
)NqRu+j
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 8 0o'=E}"
fILvEf4b
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! $(*>]PC+)
)$d~
HA@B
比较长啊!所以可以自动跳过。 Tgbq4xR(
@a
7U0$,O#
.286 *!dA/sid
.radix 16 y(^\]-fE
data segment ;定义数据段 #]gmM
Tv
5J
Zzb?Nbf
msg db 0dh, "Reading sector:$" ~sq@^<M)s
msg1 db 0dh, "Writing sector:$" h[
<l2fy
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" *D9H3M[o#
6)20%*[
dsp db " $" } .<(L
&rl;+QS
;DAP nI1(2a1
PacketSize db 16d; // 数据包尺寸(16字节) Zp9kxm
'
Reserved db 0; // ==0 q1ZZ T"'
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) 2.
{/ls
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) 8yH)9#>
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 64>CfU(
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 ]M'~uTf
!?+q7U
;定位用DAP (复位到0磁道) MpIiHKQ
G9
DAP0 db 16d ~-R2mAUK
db 0 E\p"%
dw 1 1083p9Uh
buff1 dw 0,0 V\l@_%D[(v
dw 0,0,0,0 j5]ul!
ji
,@Kn@%?$
Wu8^Z Z{
;DiskParameters /?Mr2!3N
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) kJNwA8 7
falgs dw 0; WORD Flags; // 信息标志 Q7tvpU
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 $TK= :8HY
Heads DW 0; DWORD Heads; // 磁盘磁头数 KCH`=lX
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 VYt<j<ba
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 tvq((2
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ;BKU
_}k=
M* {5> !\
cmpsect dw 0 N0JdU4'
#l3)3k*;
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" >[~7fxjK-
msgHds db 0dh,0a,"Heads:$" GJs~aRiz
msgspt db 0dh, 0a,"SectorsPerTrack:$" Ki&a"Fu3
msgTotal db 0d,0a, "Total Sectors:$" yO*
msgSS db 0dh,0a, "Sector Size:$" h ^s8LE3
<$otBC/%
msgReadErr db 0dh,0a,"Error Reading Sectors:$" m
-hZ5i
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" I`i"*z
msgReset db 0dh,0a, "Reseting drive to Cyl 0" 9jM7z/Ff
qV/>d',
6E9/z
buffer db 32768d dup(0); {];-b0MS~
}6=)w@v
data ends ;数据段结尾 tCar:p4$
KD H<T4#x
stack segment MX.?tN#F|H
db 400 dup(?) kQQDaZ8
stack ends A
r>BL2@
18Ju]U
code segment ;定义代码段 0'YJczDq:7
assume cs:code ;规定cs的内容 Gzg3{fXl
assume ds:data ;规定ds的内容 Fmz+ Xb
assume ss:stack 7?y7fwER
)}t't"
start: /H3w7QU
pusha LIQ].VxIs
;Me*#/
xtLP4VL
mov ax,data ;程序从start开始 7q5*grm
mov ds,ax ;ds置初值,data的段地址 Q;A\M
<^_crJONom
;设置缓冲区 P|]r*1^5
lea bx, buffer %/5Wj_|p
mov bufferaddr,bx @2*Q*
mov buff1,bx pVrY';[,|
mov bx,ds Vo6g /h?`
mov bufferaddr+2,bx WIpV'F|t]`
mov buff1,bx vAq
j4:j
9\/oL{
lea di,infosize 4"\cA:9a
mov dl,80h }&==;7,O
mov ah,48h %O<8H7e)V
int 13h 3dolrW
?,8+1"|$A]
lea bx,msgcyl 4z9lk^#"X
mov dx,bx Jyr
V2Tk^
mov ah,09
5
C^@w
int 21h a ~W
mov dx,cylinders 5sN6&'[
call dispdx JY^i
lBAu@M
lea bx,msghds VxARJ*4=Y
mov dx,bx N^@:+,<3
mov ah,09 9cU9'r# h
int 21h N-Z=p)]
mov dx,heads R^P>yk8
call dispdx K}^#VlY9
2gMG7%d
lea bx,msgspt B&0W P5OF
mov dx,bx '3WtpsKA
mov ah,09 bovAFdHW
int 21h
X)+6>\
mov dx,spt+2 $CX3P)%
`
call dispdx u]9\_{c]Q
mov dx,spt =6"5kz10
call dispdx !\9^|Ef?
qMA-#
lea bx,msgtotal X J)Y-7c
mov dx,bx P".IW.^kk~
mov ah,09 \g
h |G
int 21h pe\Nwq
lea bx,sectors ;ko6igx)+
call dispqword 2CneRKQy
oD1k7Gq1
lea bx,msgss eF9GhwE=
mov dx,bx 5b*knN>
mov ah,09 <c:H u{D
int 21h <JU3sXl
mov dx,sectorsize !2Z"Lm
call dispdx
J%M
[8
5gqs"trF
sbb word ptr sectors, 63d SgehOu
jnc subok CH
29kQ
sub word ptr sectors+2,1 /F(n%8)Yq
jnc subok 0K26\1
sub word ptr sectors+4,1 rjO{B`sV*
jnc subok bv b\G
sub word ptr sectors+6,1 rD a{Ve
]dI^
S
subok: AX<f$%iqD
js@L%1r#L
'%XYJ
r:H[
;FRUB@:
xor ax,ax L/`1K_\l
mov blocknumL, ax oOU_
Nay
mov blocknumL+2, ax 1EEcNtpub]
mov blocknumL+4, ax "
42/P4:
mov blocknumL+6, ax OE9,D:tv
-)VjjKz]8
startread: ?+.C@_QZQ
\=bKuP(it
call rwsect y_=y%
jy?*` q1]
adc word ptr blocknuml,63d ?_Z-}f
jnc addok p\
lR1
adc word ptr blocknuml+2,1 }^ ,D~b-nB
jnc addok dIlpo0; F
adc word ptr blocknuml+4,1 6[c|14l
jnc addok r]Wt! oHm5
adc word ptr blocknuml+6,1 bvB',yBZ
jnc addok %xOxMK@
#S'uqP!
addok: G[yzi
mov ax, word ptr sectors+6 G2)F<Y
cmp ax, blocknuml+6 d(d<@cB9
jg complete Y%;X7VxU*
jl startread VN!nef
mov ax, word ptr sectors+4 KvPCb%!ZP
cmp ax, blocknuml+4 X.k8w\~
jg complete Ui`{U
jl startread >(S)aug$1
mov ax, word ptr sectors+2 J&,hC%]
cmp ax, blocknuml+2 Zd>sdS`#r
jg complete '5De1K.\`
jl startread x5BS|3W$a
mov ax, word ptr sectors AJxN9
[Z!N
cmp ax, blocknuml J
3C^tV
jg complete F}ATY!
jl startread )&d=
2M;3
_lwKa,}
complete: ~ILv*v@m
$["HC-n?.k
lea bx,msgready jTIG#J)
mov dx,bx 6AG]7d<
mov ah,09 e&d$kUJrq
int 21 *qy \%A
to</
popa #]tDxZ]
6
mov ax,3100h dX@ic,?
int 21h C9sU^]#F
@:GqOTN
; c&',#.9
dispdx proc near Td'(RV
pusha L'?aoRj
lea bx, dsp+3 nH6SA1$kW
mov cx,4 ,.cR @5qI
`cXLa=B)9
repeat0: BOw[*hM
mov al,dl <TtPwUX
and al,0fh [Tp?u8$p`
cmp al,09h 9$;5J
jg add40 qpYgTn8l7
add al, 30h Af]zv~uM
jmp okadd rSJ!vQo
Cb
add40: {L%J DJ
add al,37h 8TT#b?d
okadd: fI<LxU_n:
mov byte ptr [bx],al =-fM2oiI:
dec bx ;Jg$C~3tf
shr dx,4 f(D'qV T{
loopnz repeat0 phjM(lmCo
lea bx,dsp %bN{FKNN
mov dx,bx PR:B6 F8
mov ah,09h ?4/pE@RIy
int 21h eTvjo(Lvx
Mh-"B([Z
popa ;WX.D]>{W
ret +u0of^}=
dispdx endp ocZ}RI#Q
xsj,l@Ey
dispqword proc near ~rdS#f&R2
pusha VPYLDg.'
mov cx ,4 N'WTIM3W
add bx,6 1LRP
R@b^
repeatdecbx: 9U6$-]J
mov dx,[bx]
6dr'nP
call dispdx
&kmaKc
sub bx,2 <m`CLVx8m
loopnz repeatdecbx x,25ROaHY
popa DX>LB$dy?
ret iIX%%r+
dispqword endp -6kX?sNl)X
bXF8V
rwsect proc near Ia}qDGqPp!
jc9C|r
lea bx,msg >j hcSvM6
mov dx,bx @i>)x*I#AI
mov ah,09h :p/=KI_
int 21h JR.)CzC
'`k7l7I[@
lea bx,BlockNumL I!*P' {lh
call dispqword z@~H{glo
K?'m#}]
lea di, packetsize ]A%3\)r
mov dl,80h Y
p;Z+!!UZ
mov ah,42h zMbFh_dcq
int 13h NeY*l
jnc readok /g{*px|
Y:TfD{Xgc
mov cx,5 20|_wAA5
;出错后重试(定位0道后再重读) 5.{=Op!
retryrd: 7CH&n
4v
lea bx, msgReadErr ;QXg*GNAv$
mov dx,bx Cy$~H
mov ah,09 cLf90|YFp
int 21h bTimJp
[b
)H
W
,5;M(ft#
lea di,dap0 =|1_
6.tz
mov dl,80h h@$SJe(hl
mov ah,44h p7Wt(A
int 13h @u9L+*F
6GunEYK!N8
lea bx,BlockNumL )Y)_T&O
call dispqword [S,$E6&j$"
6)uBUM;i
lea di, packetsize +\Jo^\
mov dl,80h pS+w4gW
mov ah,42h +a.2\Qt2A
int 13h O~V^]
jnc readok oLKliA=q
loopnz retryrd K-TsSW$}
KMIe%2:b5
readok: !\R5/-_UU
lea di, packetsize u'l
4=e
mov dl,80h g:Qq%'
mov ah,43h
J
Ha1lj
int 13h &@oI/i&0B
B1 }-
rwsect endp w gS'/
uK" T~
code ends ;代码段结尾
+ m-88
end start ;结束汇编 uE')<fVX(
p
-.kBF