📄 附录一 shell 排序测试.htm
字号:
<BR> 269: MOV BX,8000H
<BR> 270: ZDEL1:
<BR> 271: DEC BP
<BR> 272: JZ ZCH2
<BR> 273: MOV AX,SI
<BR> 274: PUSH DI
<BR> 275: MOV CL,10
<BR> 276: REPZ CMPSB
<BR> 277: POP DI
<BR> 278: MOV SI,AX
<BR> 279: JNZ ZDEL2
<BR> 280: MOV AX,2020H
<BR> 281: MOV [SI],AX
<BR> 282: ZDEL2:
<BR> 283: ADD SI,10
<BR> 284: ADD DI,10
<BR> 285: CALL ZCHGSEG
<BR> 286: JMP ZDEL1
<BR> 287: ZBW1 DW 0
<BR> 288: ZBW2 DW 0
<BR> 289: ZFCB DB 'YRRR',0
<BR> 290: ZSTR1 DB 'FILE NOT FOUND !$'
<BR> 291: CG ENDS
<BR> 292: END START
<BR><BR> 本段程式,计用了80小时,源程式为 3,581字元,执行程式则为 803 字元。执行48,000词组排序,需时70秒。
<BR> 及后,因为C语言所写的程式,无法处理48,000个词组,一直试到8,000 条,C才能胜任。再用组合语言程式测试,仅需时8秒。
<BR><BR>三、C 语言之制作过程:
<BR><BR> 我们用相同的方法,利用C写作如下程式:
<BR> 1: # include <fcntl.h>
<BR> 2: # include <sys\stat.h>
<BR> 3:
<BR> 4: extern unsigned char yr[];
<BR> 5:
<BR> 6: main(argc, argv)
<BR> 7: int argc;
<BR> 8: char *argv[];
<BR> 9: {
<BR> 10: int i, n, fd, result;
<BR> 11: long rsum;
<BR> 12: unsigned char *yrp[8000], *yrptr, eof[1];
<BR> 13:
<BR> 14: fd = open(argv[1], O_RDWR);
<BR> 15: rsum = 0;
<BR> 16: while ((result = read(fd, &yr[rsum], 16384)) > 0)
<BR> 17: {
<BR> 18: rsum += result;
<BR> 19: printf("%d %ld\n", result, rsum);
<BR> 20: }
<BR> 21: close(fd);
<BR> 22: printf("after reading file\n");
<BR> 23: fd = creat(argv[1], S_IREAD | S_IWRITE);
<BR> 24: printf("after creat file\n");
<BR> 25: yrp[0] = yrptr = yr;
<BR> 26: n = 1;
<BR> 27: while (*yrptr && n < 8000)
<BR> 28: {
<BR> 29: while (*yrptr++ != '\n');
<BR> 30: yrp[n++] = yrptr;
<BR> 31: }
<BR> 32: sort(yrp, n);
<BR> 33: for (i = 0; i < n; i++)
<BR> 34: {
<BR> 35: yrptr = yrp[i];
<BR> 36: do
<BR> 37: {
<BR> 38: write(fd, yrptr, 1);
<BR> 39: } while (*yrptr++ != '\n');
<BR> 40: }
<BR> 41: eof[0] = 0x1a;
<BR> 42: write(fd, eof, 1);
<BR> 43: close(fd);
<BR> 44: } <BR> 45:
<BR> 46:
<BR> 47: sort(v, n)
<BR> 48: unsigned char *v[];
<BR> 49: int n;
<BR> 50: {
<BR> 51: int gap, i, j;
<BR> 52: unsigned char *temp;
<BR> 53:
<BR> 54: printf("enter sorting\n");
<BR> 55: for (gap = n / 2; gap > 0; gap /= 2)
<BR> 56: for (i = gap; i < n; i++)
<BR> 57: for (j = i - gap; j >= 0; j -= gap)
<BR> 58: {
<BR> 59: if (strcmp(v[j], v[j + gap]) <= 0)
<BR> 60: break;
<BR> 61: /* printf("swapping\n");*/
<BR> 62: temp = v[j];
<BR> 63: v[j] = v[j + gap];
<BR> 64: v[j + gap] = temp;
<BR> 65: }
<BR> 66: } <BR> 67:
<BR> 68: strcmp(v1, v2)
<BR> 69: unsigned char *v1, *v2;
<BR> 70: {
<BR> 71: /* printf("enter strcmp\n");*/
<BR> 72: for (; *v1 == *v2; v1++, v2++)
<BR> 73: if (*v1 == '\n')
<BR> 74: return(0);
<BR> 75: return(*v1 - *v2);
<BR> 76: }
<BR><BR> 本段程式由设计到制作完成,仅用了20小时。但在测试时,花了不少时间,费尽心机,始终无法令本程式运行,原因是资料太大系统空间不够。
<BR> 最后不得已将资料删至8,000 条,才运行成功,需时30秒。
<BR><BR></FONT></P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%" bgColor=#f2f2f2 height=20>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P class=9 align=right><FONT face=细明体><A
href="http://www.wisesoul.net/web/asm/asm/asm05.htm">上一页</A>
<A
href="http://www.wisesoul.net/web/asm/asm/index.html">目录</A>
<A
href="http://www.wisesoul.net/web/asm/asm/asm07.htm">下一页</A>
</FONT></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></CENTER></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -