第一个宏汇编程序 A{"t0Ai='0
UoT}m^ G
工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 ITPpT
SytDo (_=W
那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! w:(7
fu=
ExU|EN-
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! 8ngf(#_{_n
m*,[1oeG&
比较长啊!所以可以自动跳过。 L uKm
UwT$IKR
.286 [`dipLkr
.radix 16 _qNLy/AY
data segment ;定义数据段 '0rwNEg
k}qiIMdI
QP0X8%+p
msg db 0dh, "Reading sector:$" ZO$T/GE6%
msg1 db 0dh, "Writing sector:$" >&z+ih
msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" ,1+_k ="Z
u6d~d\
dsp db " $" }f*S 9V
rmJ847%y`
;DAP HKw4}FC*
PacketSize db 16d; // 数据包尺寸(16字节) >7Q7H#~w
Reserved db 0; // ==0 > PA,72e
BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ?MB nnyo6
BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) [p<[83' ]
BlockNumL Dw 0,0; // 磁盘起始绝对块地址 ,6pH *b$
BlockNumH Dw 0,0; // 磁盘起始绝对块地址 N'.+ezZ;h
'mR+W{r
;定位用DAP (复位到0磁道) d'D\#+%>=
DAP0 db 16d l_EI7mJ
db 0 A2S9h,t
dw 1 >x
gd<
buff1 dw 0,0 zt}p-U2I
dw 0,0,0,0 ,K
aWP
g+*[CKO{
YJsi5
;DiskParameters T+!kRigN~P
infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) ?!-im*~w
falgs dw 0; WORD Flags; // 信息标志 wB"Gw` D
Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 $4,6&dwg
Heads DW 0; DWORD Heads; // 磁盘磁头数 #0H[RU?
SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 >Sah\u`
Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 63$m& ]x
SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) T0jJp7O
! .}{
f;Ls
cmpsect dw 0 NDGBv
b
kJFHUR
msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" c>.X c[H
msgHds db 0dh,0a,"Heads:$" ZeV)/g,w
msgspt db 0dh, 0a,"SectorsPerTrack:$" pBLO
msgTotal db 0d,0a, "Total Sectors:$" *?Y6qalSy
msgSS db 0dh,0a, "Sector Size:$" 5)6%D
PCjY,O
msgReadErr db 0dh,0a,"Error Reading Sectors:$" EV$n>.
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" pQ8+T|0x
msgReset db 0dh,0a, "Reseting drive to Cyl 0" s50ln&2
?yK\L-ad
B[50{;X
buffer db 32768d dup(0); uD3_'a
e vuP4-[y
data ends ;数据段结尾 $S{j}74[
:LG%8Z{R
stack segment !CKUkoX
db 400 dup(?) t68RWzqiG[
stack ends 1fZ:^|\
&.B6P|N'
code segment ;定义代码段 q5PYc.E([
assume cs:code ;规定cs的内容 \>k+Oyj
assume ds:data ;规定ds的内容 n
Lb 9$&
assume ss:stack Pq%cuT%
Y1IlH8+0
start: |&vuK9q
pusha iSHl_/I
<
CXZeL 1+
[%kucG C7
mov ax,data ;程序从start开始 :_ox8xS4
mov ds,ax ;ds置初值,data的段地址 3s2M$3r)6
*6tN o-)^
;设置缓冲区 W^f#xrq>
lea bx, buffer =oJiNM5_u
mov bufferaddr,bx |&7,g
mov buff1,bx Nig-D>OS
mov bx,ds FeLP!oS>
mov bufferaddr+2,bx B?Skw{&
mov buff1,bx ;0'v`ob'.?
^EOjq
lea di,infosize 1O4"MeF
mov dl,80h bk]|C!7$
mov ah,48h G]CY3xw98
int 13h 'o L8Z
AAcbY;
lea bx,msgcyl I"4B1g
mov dx,bx Y
{=@^4|]
mov ah,09 g_U69
z
int 21h s=4.Ovd\
mov dx,cylinders /
jD'o>
call dispdx $(U|JR@
Q
# gHD
lea bx,msghds (i8t^
mov dx,bx {,=,0NQ
Kn
mov ah,09 `>Cx!sYhV
int 21h E12k1gC`
mov dx,heads 2wCRT}C
call dispdx FQ%mNowuj
lDeWs%n
lea bx,msgspt )RFeF!("
mov dx,bx c^y
1s*
mov ah,09 _rd{cvdR
int 21h -}@9lhS,
mov dx,spt+2 )w-?|2-w5
call dispdx 7}k8-:a%
mov dx,spt C#>C59
call dispdx tUQ)q
wG
O)!u 4
lea bx,msgtotal c3##:"wr
mov dx,bx S J5kA`
mov ah,09
s25012
int 21h SCij5il%
lea bx,sectors VzesqVx
call dispqword )Yml'?V"
?}[keSEh>
lea bx,msgss VM[8w`
mov dx,bx @d\F; o<
mov ah,09 "|if<hx+
int 21h jPfoI-
mov dx,sectorsize $$a"A(Y
call dispdx tF|bxXsZ
(&(f`c@I
sbb word ptr sectors, 63d (agdgy:#
jnc subok
Xc!w
y9m
sub word ptr sectors+2,1 8{C3ijR
jnc subok !_@%/I6
sub word ptr sectors+4,1 ~"k'T9QBY
jnc subok FWg
7e3
sub word ptr sectors+6,1 9\F^\h{
-MjRFa
subok: KVuv%?
0NxaQ`\
(Gcl,IW
cc[w%jlA#
xor ax,ax yWzTHW`)Mr
mov blocknumL, ax E_K7.c4M
mov blocknumL+2, ax gA6C(##0
mov blocknumL+4, ax 5S1m&s5k
mov blocknumL+6, ax <CFur
|($pXVLH`
startread: XebCl{HHp
uT1x\Rt|e
call rwsect {%
P;O ?
YdFC YSiS
adc word ptr blocknuml,63d z2V!u\It
jnc addok D)5wGp
adc word ptr blocknuml+2,1 X_lNnk
jnc addok $IHa]9 {
adc word ptr blocknuml+4,1 {#vo^&
B
jnc addok SZ_hG D 0
adc word ptr blocknuml+6,1 <\5{R@A*6
jnc addok b{&@Lm0Tn
zy|hf<V
addok: P1t5-q
mov ax, word ptr sectors+6 '&9b*u";x(
cmp ax, blocknuml+6 ;>~iCFk]?
jg complete .eE5pyw+C
jl startread $)U
RY~;i
mov ax, word ptr sectors+4 S'txY\
cmp ax, blocknuml+4 R:Lu)d>=
jg complete 9cLKb
jl startread M0|z^2
mov ax, word ptr sectors+2 Xy._&&pt
cmp ax, blocknuml+2 J8jbtL O'
jg complete g0l- n
jl startread /vu7;xVG
mov ax, word ptr sectors _xJ&p
$&
cmp ax, blocknuml _/Hu'9432
jg complete -a3C3!!
jl startread V|7 cdX#H
8L:0Wp
complete: (f)QEho7
?^dyQhb
lea bx,msgready 9:1ZL_yf
mov dx,bx z8oSh t`+
mov ah,09
;.iy{&$
int 21 5q\]] LV>
%\A~w3 E
popa ?1YK-T@
mov ax,3100h Q8_d]V=X:
int 21h Q-\: u~
#u~8
Txt
; 'G&w[8mqY
dispdx proc near K&/W cuP&
pusha #r\uh\Cy
lea bx, dsp+3 =#W6+=YN8
mov cx,4 v"j7},P@
o\N),;LM
repeat0: 2n\EZ
mov al,dl avQwbAh[
and al,0fh R8HFyP
cmp al,09h 8qT/1b
jg add40 ;yr'K
add al, 30h "zugnim
jmp okadd ?n}L+|
add40: c5JxKU_
add al,37h >B==*,|
okadd:
dwRJ0D]&
mov byte ptr [bx],al ;*8$BuD
dec bx i]P]o)
shr dx,4 Na4\)({
loopnz repeat0 0VPa=AW
lea bx,dsp +S$x}b'5q
mov dx,bx ]c08`
mov ah,09h zJPzI{-w|
int 21h \QVL%,.%M
8{AzB8xp
popa 'Ag?#vB
ret G=DRz F
dispdx endp 8IO4>CMkv
HM`
;%0T0(
dispqword proc near 2gA6
$s7
pusha _T1|_9b
mov cx ,4 &Mol8=V)
add bx,6 kxh
$R>
repeatdecbx: 9Z}-%Z[,)
mov dx,[bx] *t63c.S
call dispdx 2TdcZ<k}J
sub bx,2 -LUKYGBK
loopnz repeatdecbx J=
T!
popa kEi!
q
ret ikUG`F%W
dispqword endp Ay[6rUO
GujmBb
rwsect proc near iNcB6,++
06ZyR@.@v
lea bx,msg XLB7
E
mov dx,bx :AL
nm0d
mov ah,09h O9bIo]B
int 21h Z<`QDBN"4
3qP!
(*
lea bx,BlockNumL $%ps:ui~X
call dispqword y\
S}U{*Z'
n* uT
lea di, packetsize 3:s!0t
y"
mov dl,80h *~cq
(PFQ
mov ah,42h QN":Qk(,q
int 13h [
&51m^
jnc readok m)V%l0
A2..gs/
mov cx,5 Yf1?3(0O
;出错后重试(定位0道后再重读) n
PE{Gp) }
retryrd: r3'0{Nn+
lea bx, msgReadErr 8K'3iw>z
mov dx,bx V3
2F
mov ah,09 XsEDI?p2
int 21h ? g}G#j
"_W[X
N^v"n*M0|
lea di,dap0 |Y4c+6@_
mov dl,80h S/V%<<[>p]
mov ah,44h 9J*.'
Y
int 13h =XVw{\#9 b
(cx
Q<5
lea bx,BlockNumL tw,uV)xm
call dispqword ';Y0qitGB
xQ%N%
`
lea di, packetsize =A{F&:+a]
mov dl,80h *|Tx4Qt
mov ah,42h 0l;TZf=H
int 13h P`^nNX]x+,
jnc readok +87|gC7B
loopnz retryrd PKJ w%.-
dSkM A
readok: \I( g
70
lea di, packetsize `p#tx.o
mov dl,80h Zcjh
mov ah,43h a@!(o )>
int 13h 8
kvF~d
;
z9Z4MXl
rwsect endp 52ExRG S
-Gy=1W`09
code ends ;代码段结尾 Y
\ Gx|
end start ;结束汇编 6dgwsl~
|yS %