|
|
![]() |
|
数据的分类和统计也是一类非数值计算,数据的分类统计方法在例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 |