第一个宏汇编程序 X:OUu;
/baSAoh/e
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 Zopi;O J
yH',vC.
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! sK|+&BC
>B+!fi'SS>
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! ;Z-%'5hKM
OP\m~1
比较长啊!所以可以自动跳过。 %_ Vj'z~T
qbD[<T
.286 nW_cjYS%
.radix 16 =a_ >")
data segment ;定义数据段 QWAtF@qTV
LVBE+{P\5?
D~t
msg db 0dh, "Reading sector:$" SH1)@K-
msg1 db 0dh, "Writing sector:$" ![aa@nOSa
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" ,uCgC4EP
CdNb&
Nyz
dsp db " $" JR
4fJG
3|1v)E
;DAP !TPKD
PacketSize db 16d; // 数据包尺寸(16字节) %1kIaYZ
Reserved db 0; // ==0 [|APMMYK1
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) !,cfA';S
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) 7NQEn Al
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 @*5(KIeeC>
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 1C<@QrT
/n8\^4{fP{
;定位用DAP (复位到0磁道) !,JV<(7k
DAP0 db 16d (Ujry =f
db 0 ;^|:*
dw 1 AP/#?
buff1 dw 0,0 \ H!Klp
dw 0,0,0,0 OCbwV7q:
t/(rB}
")eY{C
;DiskParameters wp>L}!
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) sH+ 90|?
falgs dw 0; WORD Flags; // 信息标志 {*K7P> &
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 h=MEQ-3jg
Heads DW 0; DWORD Heads; // 磁盘磁头数 G9r~O#=gy
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 lWk/vj<5
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 4)E$. F^
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) f2Z(hYH~
%HcCe[d5l
cmpsect dw 0 }\aJ%9X02
AkVgFQg"
n
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" zEs:OOM
msgHds db 0dh,0a,"Heads:$" _+}#
msgspt db 0dh, 0a,"SectorsPerTrack:$" Q?{^8?7
msgTotal db 0d,0a, "Total Sectors:$" OH6-\U'.Z
msgSS db 0dh,0a, "Sector Size:$"
L }pj+xB
gE~LPwM
msgReadErr db 0dh,0a,"Error Reading Sectors:$" 2 UPG8]
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" XW q@47
FR
msgReset db 0dh,0a, "Reseting drive to Cyl 0" IOOK[g.?h
4~z-&>%
V5bB$tL}3
buffer db 32768d dup(0); rE9Nt9
}
NWII?X#T}
data ends ;数据段结尾 *w[0uQL5Z
\JIyJ8FleC
stack segment >|g(/@IO
db 400 dup(?) Eanwk` Rx
stack ends x5eSPF1
EEj.Kch}4
code segment ;定义代码段 V ^hR%*i'
assume cs:code ;规定cs的内容 Q4F&#^02y
assume ds:data ;规定ds的内容 @ x5LrQ_`r
assume ss:stack ..UA*#%1
&/-}`hIAT
start: @*-t.b2k
pusha m,PiuR>
Nd%j0lj
aQglA
mov ax,data ;程序从start开始 Mk!bmFZOZ
mov ds,ax ;ds置初值,data的段地址 9
f=~E8P
lHc9D
;设置缓冲区 &r1]A&
lea bx, buffer J)P7QTC
mov bufferaddr,bx nXfdf-
mov buff1,bx sk7]s7
mov bx,ds ,d$D0w
mov bufferaddr+2,bx 2[g kDZ
mov buff1,bx Nyl)B7/w
o8u;2gZx
lea di,infosize K aNO&%qX
mov dl,80h o4nDjFhh
mov ah,48h aBWA hn
int 13h +PKd
</*]
w7b\?]}@
lea bx,msgcyl 9G^gI}bY
mov dx,bx CRPE:7,D
mov ah,09 ;2l|0:
int 21h WGHf?G/s
mov dx,cylinders >IJX=24Rc
call dispdx _[$,WuG1
#;/ob-
lea bx,msghds c[a^fu!
mov dx,bx C!W0L`r
mov ah,09 YpEH(tq
int 21h /^=8?w
K
mov dx,heads {fS~G2@1
call dispdx 1
;eWnb(
Ar'k6NX
lea bx,msgspt y'm5Z-@o6
mov dx,bx cr ~.],$Om
mov ah,09 '>[Ut@lT;
int 21h *g[MGyF"
mov dx,spt+2 W(Rp@=!C
call dispdx zQaD&2 q
mov dx,spt 59BB-R,V
call dispdx S9dXkd
R$i-%3
lea bx,msgtotal t
{H{xd
mov dx,bx 1\-r5e; BE
mov ah,09 ~9n30j%]s
int 21h eD!mR3Ai@D
lea bx,sectors -.l.@
call dispqword H7(D8.y )
IO<Ds#(
lea bx,msgss %#C9E kr
mov dx,bx z"f+;1
mov ah,09 PP8627uP
int 21h
h`f $]_c
mov dx,sectorsize w$"^)EG,7
call dispdx 8T88
fw)Q1"|
sbb word ptr sectors, 63d O2"5\@HfE
jnc subok hRZYvZ3
sub word ptr sectors+2,1 $0|`h)&
jnc subok $+$4W\-=X
sub word ptr sectors+4,1 ew<_2Xy"<
jnc subok pKaU
[1x?%
sub word ptr sectors+6,1 iAZbh"I
'PWA
subok: r*9*xZ>8u
H:cAORLB
Ty} Y/jW
0G`@^`
xor ax,ax yf/i)
mov blocknumL, ax HYl~)O>
mov blocknumL+2, ax
@W-0ybv
mov blocknumL+4, ax 8&3KVd`
mov blocknumL+6, ax ZP'0=
afE)yu`
startread: WaSZw0U}y
O~mQ\GlW
call rwsect t8M\
slAR<8
adc word ptr blocknuml,63d 17-B'Gl!<%
jnc addok 1@n'6!]6O
adc word ptr blocknuml+2,1 B_
bZa
jnc addok l
cK4 Uq\q
adc word ptr blocknuml+4,1 :Q8*MJ3&V
jnc addok `RXlqj#u
adc word ptr blocknuml+6,1 n0g8B
jnc addok wlgR =l
$i%#fN
addok: &z@}9U*6b
mov ax, word ptr sectors+6 oj
c.ykP$
cmp ax, blocknuml+6 RoNE7|gF:
jg complete
U7HfDDh
jl startread DMlr%)@{
mov ax, word ptr sectors+4 nWA>u J5
cmp ax, blocknuml+4 oSIP{lfp2Q
jg complete Zxh<pd25Y
jl startread /QT>"
mov ax, word ptr sectors+2 "r1
!hfIYf
cmp ax, blocknuml+2 7[I +1
jg complete *P8CzF^>\&
jl startread JJ9R,
8n6
mov ax, word ptr sectors zwk&3
cmp ax, blocknuml )YW"Zo8~!1
jg complete WjOP2CVv|
jl startread a[p$e?gka
pfHfw,[
complete: #n]K$k>
#_WkV
lea bx,msgready %<fs \J^k
mov dx,bx [}yPy))A
mov ah,09 3!{Tw6A8(
int 21 8Oz9 UcG
}{)Rnb@
>
popa \,
'4eV
mov ax,3100h 3^5h:O
aT
int 21h 88l1g,`**
\>x1#Vr>#V
; $PRUzFZ
dispdx proc near KW$.Yy
pusha Iw?*y.z|
lea bx, dsp+3 X8):R- J
mov cx,4 \i+Ad@)
@km4qJZ
repeat0: 9sI&d
mov al,dl |AS~sjWSJ
and al,0fh H!'4A&
cmp al,09h @saK:z
jg add40 A]ZQ?-L/
add al, 30h udmLHc
jmp okadd Gn<0Fy2
add40: W8F@nY
add al,37h %xr'96d
okadd: f3S 8~!
mov byte ptr [bx],al $9P=
dec bx =J|jCK[r
shr dx,4 (2UA ,
loopnz repeat0 &j,#5f(
lea bx,dsp 0s79rJ
mov dx,bx 70 Ph^e)
mov ah,09h d"L(eI}G
int 21h k(o(:-+x
Kg`P@
popa e=3C*+lq\
ret uIBN
!\j
dispdx endp Lp/'-Y_
[5tvdW6Z&
dispqword proc near z[6avW"q
pusha c\/-*OYr<
mov cx ,4 %J Jp/I
add bx,6 2|ej~}Y
repeatdecbx: suE8"v!sk
mov dx,[bx] g)=$zXWhP
call dispdx e N v\ZR1
sub bx,2 Kj)sL0
loopnz repeatdecbx ZMLN
;.{Na
popa Mdq|:^px
ret s\<UDW
dispqword endp #<X4RJ
P^!g0K
rwsect proc near #%w+PL:*O
T?RN} @D
lea bx,msg )O5@R
mov dx,bx oY0*2~sg
mov ah,09h cQ'x]u_
int 21h \;KSx3o
%!
eRR
lea bx,BlockNumL :s\zk^h?
call dispqword g/}d> 6
-}PE(c1%?q
lea di, packetsize hQ(^;QcSu
mov dl,80h Bh'!aip k
mov ah,42h mG$N%`aG
int 13h HB`'S7Q
jnc readok vxOnv8(
`NsQ&G
mov cx,5 N;,zPW a
;出错后重试(定位0道后再重读) &nwS7n1eb
retryrd: ?8/r=
lea bx, msgReadErr )_\ ;l%&
mov dx,bx ]#W7-Q;]
mov ah,09 )Ly~\*
int 21h ?XP4kjJ
/nsBUM[;
qM+Ai*q
lea di,dap0 ?|WoNA~j}`
mov dl,80h hnH<m7
mov ah,44h #%F-Xsk
int 13h P j,H]
||fw!8E
lea bx,BlockNumL RN|Bk
call dispqword ?zQW9e
^M%P43
lea di, packetsize mln4Vl(l2M
mov dl,80h (P;TM1k
mov ah,42h bRrSd:e
int 13h fj/L)i
jnc readok Na@;F{
loopnz retryrd v_Df+
JZ+6)R
readok: 5gV,^[E-z
lea di, packetsize w>8kBQ?b
mov dl,80h zA}JVB
mov ah,43h LT>_Y`5>
int 13h ?3a=u<
d2V\T+=
rwsect endp v\CBw"
egBk7@Ko
code ends ;代码段结尾 > ;#Y0
end start ;结束汇编 P3-O)m]jv
W -HOl!)