组合语言之艺术7

转载 2001年08月04日 22:30:00

附录一    SHELL 排序测试

一、比较表:

    第一章第一节中所提及的排序程式测试结果如下:
  ┌──────┬─────────┬────────┐
  │  项      目│        C        │组  合  语  言  │
  ├──────┼─────────┼────────┤
  │源程式长度  │       1,363 Bytes│     3,581 Bytes│
  │执行程式长度│      69,345 Bytes│       803 Bytes│
  │编程时间    │          20 小时 │        80 小时 │
  │8,000 笔需时│          30 秒   │         8 秒   │
  │48,000笔需时│ 640KB中, 无法执行│        70 秒   │
  └──────┴─────────┴────────┘

    组合语言在大量资料处理时,应用灵活,而C语言因受到空间限制,以目前之系统空间,无法执行。
    测试时间: 1989年 9月12至18日。
    参加人员: 张达权,段旭光,李朝辉。
    使用机种: IBM PS/2-50,80286 CPU,8MHZ。
    使用语言: C及组合语言。
              因其他语言皆无法胜任,故仅选用此二者。
    处理对象: 48,000个中文词组,分别取自12个资料档中。
              每档有 4,000个词组。
              每个词组有一至五个中文字。
              每个中文字占两个字元内码。
              全部资料占 316,421字元。
    排序方式: 按仓颉字母顺位排列。
              为了效率,采用SHELL 排序法。

