第一个宏汇编程序 _e* c
QTYYghz
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 +5-]iKh
9Fk4|+OJ
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! [@<G+j
Yc
d3QRB
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! }
C_|gd
Y[?`\c|
比较长啊!所以可以自动跳过。 QhCY}Q?X
[.a;L">
.286 bK<}0Ja[
.radix 16 C%]."R cMC
data segment ;定义数据段 %]#VdS|N
YwXXXh
FZpsL-yx^N
msg db 0dh, "Reading sector:$" k Q~ %=pn
msg1 db 0dh, "Writing sector:$" b_vVB`>
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" EMhr6</
t=i/xG: 5
dsp db " $" { UOhVJy
Ra0=q4vdk
;DAP 9\>sDSCx
PacketSize db 16d; // 数据包尺寸(16字节) 8[~~gYl
Reserved db 0; // ==0 ) \4
|
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) |YRY!V_w
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) x<@kjfm5
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 p
isB,wP$2
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 y^G>{?Tha
v
J-LPTB
;定位用DAP (复位到0磁道) #d% vT!Bz~
DAP0 db 16d PPj[;(A
db 0 UQ~4c,
dw 1 Y9tV%
buff1 dw 0,0 s@s/'^`
dw 0,0,0,0 E+z18Lf?
P_}/#N{C
F@1d%c
;DiskParameters )tD6=Iz^5
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) V!xwb:J
falgs dw 0; WORD Flags; // 信息标志 q3)wr%!k5D
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 ]H+{eJB7O
Heads DW 0; DWORD Heads; // 磁盘磁头数 5U~O
P
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 tOM(U-7Z&
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 \yG`Sfu2
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) H}
6CKP}
yb?{LL-uy
cmpsect dw 0 Oqmg;\pm
/W`$yM3
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" /[iG5~G
msgHds db 0dh,0a,"Heads:$" d&u7]<yDA
msgspt db 0dh, 0a,"SectorsPerTrack:$" E=kw)<X2
msgTotal db 0d,0a, "Total Sectors:$" (zC
msgSS db 0dh,0a, "Sector Size:$" -w ~(3(
's.~$
msgReadErr db 0dh,0a,"Error Reading Sectors:$" (]XbP
W
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" MRs,l'
msgReset db 0dh,0a, "Reseting drive to Cyl 0" +zsZNJ(U
th
ptm
xs%LRF#u
buffer db 32768d dup(0); 5oJ Dux }
cOb4c*
data ends ;数据段结尾 8R}K?+]
h@@d{{IqT
stack segment :+:6_x
db 400 dup(?) V&[eSVY?
stack ends &6/%kkv
(Y2mmd
code segment ;定义代码段 sT`^ljp4
assume cs:code ;规定cs的内容 jTfi@5aPY
assume ds:data ;规定ds的内容 13
a(FG
assume ss:stack % $TEDr!
|1l&@#j!2
start: ;v_V+t<$
pusha k"
YHsn
ej52AK7
j#VIHCz
lr
mov ax,data ;程序从start开始 j{;|g%5t
mov ds,ax ;ds置初值,data的段地址 E:w:4[neh
U^rm:*f
;设置缓冲区 9U^$.Lb
lea bx, buffer P"F{=\V1`<
mov bufferaddr,bx DjwQ`MA
mov buff1,bx $KX[Zu%
mov bx,ds c
0-w6
mov bufferaddr+2,bx 9cfR)*Q
mov buff1,bx 7~b!4x|Z
-72j:nk
lea di,infosize "OL~ul5
mov dl,80h ],[)uTZc
mov ah,48h x2k*|=$
int 13h 9P.(^SD][z
+j
[`,5oS
lea bx,msgcyl
<uD qYT$6
mov dx,bx 8QF2^*RZ7z
mov ah,09 d0
-~|`5
int 21h .oR3Q/|k]
mov dx,cylinders 8bOT*^b$H
call dispdx etyCrQ
?U
^PqMi:htc
lea bx,msghds NR4Jn
?l{
mov dx,bx :}9j^}"c3
mov ah,09 #*2Rp8n
int 21h #) ]c0]p
mov dx,heads $"8d:N?I[
call dispdx 62kb2C
DMd ,8W7a
lea bx,msgspt
{155b0
mov dx,bx q (>c`5
mov ah,09 -=)-s m'
int 21h P+Z\3re
mov dx,spt+2 qS.)UaA
call dispdx /\J|Uj
mov dx,spt w!`Umll2
call dispdx <'&F;5F3V
xmr|'}Pt[
lea bx,msgtotal //.>>-~1m
mov dx,bx +.@c{5J<
mov ah,09 #mLuU
int 21h "K?Q
lea bx,sectors ooE{V*Ie
call dispqword TvQ^DZbe
3taa^e.
lea bx,msgss y94kX:q
mov dx,bx FP@qh
mov ah,09 a2yE:16o6
int 21h QaQ'OrP
mov dx,sectorsize ^u)rB<#BR
call dispdx OVR?*"N_
'7tBvVO_
sbb word ptr sectors, 63d 5/MED}9C(
jnc subok m<: IFx#
sub word ptr sectors+2,1 T'1gy
}
jnc subok [U.v:tR
sub word ptr sectors+4,1 2a `J%A
jnc subok {Q~7M$
sub word ptr sectors+6,1 GaBTj_3
.Xd0
Q=1h
subok: A-wRah.M
m xJXL":|
tZA:
hNbIpi=
xor ax,ax )~
z Z'^
mov blocknumL, ax y
~AmG~
mov blocknumL+2, ax | ^GyH$.
mov blocknumL+4, ax l
l<mE,
mov blocknumL+6, ax i:Y\`J
</s,pe79B
startread: <o0~H
t1ze-Ht;
call rwsect z[9UQU~x?
[X/(D9J
adc word ptr blocknuml,63d /IR#A%U
jnc addok r,xmEj0E
adc word ptr blocknuml+2,1 6OB" ,
jnc addok 6GINmkA
adc word ptr blocknuml+4,1 fbC~WV#
jnc addok vM4<d>
adc word ptr blocknuml+6,1 q*8lnk
jnc addok .Yx_:h=u
>85zQ
1aL
addok: J%Mnjk^_\S
mov ax, word ptr sectors+6 6y
Wc1
cmp ax, blocknuml+6 S~3\3qt$
jg complete QCpM|,drS
jl startread ]sj0~DI*m
mov ax, word ptr sectors+4 ;&f1vi4
cmp ax, blocknuml+4 |J3NR`-R
jg complete Rj6|Y"gq9
jl startread K]fp
Go
mov ax, word ptr sectors+2 OM:v`<T!z
cmp ax, blocknuml+2 nl
n OwyMJ
jg complete B QjGv?p0s
jl startread }1 QF+Cf
mov ax, word ptr sectors 9.&mz}q
cmp ax, blocknuml
c Zvf"cIs
jg complete v01#>,R
jl startread uGCp#>+
@`|)Ia<
complete: YaL]>.;Z:"
E5UcZ7
lea bx,msgready ctI{^f:
mov dx,bx t;47(U
mov ah,09 -9o{vmB{
int 21 u~F~cDu
]ii+S"U3
popa v0@)t&O
mov ax,3100h s-?fUqA
int 21h WRpyr
&[j]Bp?
; '4u v3)P
dispdx proc near ?CY1]d
pusha (Uk,
lea bx, dsp+3 8eyl,W=dn
mov cx,4 NK/4OAt%
B9M>e'H%<
repeat0: z~Na-N
mov al,dl M"wue*&
and al,0fh lf$Ve
cmp al,09h p2d\ZgWD=)
jg add40 n
vyB/
add al, 30h 9lspo~M
jmp okadd T20VX 8gX
add40: ^M[P-#X_
add al,37h y=H@6$2EQ
okadd:
zY%. Rq-
mov byte ptr [bx],al Q"VMNvKYB
dec bx &mkpJF/
shr dx,4 _H\<[-l
loopnz repeat0 Z8&'f,
lea bx,dsp `fS^
j-_M
mov dx,bx 3?E}t*/
mov ah,09h kso*} uh0
int 21h SSmHEy*r)
97LpY_sU
popa (lWq[0^N
ret ]vo_gKZ
dispdx endp D:E9!l'
=~|
:t&v=c
dispqword proc near 9_huI'"p
pusha 3f&|h^\nD
mov cx ,4 |y1;&<
add bx,6 NP_?f%(
repeatdecbx: K2ewucn
mov dx,[bx] : F9|&q-W,
call dispdx ` |Fp^gM
sub bx,2 I>"Ci(N
loopnz repeatdecbx '6S %9ahE
popa "s_Z&
ret {a"RXa
dispqword endp vVVPw?Ww-
C-SLjJw
rwsect proc near C1fyV]
;BBpN`T
lea bx,msg O#_x)13
mov dx,bx @8gEH+r
mov ah,09h yV]xRaRr2
int 21h b{&FuvQg