第一个宏汇编程序 l%5%oN`4
zi[M{bm
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 q _|5,_a
)P+GklI{4
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! g*imswj7
0!\q
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! wupD
x#VUEu]8
比较长啊!所以可以自动跳过。
FAl 6
v!9Imf
.286 VIdoT2
.radix 16 y,
_3Ks
data segment ;定义数据段 O7*i;$!R
O}!@28|3"
R*fR?
msg db 0dh, "Reading sector:$" To?
bp4
msg1 db 0dh, "Writing sector:$" % x;!s=U
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" j;'Wf[V
zW`koRH@
dsp db " $" y%l#lz=6
X[Gk!dr#
;DAP cyeDZ)
PacketSize db 16d; // 数据包尺寸(16字节) la 7QN QW
Reserved db 0; // ==0 F@K;A%us)
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) Y rnqi-P
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) _VJwC|
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 ?t P/VL
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 |CqJ2
eH*b-H[
;定位用DAP (复位到0磁道) `bF;Ew;
DAP0 db 16d {
S(T1ua
db 0 Y.
tFqzo3
dw 1 ~o5iCt;w
buff1 dw 0,0 Dx)XC?'xO
dw 0,0,0,0 F;@&uXYgc
z5'
nS&x
^{bEq\5&
;DiskParameters !_!b\
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) fOervo
falgs dw 0; WORD Flags; // 信息标志 ]arskmB]
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 g$LwXfg
Heads DW 0; DWORD Heads; // 磁盘磁头数 4ux5G`oL
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 0J</`/g H
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 bj{f[nZ d
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) k
(+u"T
;CBdp-BUj
cmpsect dw 0 ?tQv|x
WfO$q^'?DP
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" c)fp;^
msgHds db 0dh,0a,"Heads:$" =)5a=^
6
msgspt db 0dh, 0a,"SectorsPerTrack:$" Khd ,|pM
msgTotal db 0d,0a, "Total Sectors:$" 6^u(PzlA|~
msgSS db 0dh,0a, "Sector Size:$" i_ T d
I
s\R?@
msgReadErr db 0dh,0a,"Error Reading Sectors:$" V3UGx'@^y
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" }"k(kH
msgReset db 0dh,0a, "Reseting drive to Cyl 0" E1g$WhXIS
uNBhVsM6<
e/\_F+jyc
buffer db 32768d dup(0); DK%eFCo<~
Rx-i.Et Z
data ends ;数据段结尾 uelTsn
4 Z)]Cq*3
stack segment mj|9x1U)
db 400 dup(?) dq(L1y870
stack ends =(\!,S'
%;?3A#
code segment ;定义代码段 nQmYeM
assume cs:code ;规定cs的内容 +[`%b3N k
assume ds:data ;规定ds的内容 5~0;R`D
assume ss:stack Jz'+@q6h
1]`HX=cl
start: }`FPe
pusha ~-i?=
S`KCVQ>V
6s2g +[
mov ax,data ;程序从start开始 qNL~m'
mov ds,ax ;ds置初值,data的段地址 .CpO+z
6<nO2 GW
;设置缓冲区 5Vqvb|
lea bx, buffer zxdO3I
mov bufferaddr,bx vn0*KIrX
mov buff1,bx zy;w07-
)
mov bx,ds 3zHiu*2/!
mov bufferaddr+2,bx J)NpG9iN
mov buff1,bx DL_\luh
s'4p+eJ
lea di,infosize eO G%6C%a
mov dl,80h V1;-5L75
mov ah,48h :nEV/"#F
int 13h ;d40:q<
cf!R
lea bx,msgcyl jXZNr
mov dx,bx #9Z
-Hd<
mov ah,09 4iW2hV@m
int 21h %L.+r!.
mov dx,cylinders >YhqL62!a
call dispdx *[n^6)
Pc1N~?}.
lea bx,msghds i[#Tn52D
mov dx,bx `_i-BdW
mov ah,09 c*Nbz,:
int 21h
(5_(s`q.
mov dx,heads ^+<uHd>
call dispdx =p6xc}N
N/VIP0Kb
lea bx,msgspt s'I$yJ)@2E
mov dx,bx I),8EEf\
mov ah,09 $)V4Eu;
int 21h ~]W8NaQB(
mov dx,spt+2 =T]OYk
call dispdx p6)UR~9Rs
mov dx,spt .5xM7,
call dispdx )I4t l/
bP@_4Dy
lea bx,msgtotal _3S{n=9
mov dx,bx OpQa!
mov ah,09 1 Y&d%AA
int 21h }JsdgO&z
lea bx,sectors _I!&w!3oM
call dispqword Y~xZ{am
*Rd&4XG
lea bx,msgss 0<9TyN6
mov dx,bx 6 -}gqkR
mov ah,09 swrd
int 21h [4e5(!e
mov dx,sectorsize r~!lD9R~
call dispdx &EOh}O<
Q<pM
tW
sbb word ptr sectors, 63d {9MYEN}FO
jnc subok X;NTz75
sub word ptr sectors+2,1 r
N7"%dx
jnc subok tS7u#YMh
sub word ptr sectors+4,1 V^i3
:'
jnc subok Jt8 v=<@
sub word ptr sectors+6,1 KK6YA
,}0pK\Y>$
subok: lOui{QU
M<M
r (z
(Q+3aEUE
Sj?'T@
xor ax,ax ]u ';zJ.
mov blocknumL, ax aJ5R0Y,
mov blocknumL+2, ax ,+&j/0U
mov blocknumL+4, ax M&dtXG8<^
mov blocknumL+6, ax (1^(V)@
x3 S
startread: _?ZT[t<
n6f|,D!?
call rwsect 4Q5v8k=
7Go!W(8
adc word ptr blocknuml,63d -,&Xp>u\
jnc addok icmDPq
adc word ptr blocknuml+2,1 T_WQzEL^
jnc addok xjN~Y D:
adc word ptr blocknuml+4,1 3
[rB:cE/
jnc addok uM8gfY)OI
adc word ptr blocknuml+6,1 wah`
jnc addok NL 37Y{b
Up&q#vqIj
addok: 4SYN$?.Mp
mov ax, word ptr sectors+6 vkK+
C~"
cmp ax, blocknuml+6 MR}\fw$(.
jg complete 0bE_iu>f'
jl startread 5hAg*zJb5o
mov ax, word ptr sectors+4 x3Uv&
cmp ax, blocknuml+4 nq=fSK(
jg complete ?x@khzk
jl startread H =jnCGk
mov ax, word ptr sectors+2 6_Kz}PQ
cmp ax, blocknuml+2 ]O."M"B
jg complete OBZj-`fq J
jl startread $((<le5-)
mov ax, word ptr sectors (
EX
cmp ax, blocknuml @!$NUY8,A#
jg complete p98lu'?@
jl startread x-<dJ}`
&%lhov
complete: ~a $%
a
$H^6I8>
lea bx,msgready ?6dtvz;K+?
mov dx,bx H &JKja}`
mov ah,09 $gNCS:VG*
int 21 d\
v _!7
XHr{\/4V
popa >@" j9
mov ax,3100h iYf4 /1IG,
int 21h w9%gaK;
}W<L;yD
; C6n4OU
dispdx proc near 'SmdU1]4BD
pusha EB#z\
lea bx, dsp+3 Li2)~4p><
mov cx,4 /Q!F/HY3ZS
7@F B^[H:y
repeat0: nCrNZ&P
mov al,dl O,cx9N
and al,0fh 4jpF^&y7u^
cmp al,09h aI{[W;43T
jg add40 ;IT^SHym
add al, 30h / @&Sqv4?
jmp okadd RjDFc:bB
add40: c nzPq\
add al,37h 5+UiAc$
okadd:
r2G<::<zL
mov byte ptr [bx],al RY'y%6Z]ZO
dec bx vl<J-+|0C
shr dx,4 Fv
9Z'#t
loopnz repeat0 g:Dg?_o
lea bx,dsp "hfwj`U
mov dx,bx $sJn:
8z
mov ah,09h m{*l6`dF
int 21h &a`-NRU#
/y 0 )r.R
popa 9c 6=[3)V
ret OH~t\fQ1Zf
dispdx endp 1f=L8
Dr
[Z0e$
dispqword proc near H2]I__t/u
pusha <da! #12L
mov cx ,4
51j
add bx,6 Cv| :.y
repeatdecbx: g@Zc'g/XB
mov dx,[bx] ( ;"ICk&
call dispdx ? _W*7<
sub bx,2 ?vVkZsU
loopnz repeatdecbx
)nY/ RO
popa 181P;R=}<
ret 6]Jv3Re'(I
dispqword endp }DSz_^
^6*? a9jO>
rwsect proc near ;Y"J j
'|Oi#S
lea bx,msg J.<m@\U
mov dx,bx +FiV!nRkZ
mov ah,09h C$bK!]a
int 21h f_7p.H6\
V/Q6v
YX
lea bx,BlockNumL [Ue>KG62=
call dispqword 073(xAkL{
z,9qAts?mh
lea di, packetsize 3 yElN.=
mov dl,80h ;Gi w7a)
mov ah,42h Lg^m?~{
int 13h *M"wH_cd
jnc readok "rXGXQu
2C-u2;X2
mov cx,5 Cn,jLy
;出错后重试(定位0道后再重读) bYtF#Y
retryrd: BWs\'B
lea bx, msgReadErr !rWib`%
mov dx,bx ymKdRF
mov ah,09 9qpH 8j+
int 21h m[}$&i$(
h
%nZKhm
mK4a5H
lea di,dap0 G2A pm`/ y
mov dl,80h *f(}@U
mov ah,44h Rww KPE
int 13h bfJDF(=h
/EC m
lea bx,BlockNumL DirWe
call dispqword 9xWrz;tzo
/eI38>v
lea di, packetsize eN$~@'w
mov dl,80h C?B7xK
mov ah,42h IOA{lN6
int 13h _ehU:3L`s
jnc readok y?rsfIth`
loopnz retryrd +LUL-d
/90@ 85%r
readok: TC2aD&cw{
lea di, packetsize yqK82z5U*R
mov dl,80h l- X|3 ,
mov ah,43h .Ybm27Dk
int 13h L$b9|j7
ZGf=/Ra
a
rwsect endp ^I0SfZ'Y
.,c8cq?
code ends ;代码段结尾 S2*:]pYf}
end start ;结束汇编 65
AOFH
r
dK.*oT