显示用户信息
UID: 231
精华:
8
发帖: 11183
财富: 1815 湾区元
威望: 3532 点
支持度: 34 点
好评度: 21 点
在线时间: 321(时)
注册时间: 2017-06-04
最后登录: 2026-03-28
|
第一个宏汇编程序 b~,e(D9DG s<F*kLib 工作后不久,单位里我所在的小组有了一台浪潮0520(XT兼容机),有了硬盘,有了汇编编译程序,就开始玩汇编了。当然那时的主要工作是用dBASEIII,这个我已经在读研期间自学会了,读了一本关于dBASEIII plus的英文书,编个dBASE/FoxBASE程序已经是小菜一碟了。 >jAFt_ `_OrBu[ 那时候的硬盘老出点问题,经常碰上个“Error reading data....” 啥的小毛病,但是换又不方便而且很贵。PCTOOLS与NORTON DISKEDIT扫描盘比较慢。我就自己写了一个磁盘扫描程序。算是用汇编写的第一个正式的有点用处的程序吧! zFExYYd
s%K( hk 这也是我现在电脑里唯一一个汇编语言的程序了,其它都随着磁盘来回更换丢了。所以,还是在老大这里存一份留个纪念吧! HbA/~7 Mg`!tFe3 比较长啊!所以可以自动跳过。 . &j+& [email protected] Q@E .286 z eT`kZ .radix 16 =eQB-Xe8Y data segment ;定义数据段 "UMaZgI T3zovnR H575W"53 msg db 0dh, "Reading sector:$" Mi8)r_l%O msg1 db 0dh, "Writing sector:$" {V
QGfN msgready db 0dh,0a,0dh,0a,"Reading/Writing completed!", 0dh,0a, "$" Uw.')ZY= ]A=\P,D dsp db " $" 6Bjo9,L bKCE;Wu:G ;DAP 5N|LT8P}Z PacketSize db 16d; // 数据包尺寸(16字节) CZ3oX#b Reserved db 0; // ==0 MIIl+ BlockCount dw 63d; // 要传输的数据块个数(以扇区为单位) yqq1 a
o BufferAddr dw 0,0 ; // 传输缓冲地址(segment:offset) C(G.yd BlockNumL Dw 0,0; // 磁盘起始绝对块地址 js81@WX!c BlockNumH Dw 0,0; // 磁盘起始绝对块地址 vw2E$ya zx}+Q B0 ;定位用DAP (复位到0磁道) 3tTOs DAP0 db 16d 5U475& db 0 xjo`u:BH dw 1 CLaQE{ buff1 dw 0,0 HD=F2p dw 0,0,0,0 K/
On|C +112{v=!i #! R>`l(S ;DiskParameters xyGwYv>*KO infosize dw 26d; WORD InfoSize; // 数据包尺寸 (26 字节) B~KxUp falgs dw 0; WORD Flags; // 信息标志 e`qrafa Cylinders DW 0; DWORD Cylinders; // 磁盘柱面数 (46'#E z[F Heads DW 0; DWORD Heads; // 磁盘磁头数 uH9Vj<E$K SPT Dw 0,0; DWORD SectorsPerTrack; // 每磁道扇区数 H 1kI+YJ@ Sectors Dw 0,0,0,0; QWORD Sectors; // 磁盘总扇区数 ,]2?S5R SectorSize DW 0; WORD SectorSize; // 扇区尺寸 (以字节为单位) R<&Euph ,w#lUgp cmpsect dw 0 ?`U_|Yo I
</P_:4G msgcyl db 0dh,0a,"Disk Parameters",0dh,0a,"Total Cylinders:$"
`;6M|5G msgHds db 0dh,0a,"Heads:$" UGO;5! msgspt db 0dh, 0a,"SectorsPerTrack:$" "i;.> msgTotal db 0d,0a, "Total Sectors:$" _f%s] msgSS db 0dh,0a, "Sector Size:$"
]LC4rS 4<#ItQ( msgReadErr db 0dh,0a,"Error Reading Sectors:$" M
co:eE msgWriteErr db 0dh,0a, "Error Writing Sectors:$" F0U %m msgReset db 0dh,0a, "Reseting drive to Cyl 0"
F5Xb_&
M[mYG _{J 0#J~@1Gf buffer db 32768d dup(0); X#&5?oq` +QFKaS<sn data ends ;数据段结尾 y 9]d{:9
Vpnk>GWD stack segment y5j:+2|I db 400 dup(?) Ea@0>_U| stack ends 'lZlfS:Z8 gS+X% code segment ;定义代码段 eA!Z7
' assume cs:code ;规定cs的内容 M?h{'$T assume ds:data ;规定ds的内容 N# }w1] assume ss:stack EE 1D>I AhF@ start: ML12
&E> pusha f
g)*TR 3$!QP
N kzZgNv#G; mov ax,data ;程序从start开始 I+& T}R
mov ds,ax ;ds置初值,data的段地址 PK:Lv15"r }) -V,\ ;设置缓冲区 lz0-5z+\ lea bx, buffer y]jx-wc3O mov bufferaddr,bx 6m;>R%S_ mov buff1,bx ]jhi"BM mov bx,ds z[c8W@OJ mov bufferaddr+2,bx I_ZJnu< mov buff1,bx hH1Q:}a 5?>4I"ne lea di,infosize Z5q%L!4G mov dl,80h h.vy SwF"j mov ah,48h k_V+;&:% int 13h _VT{2`|}) vMp=\U-~^ lea bx,msgcyl ]2@(^x'= mov dx,bx }gv'r
"; mov ah,09 Mgw#4LU int 21h ^@V*:n^ mov dx,cylinders FSQB{9,H call dispdx ,zoHmV1Wd+ !.j{vvQ/ lea bx,msghds .z,-ThTH@\ mov dx,bx F|F0#HC ? mov ah,09 $vXY"-k int 21h MeBTc&S< mov dx,heads <
c^'$ call dispdx ]vQa~}
Imhk U% lea bx,msgspt bPOPoq1# mov dx,bx ?C2(q6X+s mov ah,09 daKZ*B| int 21h "rn mov dx,spt+2 E D>7 call dispdx n{4iW_/D mov dx,spt ?_gvI call dispdx w
PR Ns9^ ]"T157F lea bx,msgtotal \XB,)XDB mov dx,bx bPFGQlmIO mov ah,09 fF0K]. int 21h m=6?%'
H} lea bx,sectors HKJCiQ|k call dispqword ;
pBLmm*F E"E(<a lea bx,msgss kc2B_+Y1 mov dx,bx 1Gr^,Ry mov ah,09 |Gz<I int 21h MM32\}Y6 mov dx,sectorsize 0BC@wV call dispdx V4Rs UmVn: a sbb word ptr sectors, 63d R1LirZlzJ jnc subok #-
B<u- sub word ptr sectors+2,1 IE \RP! jnc subok mx}5":} sub word ptr sectors+4,1 `C>h]H( jnc subok K` N$nOw sub word ptr sectors+6,1 $=plAi bDvGFSAH subok: LOkgeJuWv 0e8 rd->@s|4mT _K9PA[m5~ xor ax,ax mHMsK}=~ mov blocknumL, ax Hi[lN7ma8 mov blocknumL+2, ax uY~mi9E mov blocknumL+4, ax r!!uA1!7 mov blocknumL+6, ax c/K#W$ l /1LN\Eu startread: U=D;CjAh
!b`fykC call rwsect 961&rR}d 7RUztu\_ adc word ptr blocknuml,63d la{?&75] jnc addok {1)b LG|$ adc word ptr blocknuml+2,1 [1(eSH jnc addok U[pHT _U
adc word ptr blocknuml+4,1 w~B1TfqNo jnc addok cY!Y?O adc word ptr blocknuml+6,1 _W(xO
|,M jnc addok WDY\Fj 'QE8 addok: z!6_u@^- mov ax, word ptr sectors+6 p_Xfj2E4c cmp ax, blocknuml+6 I '0[ jg complete LkJq Bg jl startread X{#^O/ mov ax, word ptr sectors+4 ZiR}S cmp ax, blocknuml+4 -`q!mdA2 jg complete _(f@b1O~ jl startread qY-aR; mov ax, word ptr sectors+2 l^R:W#*+U cmp ax, blocknuml+2 "T5jz#H#/ jg complete IA0vSF: jl startread zKP[]S- mov ax, word ptr sectors 4}N+o+ cmp ax, blocknuml mfZbo#KS#v jg complete A/=cGE jl startread 3|$?T|#B (Yj6|` complete: P7}w^#x *m"@*O' lea bx,msgready :j+E]|d(~6 mov dx,bx qE2<vjRg mov ah,09 |E K6txRb int 21 zk$h71<{. 3)VO{C
j! popa yam'LF mov ax,3100h 2+pw%#fe int 21h 49E|
f
^q w31O~Ve ; <IR@/b!, dispdx proc near ruagJS)+ pusha Q%aF
~ lea bx, dsp+3 `{YOl\d_ mov cx,4 D?E
VzG A(&\wd repeat0: EO+Ix7w mov al,dl 3\ajnd| and al,0fh e[x,@P` cmp al,09h 1W*Qc_5 v1 jg add40 eW.qMx#:od add al, 30h 6T4"m jmp okadd wOL%otEf add40: _\4r~=`HQ add al,37h 5L6.7}B okadd: T|\sN*}\8J mov byte ptr [bx],al aEdMZ+P. dec bx 1N _"Mm{ shr dx,4 Jy:@&c loopnz repeat0 ^'Lp<YJs6 lea bx,dsp }%wP^6G*x\ mov dx,bx Cx
aI@+ mov ah,09h P:6K int 21h 7V=deYt_p = z5=? popa Nkb%4ofKqu ret #p=+RTZ< dispdx endp Pq~#SxA~ # d"M(nt dispqword proc near =4q 5KI pusha rMG[,:V mov cx ,4 kN 2mPD/ add bx,6 WuVsW3@ repeatdecbx: {C`M<2W] mov dx,[bx] C|H`.|Q call dispdx u@D5SkT sub bx,2 GX19GI@k loopnz repeatdecbx ~jKIuO/ popa \t{4pobo ret j*8Ze!^ dispqword endp B_Wig2xH0 G AH< rwsect proc near !pe[H*Cy OtL~N
TY lea bx,msg FBP #_"z mov dx,bx 2 br>{^T mov ah,09h P `<TO int 21h ZD50-w; 8
u[.s`^ lea bx,BlockNumL ?}^ y6 call dispqword CNuE9|W(vI >*/
|tL lea di, packetsize dT1UYG}>j mov dl,80h xz@*V>QT mov ah,42h \W_ Dz*N int 13h miBCq l@x jnc readok K&._fG ~+ae68{p mov cx,5 e{2Za ;出错后重试(定位0道后再重读) c5f57Z retryrd: LkeYzQH/l lea bx, msgReadErr fc:87ZR{K mov dx,bx $igMk'%Nmb mov ah,09 6/QWzw.0c int 21h im>/$!&OyI jY9tq[~/ mq<:^ lea di,dap0 i]zh8|"> mov dl,80h oVuIHb0w mov ah,44h b%F'Ou~ int 13h ([JFX@ cJT_Qfxx lea bx,BlockNumL n}%_H4t call dispqword 8fvKVS 4myikeUR_ lea di, packetsize r_ 9"^Er mov dl,80h tF*Sg{:bCa mov ah,42h !b K;/) int 13h (
K-7z jnc readok ;mV>k_AG loopnz retryrd 6UN{Vjr%` p^{yA"MQ readok: L) _ VdB lea di, packetsize N<(rP1)`v mov dl,80h E]{0lG`l mov ah,43h YedF% int 13h Yo5ged]i 4u p7:? rwsect endp !N:w?zsp +CEt:KQ code ends ;代码段结尾 HU
+27
1A8 end start ;结束汇编 ?~^p:T brE%/%!e
|