第一个宏汇编程序 qyfxT Q5
Hxi=\2-
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 <]qd9mj5
<s3(
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 7V``f:#d
PzkXrDlB7
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! %"fKZ
)Dpt<}}\
比较长啊!所以可以自动跳过。 yyDBW`V((
g}KZL-p4\m
.286 [
[CXMbD`*
.radix 16 xmx;tq
data segment ;定义数据段 b
u9&sQ;
!jnIXvT1qy
4ux5G`oL
msg db 0dh, "Reading sector:$" 0J</`/g H
msg1 db 0dh, "Writing sector:$" L4Y3\4xXO
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" *lO+^\HXD
$zi\ /Yw
dsp db " $" ?tQv|x
WfO$q^'?DP
;DAP A6.'1OD
PacketSize db 16d; // 数据包尺寸(16字节) =)5a=^
6
Reserved db 0; // ==0 Khd ,|pM
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) 6^u(PzlA|~
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) i_ T d
I
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 s\R?@
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 (.+n1)L?
}"k(kH
;定位用DAP (复位到0磁道) 'PbA/MN
DAP0 db 16d MX\-)e#
db 0 Z"T(8>c;g
dw 1 DK%eFCo<~
buff1 dw 0,0 E NjD~ S
dw 0,0,0,0 7E)7sd
~ riw7"
+N_%|!F-c
;DiskParameters f`rz
)C03
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) - Sgp,"a
falgs dw 0; WORD Flags; // 信息标志 qEz'l'%(
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 kn|l 3+
Heads DW 0; DWORD Heads; // 磁盘磁头数 K a|\gl;V
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 Z`t?kXDNoI
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 83*k.]S`
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) ^k##a-t<_>
!2I wuru
cmpsect dw 0 ZfikNQU9r
K 5[ 3WHQ
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" }`FPe
msgHds db 0dh,0a,"Heads:$" <Rt@z|Zv
msgspt db 0dh, 0a,"SectorsPerTrack:$" giJyMd}x
msgTotal db 0d,0a, "Total Sectors:$" nP31jm+A
msgSS db 0dh,0a, "Sector Size:$" +,>bpp1
!,"G/}'^;
msgReadErr db 0dh,0a,"Error Reading Sectors:$" zSCPp6
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" #::vMnT
msgReset db 0dh,0a, "Reseting drive to Cyl 0" ir#^5e@
*^_!W'T{j
"r+<=JU>OV
buffer db 32768d dup(0); z(eAwmuli
3zHiu*2/!
data ends ;数据段结尾 D*,H%xA
tYa8I/HpT
stack segment hDsORh!i
db 400 dup(?) tn1aH
+
stack ends 0yNlf-O
:nEV/"#F
code segment ;定义代码段 h]P$L>
assume cs:code ;规定cs的内容 6P|neb}
assume ds:data ;规定ds的内容 T,>e\
assume ss:stack jXZNr
sA
lgp2-
start: 4iW2hV@m
pusha %L.+r!.
k]g\`
gc
*[n^6)
mov ax,data ;程序从start开始 Pc1N~?}.
mov ds,ax ;ds置初值,data的段地址 i[#Tn52D
`_i-BdW
;设置缓冲区 c*Nbz,:
lea bx, buffer jp`N%O]6
mov bufferaddr,bx `_`,XkpzCJ
mov buff1,bx )_?$B6hf,&
mov bx,ds ;Vt
u8f
mov bufferaddr+2,bx
@eWx4bl
mov buff1,bx N/VIP0Kb
+Z*%,m=N(
lea di,infosize )`-]nMc
mov dl,80h sA.yb,Fw
mov ah,48h yqwr0yDAl
int 13h -2_$zk*n
JM%#L *;
lea bx,msgcyl p6)UR~9Rs
mov dx,bx ?2;G_P+
mov ah,09 A?zW!'
int 21h L+L9)8FJ
mov dx,cylinders v2V1&-
call dispdx A>puk2 s
P0=F9`3wb
lea bx,msghds vxx3^;4p
mov dx,bx jU$PO\UTk
mov ah,09 =
xk@ Q7$
int 21h P+UK@~D+G
mov dx,heads y"ck;OQD
call dispdx DM9 5Il[/
,YTIYG](
lea bx,msgspt &EOh}O<
mov dx,bx
Ex3woT-
mov ah,09 gKCIfxM
int 21h OLwxGRYX
mov dx,spt+2 r
N7"%dx
call dispdx Le!I-i(aD
mov dx,spt ~T~v*'_h
call dispdx Jt8 v=<@
e hq6.+l
lea bx,msgtotal ./'n2$^3
mov dx,bx lOui{QU
mov ah,09 M<M
r (z
int 21h (Q+3aEUE
lea bx,sectors Sj?'T@
call dispqword ]u ';zJ.
_JH6bvbQ
lea bx,msgss 7F4]EA^
mov dx,bx YBP{4Rl
mov ah,09 =qR
VKz
int 21h 8^l
XM-G-
mov dx,sectorsize e)kf;Hkf
call dispdx Apn#o2
8h97~$7)
sbb word ptr sectors, 63d 9@06]EI_
jnc subok :*1w;>o)n
sub word ptr sectors+2,1 9':$!Eoq
jnc subok ($kwlj~c
sub word ptr sectors+4,1 A-FwNo2"%
jnc subok KX`,7-
sub word ptr sectors+6,1 Y$^\D'.k
*$
!LRmp?
subok: |.A>0-']M
"K<