伍胥之 |
01-22-2011 00:02 |
第一个宏汇编程序 =R"tnjR Ei<:=6EX?8 工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 O5?Eb 5=986ci$U 那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! 4{g|[email protected]( 4#9-Z6kOk 这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! jFv<]D%A[ ZB%~> 比较长啊!所以可以自动跳过。 hdL2`5RFF wp*1HnWj8Y .286 :\OvVS/ .radix 16 WGx>{'LJ data segment ;定义数据段 H%N+Vr3O, Z(eSnV_RL >>Di msg db 0dh, "Reading sector:$" e8 aV
qq[ msg1 db 0dh, "Writing sector:$" '7R'fhiO/3 msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" pH[lj8S {
9$Q|XK dsp db " $" .
6dT5x8u S/;Y4o ;DAP m5X=P5U PacketSize db 16d; // 数据包尺寸(16字节) =;=V4nKN Reserved db 0; // ==0 Qknc.Z} BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) ~2431<YV BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) 9Q/!%y%5 BlockNumL Dw 0,0; // 磁盘起始绝对块地址 eb\`)MI/ BlockNumH Dw 0,0; // 磁盘起始绝对块地址 gj^]}6-P +GU16+w~E ;定位用DAP (复位到0磁道) $"{3i8$3mT DAP0 db 16d 4?&a?*M db 0 nj`qV
dw 1 NGUGN~p buff1 dw 0,0 -Wk"o?}q dw 0,0,0,0 hp4(f W pH%c7X/[3L v6\2mc. ;DiskParameters )du{ZWr infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) J*X.0&Toc falgs dw 0; WORD Flags; // 信息标志 h_yR$H&tX Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 z{L;)U B^ Heads DW 0; DWORD Heads; // 磁盘磁头数 _|:bac8pL SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 x{V>(d'p Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 \#,#_ SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) @I6 A9do 3uG5b8? cmpsect dw 0 {Y%=/ba W 0\nhg5]? msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" 1>y=i+T/b msgHds db 0dh,0a,"Heads:$" !!%nl_I( msgspt db 0dh, 0a,"SectorsPerTrack:$" RpP[ymMZJ msgTotal db 0d,0a, "Total Sectors:$" R6mJFE*6T9 msgSS db 0dh,0a, "Sector Size:$" -xIhN?r) +/86w59 msgReadErr db 0dh,0a,"Error Reading Sectors:$" Ytwv=;h-
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" TbAdTmW msgReset db 0dh,0a, "Reseting drive to Cyl 0" pY>-N [<a%\:c m4 bvS\P!m\c buffer db 32768d dup(0); %]$p ^m ps
y(]Pf data ends ;数据段结尾 S&]<;N_B [Ms{J!^q stack segment g4SYG)'R+ db 400 dup(?) ~LW%lMy;^| stack ends &\`a5[ gJ8 c]2c code segment ;定义代码段 7"NJraQ6 assume cs:code ;规定cs的内容 L8xprHgL assume ds:data ;规定ds的内容 -JhjTA assume ss:stack KXA)i5z ,W8Iabi^ start: y{I[}$k pusha f%[ukMj& $SGA60q gIM'bA<~ mov ax,data ;程序从start开始 7RC096 ?} mov ds,ax ;ds置初值,data的段地址 G$|;~'E p't:bR ;设置缓冲区 , !%R5*?=D lea bx, buffer 4|41^B5Y mov bufferaddr,bx F@'rP++4 mov buff1,bx #iU8hUbo mov bx,ds [email protected]"i~g<e mov bufferaddr+2,bx OPt;G,$ta mov buff1,bx KPd C9H akCo+ @ lea di,infosize <6O_t,K] mov dl,80h P(gVF
|J? mov ah,48h ytV)!xe int 13h [H:GKhPC` ]v\egfW,W lea bx,msgcyl ]baaOD$Z mov dx,bx P9TBQW2G{ mov ah,09 FJ(B]n[> int 21h [aM' mov dx,cylinders b801OF call dispdx $7DcQ b9 pz35trW
lea bx,msghds T<e7(= mov dx,bx |*c\6 : mov ah,09 uGU
v~bE int 21h ^g-t#O lD? mov dx,heads ^?7dOW call dispdx =e!l=d|/ d1TdH s\ lea bx,msgspt oS#'u1k mov dx,bx ^L-w(r62< mov ah,09 MYw8wwX0kJ int 21h
$S=~YzO mov dx,spt+2 4`U0">gY call dispdx #3Ej0"[email protected] mov dx,spt ,c%K)KuPK. call dispdx $#!UGY ZG@M%|> lea bx,msgtotal Gl8&FrR mov dx,bx .-KtB(t mov ah,09 FJf~vAQ int 21h &`yOIX-H_ lea bx,sectors 5`E`[email protected] call dispqword R{)
Q1~H=q a%T -Z.rd lea bx,msgss 6mu<&m
@ mov dx,bx .;HIEj zq mov ah,09 Zgg'9E int 21h q1f=&kGX~ mov dx,sectorsize iO*`(s call dispdx Y8%0;!T jWXR__>. sbb word ptr sectors, 63d v.
Xoq jnc subok *!g 24 sub word ptr sectors+2,1 xEVLE,*?> jnc subok `s`C{|wv sub word ptr sectors+4,1 ?[email protected]@;tt jnc subok Pknc[h}, sub word ptr sectors+6,1 }qiF^D} SLtSqG7~ subok: \T`["< ?h!t$QQ!M &:c:9w b4Cfd?' xor ax,ax 20UqJM8Ot mov blocknumL, ax g/8.W mov blocknumL+2, ax K4! P' mov blocknumL+4, ax iW|s|1mh3 mov blocknumL+6, ax JBR[;
z
M c[VrC+e m startread: g ?afX1Sg 4E=0qbt8 call rwsect xfq]9< 1$$37?F
E adc word ptr blocknuml,63d |JUe>E* jnc addok ~{L.f94N adc word ptr blocknuml+2,1 ~ww?Emrw jnc addok ^
<qrM adc word ptr blocknuml+4,1 $]@O/[ jnc addok UvkJ?Bu adc word ptr blocknuml+6,1 ajn-KG!A jnc addok n6b3E* ~~PgF"v addok: 1~%o}+#- mov ax, word ptr sectors+6 3p=vz' cmp ax, blocknuml+6 NSw<t9Yi jg complete ]o-Fi$h! jl startread ngP7'1I mov ax, word ptr sectors+4 /7bw: h; cmp ax, blocknuml+4 u(W^Nou/+ jg complete 4d!S#zx jl startread d,W/M(S mov ax, word ptr sectors+2 $`|5/,M%QN cmp ax, blocknuml+2 RCzV5g jg complete jOs
H2^ jl startread UL+E,= mov ax, word ptr sectors (nLKQV 1 cmp ax, blocknuml 9"~9hOEct jg complete
LI[ ?~P2\ jl startread
n
]w7Zj <}d/v_+pnh complete: TMK'(6dH 5^yG2&># lea bx,msgready n!a<:]b< mov dx,bx yVaU t_Zi mov ah,09 dY8(nQG int 21 ?cJY
B) [email protected]{~;#R popa ?0{yq>fTu mov ax,3100h 8x9Rm int 21h [email protected]f eK'wVg# ; +P|2m"UA dispdx proc near be7L="vZw pusha n12UBvc}% lea bx, dsp+3 y0<Uu
mov cx,4 `)$`-Pw* `fz,Lh*
v repeat0: p#bhz5&/ mov al,dl l7z6i*R and al,0fh .]P
2}w)x? cmp al,09h vf<UBa;Xm jg add40 Hd*}k6 add al, 30h 7:TO\0]2n jmp okadd CZY7S*fL add40:
O}C)~GU add al,37h .5.8;/
/ okadd: gz;&u) mov byte ptr [bx],al 0 " y%9
dec bx `}gdN}; shr dx,4 W5.Va. loopnz repeat0 dCe X}
Z lea bx,dsp Hd%!Nt\u mov dx,bx U]1(&MgV mov ah,09h Bd5+/G=m int 21h XX2h(
- -f?A h popa @A{m5h ret ;wR 'z$8 dispdx endp b:kXNDc 44HiTWQS?l dispqword proc near T 6Ctf# pusha ,
ECLqs% mov cx ,4 y\'P3ihK add bx,6 y bQP E/9 repeatdecbx: wAFW*rO5o mov dx,[bx] FRZs[\I|iT call dispdx u[")*\CP sub bx,2 ]Bnwk
o loopnz repeatdecbx }HRK?.Vj: popa O>c$sL0g ret [email protected]<K
C dispqword endp !^y y0`k6 9S1)U$ rwsect proc near d-B7["z, "NzD1k6.L lea bx,msg r?A|d.Tl mov dx,bx Puh$%;x
mov ah,09h *hdC?m._ int 21h .A6lj).: HjA_g0u lea bx,BlockNumL WKl+{e call dispqword @
hif$
4woO;Gm lea di, packetsize Tycq1i^ mov dl,80h 0Fw6Dq<8-! mov ah,42h o''wCr% int 13h Xsuwa-G!5~ jnc readok `t(D! %gd(wzco mov cx,5 Jblj^n?Bm ;出错后重试(定位0道后再重读) 0F:1\9f5 retryrd: z42F,4Gk lea bx, msgReadErr nSx]QREL! mov dx,bx @|\R}k
%( mov ah,09 DmqSQA int 21h :+rUBYWx )ev<7g9*q YB,t0%vTJw lea di,dap0 v [njdP mov dl,80h r0]4=6U mov ah,44h XYEv&-M`?w int 13h a%vrt)Gx 0?0Jz lea bx,BlockNumL beXNrf=bG call dispqword %Ym^{N MJ{%4S{K,p lea di, packetsize XORk!m| mov dl,80h sOU_j:A80; mov ah,42h Q.U$nph\%d int 13h @b#^ - jnc readok
FFKGd/:! loopnz retryrd S9| a$3K' fbvbz3N readok: I5m][~6.? lea di, packetsize ``U^COD mov dl,80h zj{r^D$ mov ah,43h &>g'$a<[ int 13h dt}_D={Be E:`v+S_h rwsect endp @`36ku "&.S&=FlI code ends ;代码段结尾 ;)AfB#:d end start ;结束汇编 =
u[#2! q.YfC
|
|