已知有几个数据存放在BUF为首址的字节存储区中,试统计其中正数的个数,并将结果存入ZNUM单元中。
程序员文章站
2024-01-30 23:23:16
...
已知有几个数据存放在BUF为首址的字节存储区中,试统计其中正数的个数,并将结果存入ZNUM单元中。
P160
例4.17
汇编思路:DATA段,定义BUF存储区,定义一下DB类型的数据,N为定义数据的总个数,ZNUM用于存放最后的正数个数。STACK段,开辟一段大小为100DB的堆栈段的存储空间,用于进行运算。CODE段,首先让BX获取到BUF的有效地址,CX获取到N的值,用于循环,对AX清零,目的用于记录正数个数,然后,将BX的内容以次与0相比较,若结果为>=0(通过JLE判断),AX自加,否则BX自加,如果通过LOOP跳回到上一步再次进行下一个数据的判断,直到最后CX的值为0结束,然后再将AX统计到的正数的个数赋值给ZNUM,然后调用4CH号功能,返回DOS系统,程序结束。
代码如下:
DATA SEGMENT
BUF DB 3,5,2,7,0,-1,-7,9,-4,8;随机的几个存放在BUF为首址的一些数据
N EQU $-BUF ;N表示数据的总个数
ZNUM DW ? ;ZNUM用于存放最后的统计个数
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(?);在堆栈段开辟了一段100DB大小的用于运算的存储空间
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
LEA BX,BUF ;去有效地址指令LEA,将BUF的地址赋值给BX
MOV CX,N ;CX存放数据的总个数,用于循环使用
XOR AX,AX ;AX清零,用于存放正数的个数
L1: CMP BYTE PTR[BX],0;存储器操作数需要使用修改属性运算符PTR来指定位于其后的存储器操作数的类型为BYTE类型,判断数据是否为0
JLE L2 ;JLE小于或等于转移,即若上条指令结果<=0,跳转到L2标签处,否则执行下一条指令 即>0执行下一条指令,<=0跳转到L2标签处
INC AX ;若执行到此条指令,表示数据为正数,AX自加
L2: INC BX ;BX+1,即操作进行判断下一个数据
LOOP L1 ;无条件跳转到L1标签处,CX-1,再次跳转到L1标签处时,由于BX已经+1,此时再判断的就是下一个数据了,直到CX的值为0,即所有数据已经都判断完毕之后结束循环
MOV ZNUM,AX ;将AX用于存放整数的个数赋值给ZNUM
MOV AH,4CH ;调用4CH号功能,返回DOS操作系统
INT 21H ;终止当前程序的运行,并返回DOS系统
CODE ENDS
END START