显示用户信息
UID: 231
精华:
8
发帖: 11178
财富: 1805 湾区元
威望: 3531 点
支持度: 34 点
好评度: 21 点
在线时间: 317(时)
注册时间: 2017-06-04
最后登录: 2024-01-07
|
第一个宏汇编程序 mS);bs =)bZSb"<" 工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 5w1=j\oq -m+2l`DLy 那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! Az.
Y-O<$\ 0dgR;Dl(
这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! \dfq&oyU\ Qe4 比较长啊!所以可以自动跳过。 fIBLJ53 K]7@%cS .286 pa\]@;P1 .radix 16 SS`\,%aog data segment ;定义数据段 L@2H>Lh35 MP3E]T~: \J13rL{< msg db 0dh, "Reading sector:$" T2Vj&EA@ msg1 db 0dh, "Writing sector:$" AG9U2x msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" +(P;4ZOmB =-q)I[4# dsp db " $" U^,ld` Onc!5L ;DAP G!Uq#l> PacketSize db 16d; // 数据包尺寸(16字节) QUe.vb^O Reserved db 0; // ==0 &R8zuD`# BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) iD]!PaFD` BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) {<]abO BlockNumL Dw 0,0; // 磁盘起始绝对块地址 U}5uy9A BlockNumH Dw 0,0; // 磁盘起始绝对块地址 I @z{Gr \{&55>
;定位用DAP (复位到0磁道) ("TI~ DAP0 db 16d mj,r@@k:=+ db 0 vx
,yz+yP dw 1 l,/5$JGnk buff1 dw 0,0 sVC5<?OW!p dw 0,0,0,0 5(F!*6i> :J<S-d= fD
RQ(} ;DiskParameters GV2}K
<s infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) h?R-t*G? falgs dw 0; WORD Flags; // 信息标志 e@q[Dv'mu Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 J]~3{Mi Heads DW 0; DWORD Heads; // 磁盘磁头数 iA < EJ SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 "TxXrt%>A Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 'WOWm$2 SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) eIEcj<f 9S<W~# zz cmpsect dw 0
r|#4+'
#
I<G:) msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$" gr7W&2x7\ msgHds db 0dh,0a,"Heads:$" a{8GT2h`4 msgspt db 0dh, 0a,"SectorsPerTrack:$" Y# lE msgTotal db 0d,0a, "Total Sectors:$" d5i/: msgSS db 0dh,0a, "Sector Size:$" oFsMQ Py Uvuvr_IP msgReadErr db 0dh,0a,"Error Reading Sectors:$" 6F<L
4*4U
msgWriteErr db 0dh,0a, "Error Writing Sectors:$" ?Cu$qE!h)[ msgReset db 0dh,0a, "Reseting drive to Cyl 0" x##Iv|$ 5I<?HsK@ d_yqmx?w buffer db 32768d dup(0); ogPfz/ hw \
0CGS data ends ;数据段结尾 p"X\]g^jA> Lr+2L_/v` stack segment ypsCyDQK` db 400 dup(?) 2T|L##C stack ends _I-0[w l9<+4rK2 code segment ;定义代码段 7.=u:PK7kM assume cs:code ;规定cs的内容 /TB_4{ assume ds:data ;规定ds的内容 C
:e 'wmA assume ss:stack INkrG.=u 7i'vAOnw^ start: lE`ScYG pusha x:@e ID cAL&>T ^@)+P/& mov ax,data ;程序从start开始 Y<|L|b6 mov ds,ax ;ds置初值,data的段地址 %%f=aPw (0k0gq; ;设置缓冲区 ?,Hk]Rl3 lea bx, buffer <n#JOjHV mov bufferaddr,bx F-ZD6l
9O mov buff1,bx YZnrGkQ mov bx,ds Vk-_v5 mov bufferaddr+2,bx ~svu0[Vx mov buff1,bx !.F\v. Gis'IX( lea di,infosize vCi:cIp/ mov dl,80h l"vT@g|
mov ah,48h sC}/?^q int 13h 5}By2Tx ZHB'^#b lea bx,msgcyl S#""((U$ mov dx,bx UM#]olh mov ah,09 5H',Bm4- int 21h HP
gMVp' mov dx,cylinders AUN Tc3 call dispdx cJty4m- n_w,Ew,>5 lea bx,msghds J6Kfz~% mov dx,bx a'A0CQ
mov ah,09 WpvH} l r} int 21h 1.>`h: mov dx,heads :bh[6F call dispdx KYeA= A7sej lea bx,msgspt QKF2_Acc mov dx,bx !X,S2-}" mov ah,09 N*z<VZ int 21h fW\u*dMMZE mov dx,spt+2 A8A+ImwO" call dispdx q6,xsO,+ mov dx,spt F4PD3E_# call dispdx PzF)Vg %tu{`PN< lea bx,msgtotal M0]fh5O mov dx,bx >,9t<p=Q mov ah,09 0lBl5ke int 21h m+!%+S1 lea bx,sectors 3C[ ;2 call dispqword qH(2 0Z! >:K3y$]_ lea bx,msgss o3`[email protected] mov dx,bx {UhZ\qe mov ah,09 WAQv4&xGM int 21h Xau.4&\d mov dx,sectorsize 7eq;dNB@gq call dispdx 0(..]\p^d O}%=c\Pb sbb word ptr sectors, 63d B
51LZP jnc subok >LNl8X:Cz* sub word ptr sectors+2,1
Z-~^)l o jnc subok g)"6|Z?D" sub word ptr sectors+4,1 y"]> Rr jnc subok \k* ]w_m- sub word ptr sectors+6,1 AfY(+w6!K kBT cND| subok: rXaL1`
t* Kzmgy14o (g;Ff`P
Pc `W/6xm(X5; xor ax,ax N7e^XUG mov blocknumL, ax %Wc-.ER mov blocknumL+2, ax EXzY4D ^ mov blocknumL+4, ax
zzxU9m~" mov blocknumL+6, ax Zdak))7 mEqV&M1;7l startread: QoW3*1o BE U[M call rwsect :DZiDJ@ FJD*A`a adc word ptr blocknuml,63d 0r@rXwz jnc addok <>R7G)w
F adc word ptr blocknuml+2,1 O-|3k$'\z jnc addok {wm
` adc word ptr blocknuml+4,1 :Rq D0>1 jnc addok ' ZB%McS adc word ptr blocknuml+6,1 B[*i}k%i jnc addok RXP"v- Wl,yznT addok: S}|ea2 mov ax, word ptr sectors+6 ''(T3;^ +
cmp ax, blocknuml+6 `?>OY&( jg complete z4<h)hh"k6 jl startread R:fu n, mov ax, word ptr sectors+4 ;S%wPXj& cmp ax, blocknuml+4 ^=@%@mR/[C jg complete d
EXw=u jl startread kn<[v;+ mov ax, word ptr sectors+2 _Ih~'Y Fd cmp ax, blocknuml+2 ,5/g
Ng jg complete "47nc1T+n jl startread )Y:CV,` mov ax, word ptr sectors f"-?%I*' cmp ax, blocknuml <k)rfv7 jg complete F
|GWYw'% jl startread Zs4N0N{ .d*v fE$ complete: uo%zfi? 2{%BQq>C lea bx,msgready
vu1:8j mov dx,bx CR_A{( mov ah,09 2
o.Mh/D0 int 21 r"4:aKF> +Gjy%JFp popa 7_|zMk.J* mov ax,3100h R"tLu/S n int 21h QM$?}>: rzex"}/ly ; [[)HPHSQ dispdx proc near 2qEy"DKu pusha :8rqTBa` lea bx, dsp+3 +yYz ;, \ mov cx,4 X-%*`XG' Vw,dHIe(3 repeat0: cL}g7D mov al,dl
mjw:Z, and al,0fh 4}0s^>R cmp al,09h LsmC/+7r$1 jg add40 4A*'0!H add al, 30h YlYTH_L>E jmp okadd <?I~ + add40: Nc7YMxk'H add al,37h TN0dfba[ okadd: S2Wxf>bt2 mov byte ptr [bx],al Aw5yvQ>]e dec bx U"ZDt shr dx,4 Z)ObFJMG5 loopnz repeat0 oZIoY*7IrQ lea bx,dsp 9SU;c l mov dx,bx '91Ak,cWB mov ah,09h VfQSfNsi int 21h HID;~Ne cLXMq"?C popa -dza_{&+iZ ret Vdjca:` dispdx endp vm Hf$rq Dl7#h,GTc< dispqword proc near N
(43+
pusha 8J>s|MZ mov cx ,4 Z*oGVr
g add bx,6 )Z]8SED repeatdecbx: +4@EJRC mov dx,[bx] x&7!m
call dispdx
T%:}/@ sub bx,2 P ^D\znvc loopnz repeatdecbx Bq\%]2;eo{ popa M
N#\P1 ret :lcoS J dispqword endp l.&6| C^uXJ~8 rwsect proc near f):|A
d| x=9drKIw> lea bx,msg m. XLpD mov dx,bx `" mov ah,09h mH;\z;lyK int 21h uv Z!3 UH. _RAPXU~ 6- lea bx,BlockNumL ;]'mx call dispqword 5I@< 6S&X 1YQ|KJ*K lea di, packetsize LB-4/G$ mov dl,80h 0dXWy`Mn mov ah,42h Qxt,@<IK int 13h l.FkX jnc readok 0b4QcfB1[ 8*lVO2 mov cx,5
sN;xHTY ;出错后重试(定位0道后再重读) Q
xKC5`1 retryrd: -cOLgrmp lea bx, msgReadErr V:yia^1 mov dx,bx rry 33 mov ah,09 1*#64Y5F int 21h meE&, { ](B+ilr
t}]=5)9< lea di,dap0 s:6H^DQ"C mov dl,80h p'!cGJL mov ah,44h `n$pR8TZ_ int 13h 7RDfhKdb )]?sCNb lea bx,BlockNumL ss.wX~I call dispqword L%Me
wU0TZ V)C4 sG lea di, packetsize xa ??OT`( mov dl,80h *ewE{$UpK mov ah,42h U+URj <) int 13h m{;2! jnc readok a!]'S4JS loopnz retryrd R9^Vk*`gFU ZI}7#K<9X readok: O*X]oX lea di, packetsize eqg|bc[i!t mov dl,80h [Jwo,?w mov ah,43h ljQru ^(u int 13h ,d$V-~2, oBpHmMzA rwsect endp Qv|A^%Ub! ;3 O0O code ends ;代码段结尾 '0lX;z1 end start ;结束汇编 =:uK$>[ %;~Vc{Xxt/
|