第一个宏汇编程序 J/ vK6cO\
Us
]=Y}(
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 (-,>qMQs
V7EQ4Om:It
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! b?8)7.{F{
M*w' 1fT
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! R:M,tL-l
sef]>q
比较长啊!所以可以自动跳过。 U6<M/>RG$
6kN:*
.286 X d3}Vn=
.radix 16 )hBE11,PB
data segment ;定义数据段 49AW6H.JT
wPX*%0]
c+g@Z
"es
msg db 0dh, "Reading sector:$" `<U5z$^QTw
msg1 db 0dh, "Writing sector:$" 7b, (\Fm
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" k[%aCGo
1yMr~Fo
dsp db " $" _|A
+) K
6Z?Su(s(5
;DAP b5<okICD
PacketSize db 16d; // 数据包尺寸(16字节) {WQq}-(
Reserved db 0; // ==0 3#c3IZ-;
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) $5NKFJc
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) s9 @Sd
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 1'JD =
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 l(!/Q|Q|
Xh
F_]
;定位用DAP (复位到0磁道) E8ta|D
DAP0 db 16d ! \sMR
db 0 Ab2Q
\+,
dw 1 u#@RM^738d
buff1 dw 0,0 :QPf~\w?
dw 0,0,0,0 5wv fF.v
(5a1P;_Y
MLr-,
"gs
;DiskParameters >&Y-u%}U
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) -R
b{^/
falgs dw 0; WORD Flags; // 信息标志 nls
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 U\zD,<I9
Heads DW 0; DWORD Heads; // 磁盘磁头数 ?T!)X)A#
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 ]A^4}CK^<
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 bWmw3w
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) F'FP0t!S
#$E)b:xj
cmpsect dw 0 po7>IQS]
2: SO_O4C
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" ((bTwx
msgHds db 0dh,0a,"Heads:$" Ji?#.r`"n
msgspt db 0dh, 0a,"SectorsPerTrack:$" '#.#$8l
msgTotal db 0d,0a, "Total Sectors:$" ;SY\U7B\
msgSS db 0dh,0a, "Sector Size:$" UG](go't
qtMD CXZ^n
msgReadErr db 0dh,0a,"Error Reading Sectors:$" cE\>f8 I
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" 5Sva}9H
msgReset db 0dh,0a, "Reseting drive to Cyl 0" hr/o<#OW
mV)+qXC
\~~ }N4
buffer db 32768d dup(0); , jU5|2
wNYg$d0M
data ends ;数据段结尾 nL-K)G,
6;iJ*2f5V
stack segment S\*`
lJzPM
db 400 dup(?) 4CrLkr
stack ends x#*QfE/E(@
2YlH}fnH
code segment ;定义代码段 !q'
4D!I
assume cs:code ;规定cs的内容 9t$]X>}
assume ds:data ;规定ds的内容 S\=1_LDx"
assume ss:stack D+RiM~LH8
AXPMnbUS
start: oyvKag
pusha h&;t.Gdf
/?*]lH.
\)/yC74r7(
mov ax,data ;程序从start开始 kXrlSaIc
mov ds,ax ;ds置初值,data的段地址 cB
XWfv4
+?dl`!rE
;设置缓冲区 a`!@+
6yC
lea bx, buffer %JyXbv3m,
mov bufferaddr,bx xfFg,9w8
mov buff1,bx Y`BRh9Sa
mov bx,ds />44]A<
mov bufferaddr+2,bx M{mSd2
mov buff1,bx lz<]5T|
(Un_!)
lea di,infosize :J/M,3
mov dl,80h f-SuM% S_
mov ah,48h \r{W
int 13h Hy_;nN+e
]uQqn]+I!
lea bx,msgcyl ;j%BK(5
mov dx,bx =d)-Fd2li
mov ah,09 =1.9/hW
int 21h C\*4q8(
mov dx,cylinders ])}]/Qw
call dispdx ~}"]&%Q{J
8gy_Yj&{P
lea bx,msghds t0)<$At6J
mov dx,bx !EIjN
mov ah,09 @~ETj26U'
int 21h x@KZ]
mov dx,heads U;q];e:,=}
call dispdx qfo
D
B9,^mE#
lea bx,msgspt t#i,1a
HA
mov dx,bx T'H::^9:E
mov ah,09 j)C:$
int 21h &(N+.T5cp
mov dx,spt+2 .(CP. d
call dispdx SF*n1V3hx
mov dx,spt =
ieag7!
call dispdx ,9D+brm
2RM+W2!!
lea bx,msgtotal =]C]=
mov dx,bx x@Hd^xH`
mov ah,09 ,Lr<)p
int 21h )#iq4@)|g
lea bx,sectors
yR;{
call dispqword Sa1l=^
cyM-)r@YQV
lea bx,msgss x[3A+
mov dx,bx $F'>yop2b
mov ah,09 [U/(<?F{(
int 21h \S~Vx!9w
mov dx,sectorsize Np+&t}
call dispdx ACq7dLys,B
o*rQP!8,oy
sbb word ptr sectors, 63d @]aOyb@
jnc subok L+}n@B
sub word ptr sectors+2,1 2L?!tBw?1
jnc subok Pr ]Ka
sub word ptr sectors+4,1 {0"YOS`3AX
jnc subok Bi,;lR5
sub word ptr sectors+6,1 E&$yuW^z
({WyDu&=
subok: umi5Wb<
4m)OR
y|
wlq3o
u8GMUN
xor ax,ax 67SV~L#%O
mov blocknumL, ax P
[Uy
mov blocknumL+2, ax `n5"0QRd
mov blocknumL+4, ax Z|"p*5O,
mov blocknumL+6, ax rl2&^N
~@.%m"<.
startread: ,#?uJTLH
??60,m:]
call rwsect jhbonuV_
y:m_tv0~0
adc word ptr blocknuml,63d kn"(mJe$
jnc addok 0&_UH}10
adc word ptr blocknuml+2,1 mZz="ZLa:
jnc addok 6GPp>X
adc word ptr blocknuml+4,1 Y5ZZ3Ati
jnc addok zOgTQs"ZH
adc word ptr blocknuml+6,1 <Z}SKR"U%
jnc addok F#
T 07<
uvP2Wgt
addok: 3jB$2:
#
mov ax, word ptr sectors+6 D,qu-k[jMI
cmp ax, blocknuml+6 ' Z0r>.
jg complete 3psU?8(
jl startread RPd}Wf
mov ax, word ptr sectors+4 5NoI~X
=
cmp ax, blocknuml+4 7\FXz'hA
jg complete uVyGk~
jl startread I`KQ|h0%
mov ax, word ptr sectors+2 G)v
#+4
cmp ax, blocknuml+2 %\|'%/"`2(
jg complete kHw_ S-
jl startread ~w8JH2O
mov ax, word ptr sectors Jc&y9]
cmp ax, blocknuml n_ lo`
jg complete ';Zi@f"
jl startread &`0/CV
w@JKl5
complete: ?;/^Ya1;Z
4lhw3,5
lea bx,msgready LI
2&&Mw
mov dx,bx evkH05+;W
mov ah,09 I$N8tn+E
int 21 M])dJ9&e
X3'H
`/
popa <Rh
6r}f
mov ax,3100h ]I3!fEAWR
int 21h =0uAE7q(9
J:&[59
; EI!6MC)
dispdx proc near EnOU?D
pusha ]e.JNo
lea bx, dsp+3 MUfG?r\t
mov cx,4 AL#4_]m'
2MZCw^s>
repeat0:
`\Hf]b
mov al,dl !aO` AC=5u
and al,0fh ;4
N;D
cmp al,09h H"ZZ.^"5FV
jg add40 !*6CWV0
add al, 30h M9zfT!-
jmp okadd 7qTE('zt
add40: #Zrlp.M4
add al,37h L|bwZ,M=}?
okadd: EdZ\1'&/9
mov byte ptr [bx],al r{l(O,|e
dec bx g~(E>6Y
shr dx,4 .`>y@p!
loopnz repeat0 oy<WsbnS
lea bx,dsp cuy1DDl
mov dx,bx ^&y$Wd]6
mov ah,09h rV08ad
int 21h 34\(7JO
(=~&+z
popa }!IL]0q
ret F 8B#}%JE
dispdx endp ,^# yo6-
orOt>5}b<
dispqword proc near ,U(1NK8o
pusha #9K-7je;j
mov cx ,4 "Ph^BUAb
add bx,6 Jgnhn>dHe
repeatdecbx: _6ay-u
mov dx,[bx] ?QE,;QtpK
call dispdx a!O0,y
sub bx,2 6 G=j6gK%P
loopnz repeatdecbx @E:,lA
popa 8Q_
SRwN
ret xhcK~5C
dispqword endp OS8q( 2z?s
4Y[1aQ(%
rwsect proc near 4:g R r
0RoU}r@z4
lea bx,msg cM&{+el
mov dx,bx giz7{Ai
mov ah,09h /0Ax*919j
int 21h |4'Y/re
{nLjY|*
lea bx,BlockNumL E Cyyl
call dispqword BcI|:qv|
,}K<*t[I
lea di, packetsize {%_L=2n6
mov dl,80h /7gOSwY
mov ah,42h !.d@L6
int 13h j~*L~7
jnc readok (<^ yqH?
b0oMs=uBn
mov cx,5 / X1 x
;出错后重试(定位0道后再重读) XQw>EZdj_N
retryrd: B(M6@1m_
lea bx, msgReadErr N<~ku<nAU
mov dx,bx Ol!ntNhXm
mov ah,09
"~'b
int 21h F_CYYGZ
nqLA}u4IM
Yk=PS[f
lea di,dap0 pR~U`r5z
mov dl,80h j_Yp>=+[
mov ah,44h i':C)7
int 13h CHz+814
fkac_X$7
lea bx,BlockNumL hP15qKy
call dispqword ocs+d\
`]%|f
lea di, packetsize TqnTS0fx
mov dl,80h AM!G1^c
mov ah,42h wi
iCd
int 13h %n*-VAfE\
jnc readok D*lKn62
loopnz retryrd 8YbE`32
K.0:
C`C
readok: EY tQw(!Q
lea di, packetsize c"[cNZo
mov dl,80h M3q|l7|9
mov ah,43h 1')%`~
int 13h z*-2.}&U<
w!D|]L
oE
rwsect endp "s{5O>
?!+MM&c-n
code ends ;代码段结尾 6fw
(T.Pe
end start ;结束汇编 BqT y~{)+
0\e IQp