关于#c++#的问题:已知从BUF单元起存放若干带符号数,找出其中的正数存入PLUS单元中,并求其和后将结果保存在SUM单元中

已知从BUF单元起存放若干带符号数,找出其中的正数存入PLUS单元中,并求其和后将结果保存在SUM单元中

img

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>

#define BUF_LEN         100

static long buf[BUF_LEN] = { 100, -200, 88, 99,-30,-40, 22, 77, -1 };
static long plus[BUF_LEN] = { 0 };
static long sum = 0x00;

long sum_calc(void)
{
    sum = 0;
    for (int i = 0; i < BUF_LEN; i++)
        sum += plus[i];
    return sum;
}

void buf_to_plus(void)
{
    int j = 0;
    for (int i = 0; i < BUF_LEN; i++)
    {
        if (buf[i] > 0)
            plus[j++] = buf[i];
    }
}

int main()
{
    buf_to_plus();
    long value = sum_calc();
    printf("value = %lu\r\n", value);

    return 0;
}
  • 运行效果:

img


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