数据的分类和统计也是一类非数值计算,数据的分类统计方法在例6.10中已介绍,下面通过一个例子介绍数据的分类存储问题。
例10.5 统计从地址0040H:0000H开始的100个字中,把正数和负数按照它们先后出现的次序分别存储在缓冲区Data1和Data2,并把每类的个数存入相应缓冲区的第一个字单元中。
| 解:由于在指定地址之后的100个字中,可能存在全是正数或负数的情况,所以,缓冲区Data1和Data2的容量都应是100个字。 | |||
| .MODEL SMALL | |||
| .DATA | |||
| 
       Num = 100  |  
  |||
| 
       Data1  | 
    DW ?, Num dup(?) | ||
|  
       Data2  |  
    DW ?, Num dup(?) | ||
| .CODE | |||
|  
       .STARTUP  |  
  |||
|  
       MOV  |  
    AX, 40H | ||
|  
       MOV  |  
    ES, AX | ||
|  
       LEA  |  
    SI, Data1+2 | ;指向存储正数的缓冲区 | |
|  
       LEA  |  
    DI, Data2+2 | ;指向存储负数的缓冲区 | |
|  
       XOR  |  
    BX, BX | ;BX用于扫描存储单元 | |
|  
       MOV  |  
    CX, 100 | ;字符个数 | |
|  
       .REPEAT  |  
  |||
|  
       MOV  |  
    AX, ES:[BX] | ||
|  
       ADD  |  
    BX, 2 | ||
|  
       CMP  |  
    AX, 0 | ||
|  
       .CONTINUE .IF ZERO?  | 
  |||
| 
       JL  | 
    next1 | ||
| 
       MOV  | 
    [SI], AX | ;向正数缓冲区内存储数据 | |
| 
       ADD  | 
    SI, 2 | ||
| 
       .CONTINUE  | 
  |||
| 
       next1:  | 
  |||
| 
       MOV  | 
    [DI], AX | ;向负数缓冲区内存储数据 | |
| 
       ADD  | 
    DI, 2 | ||
| 
       .UNTILCXZ  | 
  |||
| 
       SUB  | 
    SI, OFFSET Data1+2 | ||
| 
       SUB  | 
    DI, OFFSET Data2+2 | ||
| 
       SHR  | 
    SI, 1 | ||
| 
       SHR  | 
    DI, 1 | ||
| 
       MOV  | 
    Data1, SI | ||
| 
       MOV  | 
    Data2, DI | ;把每类的统计个数存入缓冲区的第一个字单元 | |
| 
       .EXIT  | 
    0 | ||
| 
       END  | 
  |||