第一个宏汇编程序 5tEkQ(Ei8
;jBS:k?
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 3EE_"}H>
?A-f_0<0
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! SH O&:2
L^K,YlNBR
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! {`(MK6D8 c
,R=$qi|
比较长啊!所以可以自动跳过。 :m>Vp
ant2];0p
.286 1-Dw-./N
.radix 16 BnaI30-
data segment ;定义数据段 K#VGG,h7Y
CZ
=]0zB
$f
>(TW
msg db 0dh, "Reading sector:$" n Q{~D5y,,
msg1 db 0dh, "Writing sector:$" 7G0;_f{
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" TV`sqKW
zjzEmX
dsp db " $"
}ktK*4<k
j3u!lZ}U
;DAP KEf1GU6s
PacketSize db 16d; // 数据包尺寸(16字节) b*4aUpW
Reserved db 0; // ==0 N0N%~3
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) xc7Rrh]}
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) n'%cO]nSx
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 &-m}w :j=
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 G3
h"Eo?>g
T&}KUX~Q/
;定位用DAP (复位到0磁道) uuL(BUGt-
DAP0 db 16d qggRS)a
db 0 5Fbb5`(
dw 1 WC
b5
buff1 dw 0,0 ZvK.X*~s
dw 0,0,0,0 *^CN2t
m
<&bBE"U4
q Ll4t/p
;DiskParameters MPF({Pnx7
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) mP?}h
falgs dw 0; WORD Flags; // 信息标志 -#R63f&
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 C'S_M@I=
Heads DW 0; DWORD Heads; // 磁盘磁头数 md|I?vk
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 :)h4SD8
Y
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ]Rxrt~ ZB
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) XEN-V-Z%*
</R@)_'
cmpsect dw 0 +]0hSpZ"p
*:`fgaIDa
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" bfkFk
msgHds db 0dh,0a,"Heads:$" D[4%CQ1m
msgspt db 0dh, 0a,"SectorsPerTrack:$" 5xU}}[|~-
msgTotal db 0d,0a, "Total Sectors:$" c5pK%I }O
msgSS db 0dh,0a, "Sector Size:$" ?~cO\(TY["
H}(WL+7
msgReadErr db 0dh,0a,"Error Reading Sectors:$" J/PK#<
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" r
je;Bf
msgReset db 0dh,0a, "Reseting drive to Cyl 0" r$ I k*R
6rO^ p
]cMZ7V^
buffer db 32768d dup(0); <N3~X,ch
LLoV]~dvUu
data ends ;数据段结尾 wB+F/]]|N
KIKIag#
stack segment 'R99m?"
db 400 dup(?) bL{D*\HF
stack ends JOs
k
f
(
%o
fq
code segment ;定义代码段 @g*[}`8]y
assume cs:code ;规定cs的内容 rd"!&i
assume ds:data ;规定ds的内容 2X(2O':Uc
assume ss:stack 'Zqt~5=5
B[2t.d;h
start: yN06` =
pusha 5glEV`.je
E,ooD3$h
;ZkY[5
mov ax,data ;程序从start开始 6="o&!
mov ds,ax ;ds置初值,data的段地址 dP#7ev]'
qL
w^Qxo
;设置缓冲区 ZT`"
{#L
lea bx, buffer fgHsg@33N
mov bufferaddr,bx *z_`$Y
mov buff1,bx "#iO{uMWb
mov bx,ds #Yy5@A}`o
mov bufferaddr+2,bx 6j|~oMYP
mov buff1,bx eKU4"XTk
u=E &jL5U
lea di,infosize rA@|nL{
mov dl,80h K7/&~;ZwT
mov ah,48h qoW$Iw*q)B
int 13h }r"E\~E
?}EWfsA
lea bx,msgcyl NGEE'4!i7T
mov dx,bx UQWv)
mov ah,09 m}2hIhD9
int 21h -^8OjGat
mov dx,cylinders O"_QDl<ya
call dispdx >y!O_@>z
Yk*_u}?#
lea bx,msghds A{\DzUV9,
mov dx,bx ISTAJ8"
D
mov ah,09 L:Faq1MG
int 21h >)mF'w
mov dx,heads +aqQa~}r
call dispdx L3j
~O oo
"cbJ{ G1pk
lea bx,msgspt VW^q|B yB
mov dx,bx B}aW y &D
mov ah,09 &v9"lR=_k
int 21h YfNN&G4_
mov dx,spt+2 v[?gM.S
F
call dispdx "j.Q*Hazg
mov dx,spt QD1&"T<.d.
call dispdx auM1k]
)0Vj\>
lea bx,msgtotal t{B6W)q
mov dx,bx ?q0a^c?A^
mov ah,09 -x?|[ +%
int 21h zB\ 8<97C
lea bx,sectors tA9Ew{3s
call dispqword +?5
Vuc%
}"q#"s
lea bx,msgss .mOm@<Xdg
mov dx,bx >!c Ff$2'
mov ah,09 A.YK=_J
int 21h !A14\
mov dx,sectorsize )ub!
tm
call dispdx D hk$e
VRHS 4
sbb word ptr sectors, 63d 5bol)Z9BO
jnc subok &?']EcU5h9
sub word ptr sectors+2,1 nppSrj?
jnc subok
t*Z-]P
sub word ptr sectors+4,1 CI+li H
jnc subok er>{#8 P
sub word ptr sectors+6,1 0\eSiXs
Cq-99@&;
subok: Eok8+7g0&
n"R$b:
OSom-?|w
h,]lN'JG{
xor ax,ax =YtK@+| i
mov blocknumL, ax "'>fTk_
mov blocknumL+2, ax FE#|5;q.
mov blocknumL+4, ax g
1B P
mov blocknumL+6, ax FtWO[*#
8zwH^q[`r
startread: Eh"Y<]$
d Z+7S`{
call rwsect ] HRHF'4
e`5:46k|
adc word ptr blocknuml,63d g26 l:1P
jnc addok
P# ;pQC
adc word ptr blocknuml+2,1 -ilhC Y@M
jnc addok J>nta?/,X
adc word ptr blocknuml+4,1 -7 EwZRS@9
jnc addok 7mb5z/N
adc word ptr blocknuml+6,1 472
'P
jnc addok sr~VvciIy
<