第一个宏汇编程序 o^ow
v(
F1M:"-bda
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 }rs>B,=*k
zq ?
xY`E
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! U^)`_\/;?
Q6
m.yds
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! % hH> %
;AL:VU
比较长啊!所以可以自动跳过。 EaL>~:j
T;PLUjp}
.286 {/aHZ<I&^h
.radix 16 mWn0"1C
data segment ;定义数据段 }:J-o
wPcEvGBN=
r/P}j4)b7
msg db 0dh, "Reading sector:$" q68m*1?y
msg1 db 0dh, "Writing sector:$" %CgV:.,K
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" -2 8bJ,
3%Q9521
dsp db " $" @*=5a(#
Co=Bq{GY
;DAP 4HGS
PacketSize db 16d; // 数据包尺寸(16字节) {L.uLr_?e
Reserved db 0; // ==0 8=0I4\
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) "i*gJFW|
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) :B7U),T
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 c"1Z,M;G
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 Rs"G8Q9Q
@+y,E-YTdV
;定位用DAP (复位到0磁道) 0XqxW\8_l
DAP0 db 16d 'W("s
db 0 N:+d=G`x
dw 1 Xi\c>eALO
buff1 dw 0,0 Wfc~"GQq4
dw 0,0,0,0 SdnO#J}{
!3DY#
HRu;*3+%>F
;DiskParameters 2vsV:LS.
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) I-Ut7W
falgs dw 0; WORD Flags; // 信息标志 tAY{+N]f
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 "oF)u1_?
Heads DW 0; DWORD Heads; // 磁盘磁头数 ,LmP >Q.
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 pW>{7pXn
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 O;}K7rSc
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) :l iDoGDi
MtoOIkQ
cmpsect dw 0 zE/\2F$
C[#C/@
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" P6'Se'f8
msgHds db 0dh,0a,"Heads:$" kh#fUAt
msgspt db 0dh, 0a,"SectorsPerTrack:$" 7~k=t!gTY
msgTotal db 0d,0a, "Total Sectors:$" ^7=7V0>,:
msgSS db 0dh,0a, "Sector Size:$" Y
ZuA"l Y
Nqz6_!
msgReadErr db 0dh,0a,"Error Reading Sectors:$" @^ m0>H
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" H5
:f&m
msgReset db 0dh,0a, "Reseting drive to Cyl 0" Mk+G(4p
Q#K10*-O6
p7r/`_'|
buffer db 32768d dup(0); %9S0!h\
'4Qsl~[Eh
data ends ;数据段结尾 A
%^7D.j
]T2Nr[vu
stack segment Un
T\6u
db 400 dup(?) nf1 `)tXG
stack ends u3tT=5.D
O.xtY@'"
code segment ;定义代码段 Sw5-^2x0'
assume cs:code ;规定cs的内容 .|s,':hA
assume ds:data ;规定ds的内容 kBoQjOV`
assume ss:stack [8[<4~{
_z 5W*..
start: h@(+(fVHrp
pusha T5.^
w
x)eoz2E1
)E^4U9v),
mov ax,data ;程序从start开始 &"hEKIqL
mov ds,ax ;ds置初值,data的段地址 S3E5^n\\
*0Fz." v
;设置缓冲区 n5IQKYrg
lea bx, buffer 3Z&!zSK^
mov bufferaddr,bx 've[Mx
mov buff1,bx Z{yH:{Vk
mov bx,ds lNWP9?X
mov bufferaddr+2,bx ijzwct#.
mov buff1,bx Aq3\Q>klH)
C4|OsC7J
lea di,infosize "VU/Ucb7
mov dl,80h g0B
%3v
mov ah,48h ~(GNY
5
int 13h rK:cUW0]X
DZ`m{l3H
lea bx,msgcyl 'U0W
mov dx,bx pv-c>8Wb6
mov ah,09 <c!gg7@pm
int 21h "h7Dye
mov dx,cylinders 2' ^7G@%
call dispdx 9tVV?Q@)
j F/S2Ty2
lea bx,msghds d2-oy5cEB
mov dx,bx f:J-X~T_f
mov ah,09 n5^57[(
int 21h W}MN-0
mov dx,heads #h4FLF_w
call dispdx oDi+\0
;YW@ 3F-h
lea bx,msgspt [+xsX*+
mov dx,bx A=p'`]Yld
mov ah,09 lCl5#L9
int 21h w&Gc#-B
mov dx,spt+2 )4c?BCgy
call dispdx u*,>$(-u
mov dx,spt EUQtl_h/H
call dispdx $&KkZ
CA5`uh
lea bx,msgtotal /!MKijI
mov dx,bx lmD[Cn
mov ah,09 g-"G Zi
int 21h & 0WQF
lea bx,sectors G43r85LO
call dispqword :XG~AR/
yBIX<P)vE'
lea bx,msgss R<{Vgy
mov dx,bx 1<_/Qu>V
mov ah,09 cF8 X
int 21h +{I" e,Nk
mov dx,sectorsize ,u)jZ7
call dispdx K:~tZ
$AE5n>ZD$
sbb word ptr sectors, 63d =adHP|
S
jnc subok 1+XM1(|c`
sub word ptr sectors+2,1 ftl?x'P%
jnc subok 0_MtmmL.
sub word ptr sectors+4,1 (}.MB3`#C
jnc subok e"NP]_vh,
sub word ptr sectors+6,1 %d(= >
]t`SCsoo
subok: C"_ Roir?
.5}Gt>4XM
;B[(~LCyT
~dp f1fP
xor ax,ax .Y^cs+-o
mov blocknumL, ax dl6U]v=
mov blocknumL+2, ax CS(2bj^6D
mov blocknumL+4, ax iR88L&U>
mov blocknumL+6, ax hh*('n>[
gt02Csdt
startread: jC{KI!kPt
i.`n^R;N
call rwsect &);P|v`8
83gWA>Odh
adc word ptr blocknuml,63d NVsaV;u
jnc addok 3JBXGT0gJ
adc word ptr blocknuml+2,1 NRp
jnc addok ar}-~~h 5
adc word ptr blocknuml+4,1 jY]51B
jnc addok NMf#0Nz-
adc word ptr blocknuml+6,1 0.w7S6v|&
jnc addok N)R5#
JX
^+CHp(X
addok: n_9Ex&?e
mov ax, word ptr sectors+6 " r o'?
cmp ax, blocknuml+6 QKlsBq
jg complete A~<!@`NjB
jl startread [0]A-#J
mov ax, word ptr sectors+4 >][D"
cmp ax, blocknuml+4 `&