二、组合语言之制作:

   1: CG      SEGMENT
   2:         ASSUME  CS:CG,DS:CG,ES:CG
   3:         ORG     100H
   4: START:
   5:         MOV     AX,CS
   6:         MOV     DS,AX
   7:         MOV     SI,130          ; 指向输入缓冲区
   8:         MOV     BL,[SI-2]
   9:         DEC     BX
  10:         SUB     BH,BH
  11:         MOV     [BX][SI],BH
  12:         CLD
  13:         MOV     DX,SI
  14:         MOV     AX,3D00H
  15:         INT     21H             ; 打开源档
  16:         JNC     ZSTART
  17:         MOV     DX,OFFSET ZSTR1 ; 若无此档则退出
  18:         MOV     AH,9
  19:         INT     21H
  20:         INT     20H
  21: ZSTART:
  22:         MOV     BX,AX
  23:         SUB     DX,DX
  24:         MOV     CX,8000H
  25:         MOV     BP,4D00H
  26:         MOV     DS,BP
  27: ZREAD:
  28:         MOV     AH,3FH          ; 弄郎
  29:         INT     21H
  30:         OR      AX,AX
  31:         JZ      ZREND
  32:         MOV     AX,DS           ; 未完,换段再读
  33:         ADD     AX,800H
  34:         MOV     DS,AX
  35:         JMP     ZREAD
  36: ZREND:
  37:         MOV     AH,3EH          ; 闽郎
  38:         INT     21H
  39:         MOV     AX,2400H
  40:         MOV     ES,AX
  41:         SUB     DI,DI
  42:         SUB     SI,SI
  43:         MOV     DS,BP
  44:         SUB     BP,BP
  45: ZC1:
  46:         CALL    ZCHGSEG
  47:         MOV     CX,5            ; 将不等长换为等长
  48: ZC3:
  49:         LODSW
  50:         CMP     AL,0DH
  51:         JZ      ZC4
  52:         STOSW
  53:         LOOP    ZC3
  54:         INC     SI
  55:         INC     SI
  56:         JMP     SHORT ZC5
  57: ZC4:
  58:         MOV     AX,2020H
  59:         REP     STOSW
  60: ZC5:
  61:         INC     BP
  62:         LODSB
  63:         DEC     SI
  64:         CMP     AL,1AH
  65:         JNZ     ZC1
  66:         STOSB
  67:         MOV     CS:ZBW2,BP      ; BP为资料计数
  68:         CALL    ZSORT           ; 排序
  69:         CALL    ZDEL            ; 删除相同者
  70:         CALL    ZTR             ; 换为不等长方式
  71:         MOV     SI,DX
  72:         SUB     CX,CX
  73:         PUSH    CS
  74:         POP     DS
  75:         MOV     DX,OFFSET ZFCB  ; 将结果存档
  76:         MOV     AH,3CH
  77:         INT     21H
  78:         MOV     BX,AX
  79:         MOV     AX,2400H
  80:         MOV     DS,AX
  81:         SUB     DX,DX
  82:         OR      SI,SI
  83:         JZ      ZC7
  84:         MOV     CX,8000H
  85: ZC6:
  86:         MOV     AH,40H
  87:         INT     21H
  88:         MOV     AX,DS
  89:         ADD     AX,800H
  90:         MOV     DS,AX
  91:         DEC     SI
  92:         JNZ     ZC6
  93: ZC7:
  94:         MOV     CX,DI
  95:         MOV     AH,40H
  96:         INT     21H
  97:         MOV     AH,3EH
  98:         INT     21H
  99:         INT     20H
 100: ZSORT:                          ; 排序子程式
 101:         SHR     BP,1
 102: ZS0:
 103:         PUSH    BP
 104:         MOV     CS:ZBW1,BP
 105:         MOV     AX,CS:ZBW2
 106:         SUB     AX,BP
 107:         MOV     DX,BP
 108:         MOV     BP,AX
 109:         MOV     DI,2400H
 110:         MOV     DS,DI
 111:         SUB     SI,SI
 112:         CALL    ZFINDES
 113:         ADD     BX,DI
 114:         MOV     ES,BX
 115:         MOV     DI,AX
 116:         SUB     DX,DX
 117: ZS1:
 118:         CALL    ZCOMPS
 119:         JBE     ZS4
 120:         CALL    ZXCHG
 121:         PUSH    DS
 122:         PUSH    ES
 123:         PUSH    SI
 124:         PUSH    DI
 125:         PUSH    DX
 126: ZS2:
 127:         MOV     DI,SI
 128:         MOV     AX,DS
 129:         MOV     ES,AX
 130:         SUB     DX,CS:ZBW1
 131:         JC      ZS3
 132:         CALL    ZFINDES
 133:         MOV     SI,AX
 134:         ADD     BX,2400H
 135:         MOV     DS,BX
 136:         CALL    ZCOMPS
 137:         JBE     ZS3
 138:         CALL    ZXCHG
 139:         JMP     ZS2
 140: ZS3:
 141:         POP     DX
 142:         POP     DI
 143:         POP     SI
 144:         POP     ES
 145:         POP     DS
 146: ZS4:
 147:         ADD     SI,10
 148:         JS      ZS7
 149: ZS5:
 150:         ADD     DI,10
 151:         JS      ZS8
 152: ZS6:
 153:         INC     DX
 154:         CMP     DX,BP
 155:         JNZ     ZS1
 156:         POP     BP
 157:         SHR     BP,1
 158:         JNZ     ZS0
 159:         RET
 160: ZS7:
 161:         SUB     SI,8000H
 162:         MOV     AX,DS
 163:         ADD     AX,800H
 164:         MOV     DS,AX
 165:         JMP     ZS5
 166: ZS8:
 167:         SUB     DI,8000H
 168:         MOV     AX,ES
 169:         ADD     AX,800H
 170:         MOV     ES,AX
 171:         JMP     ZS6
 172: ZFINDES:
 173:         SUB     BX,BX
 174:         MOV     AX,DX
 175:         SHL     AX,1
 176:         RCL     BX,1
 177:         SHL     AX,1
 178:         RCL     BX,1
 179:         ADD     AX,DX
 180:         ADC     BX,0
 181:         SHL     AX,1
 182:         RCL     BX,1
 183:         PUSH    AX
 184:         MOV     CL,4
 185:         SHR     AX,CL
 186:         MOV     CL,12
 187:         SHL     BX,CL
 188:         ADD     BX,AX
 189:         POP     AX
 190:         AND     AX,15
 191:         RET
 192: ZXCHG:
 193:         MOV     CL,5
 194: ZXCHG1:
 195:         LODSW
 196:         MOV     BX,ES:[DI]
 197:         STOSW
 198:         MOV     [SI-2],BX
 199:         LOOP    ZXCHG1
 200:         SUB     SI,10
 201:         SUB     DI,10
 202:         RET
 203: ZCOMPS:
 204:         MOV     CL,5
 205:         MOV     AX,DI
 206:         MOV     BX,SI
 207:         REPZ    CMPSB
 208:         MOV     SI,BX
 209:         MOV     DI,AX
 210:         RET
 211: ZTR:                        ; 将等长串换为不等长串
 212:         MOV     AX,2400H
 213:         MOV     DS,AX
 214:         MOV     ES,AX
 215:         SUB     SI,SI
 216:         MOV     DI,SI
 217:         MOV     BP,CS:ZBW2
 218:         MOV     DX,SI
 219: ZTR1:
 220:         MOV     CL,5
 221:         LODSW
 222:         CMP     AX,2020H
 223:         JNZ     ZTR21
 224:         ADD     SI,8
 225:         DEC     BP
 226:         JMP     ZTR1
 227: ZTR2:
 228:         LODSW
 229:         CMP     AX,2020H
 230:         JZ      ZTR3
 231: ZTR21:
 232:         STOSW
 233: ZTR3:
 234:         LOOP    ZTR2
 235:         MOV     AX,0A0DH
 236:         STOSW
 237:         DEC     BP
 238:         JZ      ZTR4
 239:         CALL    ZCHGSEG
 240:         JMP     ZTR1
 241: ZTR4:
 242:         MOV     AL,1AH
 243:         STOSB
 244:         RET
 245: ZCHGSEG:                        ; 换段子程式
 246:         OR      SI,SI
 247:         JNS     ZCH1
 248:         SUB     SI,BX
 249:         MOV     AX,DS
 250:         ADD     AX,800H
 251:         MOV     DS,AX
 252: ZCH1:
 253:         OR      DI,DI
 254:         JNS     ZCH2
 255:         SUB     DI,BX
 256:         MOV     AX,ES
 257:         ADD     AX,800H
 258:         MOV     ES,AX
 259:         INC     DX
 260: ZCH2:
 261:         RET
 262: ZDEL:                           ; 删除相同字串
 263:         MOV     AX,2400H
 264:         MOV     DS,AX
 265:         MOV     ES,AX
 266:         SUB     SI,SI
 267:         MOV     DI,10
 268:         MOV     BP,CS:ZBW2
 269:         MOV     BX,8000H
 270: ZDEL1:
 271:         DEC     BP
 272:         JZ      ZCH2
 273:         MOV     AX,SI
 274:         PUSH    DI
 275:         MOV     CL,10
 276:         REPZ    CMPSB
 277:         POP     DI
 278:         MOV     SI,AX
 279:         JNZ     ZDEL2
 280:         MOV     AX,2020H
 281:         MOV     [SI],AX
 282: ZDEL2:
 283:         ADD     SI,10
 284:         ADD     DI,10
 285:         CALL    ZCHGSEG
 286:         JMP     ZDEL1
 287: ZBW1    DW      0
 288: ZBW2    DW      0
 289: ZFCB    DB      'YRRR',0
 290: ZSTR1   DB      'FILE NOT FOUND !$'
 291: CG      ENDS
 292:         END     START

    本段程式,计用了80小时,源程式为 3,581字元,执行程式则为 803 字元。执行48,000词组排序,需时70秒。
    及后,因为C语言所写的程式,无法处理48,000个词组,一直试到8,000 条,C才能胜任。再用组合语言程式测试,仅需时8秒。

