欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

已知有几个数据存放在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
相关标签: 微机原理