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

统计正数、负数与零的个数

程序员文章站 2022-03-10 09:49:06
...

求一个长为N(小于255)的ARRAY字数组中正数、负数与零的个数,
正数的个数存放在DH中,负数的个数存放在DL中,零的个数存放在BH中。

data segment
	origin db "Array: 1, 2, 3, 4, -1, -2, -3, -4, 0, 100, 999, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0$"
	array dw 1, 2, 3, 4, -1, -2, -3, -4, 0, 100, 999, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0
	count equ ($-array)/2
data ends

code segment
	assume cs:code,ds:data
start:
	mov ax, data
	mov ds, ax
	
	mov dx, offset origin
	mov ah, 9
	int 21h
	
	mov dx, 0
	mov bx, 0
	
	mov si, offset array
	
	mov cx, count
s:
	mov ax, [si]
	cmp ax, 0
	jz zero
 next1:
	cmp ax, 0
	jl negt
 next2:
	cmp ax, 0
	jg post
 next3:
	add si, 2
	loop s
	
	mov ah, 4ch
	int 21h
	
	
 zero:
	inc bh
	jmp next1
	
 negt:
	inc dl
	jmp next2

 post:
	inc dh
	jmp next3
	
code ends

end start

扩展:将统计的结果显示出来

data segment
	mess0 	db "The array is: -1, -2, 0, 0, 0, 1, 2, 3, 4", 0dh,0ah,'$'
	mess1 	db "The number of positive: ", '$'
	mess2 	db "The number of negative: ",'$'
	mess3 	db "The number of zero: ", '$'
	;array 	dw -1, -2, 0, 0, 0, 1, 2, 3, 4	;字
	array 	dw 100 dup(-2)	;字
	count	equ ($-array)/2	;定义的是dw 有两个字节
	numDX	dw ?		;16位,在8086就是一个字
	numBX	dw ?
data ends
t
code segment
  	assume cs:code,ds:data,es:data
start:	mov ax,data
	mov ds,ax
	;count:12
	mov cl, count
	mov si, 0		;数组下标
	mov dl, 0		;存放负数个数
	mov dh, 0		;存放正数
	mov bh, 0		;存放0
first:
	cmp array[si], 0
	;输出array[si]
	;mov ah, 2
	;mov dx, array[si]
	;int 21h

	jle nega		;小于等于0,就跳转
	inc dh		;这里记录的是正数	
	jmp zero
nega:
	jz zero
	;结果为0则跳转
	inc dl
zero:		
	;数组一个单元8位,这里定义的数组一个元素占16位,故地址要偏移2个单元

	inc si
	dec cl
	jnz first
	mov bh, count
	;0772:0027
	sub bh, dl
	sub bh, dh	;bh里就是0的个数,由总数-正数个数-负数个数得到
	mov numDX, dx	;numDX:0402
	mov numBX, bx	;numBX:0300

	mov dx, offset mess0
	mov ah, 9
	int 21h

	mov dx, offset mess1		;输出正数
	mov ah, 9
	int 21h

	mov dx, numDX			;因为前面dx改变(dl,dh也都会改变),所以需要一个numDX记录dx
	mov al, dh
	;0772:0047
	CALL B_TO_D16

	mov ah,2
	mov dl,0ah
	int 21h

	mov ah,2
	mov dl,0dh
	int 21h

	mov dx, offset mess2		;输出负数
	mov ah, 9
	int 21h
	mov dx, numDX
	mov al, dl
	CALL B_TO_D16

	mov ah,2
	mov dl,0ah
	int 21h

	mov ah,2
	mov dl,0dh
	int 21h
	mov dx, offset mess3		;输出0
	mov ah, 9
	int 21h
	mov dx, numBX
	mov al, bh
	CALL B_TO_D16
	jmp exit
	
B_TO_D16 PROC NEAR	;16位二进制转十进制子程序
			;AL中要转换的二进制数
	AND AH,0 	;ah:09,ah存放余数,al存放商,得初始化为0

	MOV BL,100	;这里100是十进制,会转换为64h进行计算

	DIV BL 		;ax/100得到百位数,存放al中
	MOV CL,AH 	;余数暂存于cl中

	ADD AL,30H 	;输出百位数,+30h才能输出数字
	MOV DL,AL
	MOV AH,02H
	INT 21H

	MOV AL,CL 
	MOV BL,10
	AND AH,0
	DIV BL 		;ax/10得到十位数

	ADD AL,30H 	;输出十位数
	MOV DL,AL
	MOV CL,AH
	MOV AH,02H
	INT 21H

	MOV AL,CL 	;输出个位数
	ADD AL,30H
	MOV DL,AL
	MOV AH,02H
	INT 21H
	RET
B_TO_D16 ENDP

exit:	mov	ah, 4cH		;否则,返回DOS
		int	21H
	code	ends
		end	start
相关标签: 汇编语言 其他