统计正数、负数与零的个数
程序员文章站
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
推荐阅读
-
Excel2010为正数和零添加一个与右括号相同宽度的空格以对齐数字
-
java程序: 输入数量不确定的正数和负数(一次输入一个), 然后打印正数和负数的个数,当输入0时,程序停止
-
Excel2010为正数和零添加一个与右括号相同宽度的空格以对齐数字
-
从键盘输入10个数,统计非负数的个数,并计算非负数的和。
-
键盘输入10个数,统计非正数的个数,并计算非正数的和
-
JS实现统计复选框选中个数并提示确定与取消的方法_javascript技巧
-
JS实现统计复选框选中个数并提示确定与取消的方法_javascript技巧
-
基础算法:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
-
C语言:编写函数,计算二维数组中正数的平均值和负数的个数,通过两个全局变量返回
-
编程统计BUF内存区若干个有符号数中正数、负数、零的个数并保存到相对应的结果单元。