汇编统计20个数中正数、负数、零的个数

声明:本文为个人学习总结笔记,如有谬误,望不吝指教。
注意:代码在win10系统的dosbox中运行,运行过程无异样,代码部分解释程序中给出

统计20个数中正数、负数、零的个数

换行代码解析:参考链接

; 统计20个数的正数,负数,零的个数
DATAS SEGMENT  
CRLF DB 0AH,0DH,"$";回车换行
string1 DB "The number of positive numbers is:","$";正数的个数输出提示  $字符串结束标志
string2 DB "The number of negative numbers is:","$";负数的个数输出提示
string3 DB "The number of zeros is:","$"           ;零的个数输出提示

table db 7,98,-98,123,18,113,-45,66,-13,-122,0,-33,0,-99,0,1,2,3,-4,-5
DATAS ENDS

STACKS SEGMENT
;    此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;变量初始化    
MOV SI,OFFSET TABLE;偏移量
mov cl,0;用于计数,总共15个
mov ch,0;用于数字为零的计数
mov bh,0;用于数字为正数的计数
mov bl,0;用于数字为负数的计数

again:;比较计数板块
cmp cl,20;比较次数是否达到最后了
je overoutput;跳转到输出板块

MOV AL,[SI];接收数据

CMP AL,0h
jz zero;表示为零,ch
js negative;表示负数,bl
jmp positive;表示正数,bh

zero:
add ch,1
jmp over;每一次输出收尾
negative:
add bl,1
jmp over
positive:
add bh,1
jmp over

over:
add cl,1;计数
add si,1;偏移量
jmp again;回到起点

; 输出一个字符时仅支持输出数字0~9
overoutput:;输出板块 bx/cx不能动,保留着计数
LEA DX, string1;正数的输入提示                                       
MOV AH, 09H	   ;字符串(需要结束标志$)				 
INT 21H        ;中断调用(输出字符串)

add bh,48 ; 转化为对应ASCII码值
mov dl,bh
mov ah,2  ; 输出一个字符
int 21h



LEA DX, crlf           ;换行      
MOV AH, 09H							 
INT 21H

LEA DX, string2;负数的输入提示                                       
MOV AH, 09H							 
INT 21H

add bl,48
mov dl,bl
mov ah,2
int 21h

LEA DX, crlf                                   
MOV AH, 09H							 
INT 21H

LEA DX, string3;零的输入提示                                       
MOV AH, 09H							 
INT 21H

add ch,48
mov dl,ch
mov ah,2
int 21h

LEA DX, crlf                                   
MOV AH, 09H							 
INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START

运行结果示例

在这里插入图片描述

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的8086汇编程序,用于统计输入数组中正数负数个数: ``` assume cs:code, ds:data data segment arr db 1, -2, 3, -4, 5, -6, 7, -8, 9, -10, '$' ; 输入数组 pos_cnt db 0 ; 正数个数 neg_cnt db 0 ; 负数个数 data ends code segment start: mov ax, data ; 加载数据段到 DS 寄存器 mov ds, ax mov si, offset arr ; 将数组首地址存入 SI 寄存器 mov cx, 10 ; 输入数组长度为 10 count_loop: mov al, [si] ; 将当前元素存入 AL 寄存器 cmp al, 0 ; 判断当前元素是否为 0 jz zero ; 如果是 0,跳转到 zero 标签 cmp al, 0 ; 判断当前元素是否为正数 jg positive ; 如果是正数,跳转到 positive 标签 inc neg_cnt ; 如果是负数负数个数加 1 jmp next ; 跳过 positive 标签 positive: inc pos_cnt ; 正数个数加 1 next: inc si ; 指向下一个元素 loop count_loop ; 继续循环 ; 输出正数个数 mov ah, 9 mov dx, offset pos_msg int 21h mov al, pos_cnt add al, '0' mov ah, 2 int 21h ; 输出负数个数 mov ah, 9 mov dx, offset neg_msg int 21h mov al, neg_cnt add al, '0' mov ah, 2 int 21h ; 程序结束 mov ah, 4ch int 21h zero: ; 如果当前元素是 0,跳过并指向下一个元素 inc si loop count_loop pos_msg db 'Positive count: ' neg_msg db 'Negative count: ' code ends end start ``` 该程序首先将输入数组加载到数据段,然后使用循环遍历数组中的每个元素,判断其是否为正数负数,然后分别累加正数负数个数。最后,使用 DOS 断输出正数负数个数,并结束程序。 需要注意的是,该程序只能统计有限长度的输入数组。如果输入数组长度超过 255,需要修改程序的变量类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值