三、C 语言之制作过程:

    我们用相同的方法,利用C写作如下程式:
   1: # include <fcntl.h>
   2: # include <sys/stat.h>
   3:
   4: extern unsigned char yr[];
   5:
   6: main(argc, argv)
   7: int argc;
   8: char *argv[];
   9: {
  10:  int  i, n, fd, result;
  11:  long  rsum;
  12:  unsigned char *yrp[8000], *yrptr, eof[1];
  13:
  14:  fd = open(argv[1], O_RDWR);
  15:  rsum = 0;
  16:  while ((result = read(fd, &yr[rsum], 16384)) > 0)
  17:  {
  18:   rsum += result;
  19:   printf("%d %ld/n", result, rsum);
  20:  }
  21:  close(fd);
  22:  printf("after reading file/n");
  23:  fd = creat(argv[1], S_IREAD | S_IWRITE);
  24:  printf("after creat file/n");
  25:  yrp[0] = yrptr = yr;
  26:  n = 1;
  27:  while (*yrptr && n < 8000)
  28:  {
  29:   while (*yrptr++ != '/n');
  30:   yrp[n++] = yrptr;
  31:  }
  32:  sort(yrp, n);
  33:  for (i = 0; i < n; i++)
  34:  {
  35:   yrptr = yrp[i];
  36:   do
  37:   {
  38:    write(fd, yrptr, 1);
  39:   } while (*yrptr++ != '/n');
  40:  }
  41:  eof[0] = 0x1a;
  42:  write(fd, eof, 1);
  43:  close(fd);
  44: }
  45:
  46:
  47: sort(v, n)
  48: unsigned char *v[];
  49: int  n;
  50: {
  51:  int  gap, i, j;
  52:  unsigned char *temp;
  53:
  54:  printf("enter sorting/n");
  55:  for (gap = n / 2; gap > 0; gap /= 2)
  56:   for (i = gap; i < n; i++)
  57:    for (j = i - gap; j >= 0; j -= gap)
  58:    {
  59:     if (strcmp(v[j], v[j + gap]) <= 0)
  60:      break;
  61: /*    printf("swapping/n");*/
  62:     temp = v[j];
  63:     v[j] = v[j + gap];
  64:     v[j + gap] = temp;
  65:    }
  66: }
  67:
  68: strcmp(v1, v2)
  69: unsigned char *v1, *v2;
  70: {
  71: /* printf("enter strcmp/n");*/
  72:  for (; *v1 == *v2; v1++, v2++)
  73:   if (*v1 == '/n')
  74:    return(0);
  75:  return(*v1 - *v2);
  76: }

    本段程式由设计到制作完成,仅用了20小时。但在测试时,花了不少时间,费尽心机,始终无法令本程式运行,原因是资料太大系统空间不够。
    最后不得已将资料删至8,000 条,才运行成功,需时30秒。

 

GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之一)。

1、abs(x) 取得输入参数的绝对值。 2、acos(x) 反余切函数,为cos(x)的反函数,原来得到Y作为输入,的到对应的角度。 (其实只要记得作用是:得到角度,值域为[0,π],输入范围为[-...
  • u013480185
  • u013480185
  • 2016年05月12日 21:49
  • 295

《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记1

Chapter2 GPU图形绘制管线图形管线绘制三个主要阶段应用程序阶段 高级语言实现 主要和CPU,内存打交道 例如:碰撞检测,场景图建立,空间八叉树更新,视锥裁剪等经典算法 得到几何体数据(顶点坐...
  • RICKShaozhiheng
  • RICKShaozhiheng
  • 2016年03月08日 18:14
  • 1704

C语言之数值计算--级数算法

在编程语言的学习中,我们学习过不少的算法,比如累加,累乘,数值交换,排序等等。在一些软件比赛和面试题中,有一类算法不容忽视,属于高频题目,我之前去企业面试的时候就遇到这样的一类题目,题目不算难,掌握方...
  • morixinguan
  • morixinguan
  • 2016年02月06日 11:13
  • 2187

C语言之四书五经—C语言书籍推荐

C语言之四书五经—C语言书籍推荐 分类: 书籍推荐 2012-05-24 15:52 1866人阅读 评论(0) 收藏 举报 来说说C语言方面的图书。什么,C语言?有...
  • crcr
  • crcr
  • 2013年01月21日 11:08
  • 1655

c语言之简单的贪吃蛇 -- 详解以及源代码

1. 前言2. 题目描述3. 分析思路4. 编程所需知识5. 具体分析6. 完善7. 源代码8. 总结...
  • llCnll
  • llCnll
  • 2017年05月25日 11:59
  • 5673

求集合/字符串中的所有组合 (C语言)

转自:http://blog.csdn.net/fanzitao/article/details/7879033 来源:http://zhedahht.blog.163.com/blog/stati...
  • u011385799
  • u011385799
  • 2015年09月09日 19:33
  • 697

R语言之——正则表达式

定义正则表达式是对字符串操作的一种逻辑公式。作用对象正则表达式的作用对象是文本。作用*逻辑过滤 *精准抓取特点 灵活性、逻辑性和功能性非常强 可以迅速地、用极简单的方式达到字符串的复杂控制 语法规则...
  • u011402596
  • u011402596
  • 2015年03月21日 13:15
  • 2336

C语言之volatile

volatile的重要性对于搞嵌入式的程序员来说是不言而喻的,对于volatile的了解程度常常被不少公司在招聘嵌入式编程人员面试的时候作为衡量一个应聘者是否合格的参考标准之一,为什么volatile...
  • qq_33160790
  • qq_33160790
  • 2016年11月19日 23:37
  • 193

C语言之:函数

一、函数概述 1、首先什么是函数? 函数是用于完成特定任务的程序代码的自包含单元。 2、为什么使用函数? 第一、函数的使用可以身故重复代码的编写。第二、函数使得程序更加模块化,有利于程序的阅读...
  • qq_35898384
  • qq_35898384
  • 2017年08月06日 22:43
  • 47

6.C语言之字符串

1. 字符串入门 字符串也称字符串字面量,是用一对双引号括起来的字符序列。 我们也许经常会遇到字符串特别长的情况,在C#中,我们一般会用@符号来表示。 Console.WriteLine...
  • mcvsyy521
  • mcvsyy521
  • 2013年10月23日 15:12
  • 230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:组合语言之艺术7
举报原因:
原因补充:

(最多只允许输入30个字)