计数 (HC11)

Counting number (HC11)

我还在玩这个MC

现在我想计算给定数组中的positive/negative个数字和0。在 c 语言中,我做了这样的事情,并且效果很好:

int A[15], pos, neg, nul, i;

[...]

pos = 0;
neg = 0;
nul = 0;

for for (i = 0; i < 15; i++) {
    if (A[i] > 0) {
        pos++;
    }
    if (A[i] < 0) {
        neg++;
    }
    if (A[i] == 0) {
        nul++;
    }
}

所以,下一步是做一些类似的东西,但在汇编代码中,我在想这个:

RWM         EQU   [=11=]
ROM         EQU   $C000
RESET       EQU   $FFFE

QUANTITY    EQU   200

            ORG RWM

POSITIVES       RMB 
NEGATIVES       RMB 
ZEROS           RMB 

            ORG ROM
Main:

END         BRA END

ARRAY       DW    1,4,8,-87,0,0,1,4,5,8,7,4,4,1,-9

        ORG RESET
        DW  Main

i'm a little confused right here because i would need to consider the worst cases, i mean: all are positive, or all negative or all zero. So, i should define variable sizes according to the information to be saved. I think the end of the array should be ARRAY + QUANTITY-1.

编辑#1:

对于这种情况,我想获得这个输出:

由于 ARRAY 包含这些元素:

1,4,8,-87,0,0,1,4,5,8,7,4,4,1,-9

我应该得到这个输出:

POSITIVES       11  
NEGATIVES       2   
ZEROS           2

但请记住:

i must consider the worst cases, i.e: all are positive, or all negative or all zero


另一种情况:

假设我想获取存储在特定数组中的所有元素的绝对值。

我可以使用 'C' 来实现,我的意思是,我可以执行这样的操作:

#include <stdio.h>
#include <math.h>

int absolute(int *array, int N);

int main()
{
    int array[16] = {0,1,2,3,-4,5,6,7,-8,9,-10,11,12,13,14,20};
    int ray[16];
    int i;

                for ( i = 0; i < 16; i++ )
        ray[i]=absolute(array,16);
        printf("the absolute value is %d\n", ray[i]);

    return 0;
}

int absolute(int *array, int N)
{
    int i;

    for(i=0; i<N; i++)
        if (array[i]<0)
            array[i] = array[i] * (-1);

}

我试图在汇编中这样做(使用 68hc11 指令)

RWM      EQU        [=15=]
ROM      EQU     $C000
RESET    EQU     $FFFE

         ORG    RWM
ABSOLUTE RMB    

        ORG     ROM
Start:      


END     BRA END

ARRAY   DW   4,144,447,-14,-555,-1147

        ORG RESET
        DW  Start

我想在 ABSOLUTE 中存储来自 ARRAY[=59 的所有绝对元素=]

PS: i have not defined the size for ABSOLUTE

我想在 ABSOLUTE 中查看这些值:

4,144,447,14,555,1147 (UNSIGNED NUMBERS)

QUANTITY 定义为 200 在您的示例中似乎毫无意义,因为您对数组进行了硬编码,因此无论 QUANTITY 说什么,它都具有已知数量的元素。最好让汇编程序将 QUANTITY 定义为实际的元素数量,如下所示(但在我基于 ASM11 的示例中未使用)。

RAM                 equ       [=10=]
ROM                 equ       $C000
Vreset              equ       $FFFE

;*******************************************************************************
                    #ROM
;*******************************************************************************
                    org       ROM

ARRAY               dw        4,144,447,-14,-555,-1147
;QUANTITY           equ       *-ARRAY/2

;*******************************************************************************
                    #RAM
;*******************************************************************************
                    org       RAM

absolute            rmb       ::ARRAY
zeros               rmb       1
positives           rmb       1
negatives           rmb       1

;*******************************************************************************
                    #ROM
;*******************************************************************************

Start               ldx       #ARRAY              ;X -> source
                    ldy       #absolute           ;Y -> destination
          ;-------------------------------------- ;initialize all counters to zero
                    clr       zeros
                    clr       positives
                    clr       negatives
          ;--------------------------------------
Loop                ldd       ,x                  ;D = word to test
                    beq       CountZero           ;go count zero
                    bpl       CountPositive       ;go count positive number
          ;--------------------------------------
                    inc       negatives           ;count negative number
;                   negd                          ;make it positive (abs)
                    coma
                    comb
                    addd      #1
                    bra       Cont
          ;--------------------------------------
CountZero           inc       zeros
                    bra       Cont
          ;--------------------------------------
CountPositive       inc       positives
;                   bra       Cont
          ;--------------------------------------
Cont                std       ,y                  ;save absolute value
                    ldab      #2                  ;B = word size
                    abx                           ;X -> next word
                    aby                           ;Y -> next word
                    cpx       #ARRAY+::ARRAY      ;check for end of array
                    blo       Loop                ;repeat for all elements

                    bra       *

                    org       Vreset
                    dw        Start

顺便说一句,您的 C 代码不正确。我想你是想写这样的东西:

#include <stdio.h>

#define SIZE 16

int absolute(int array[], int ray[], int N)
{
  for (int i=0; i<N; i++)
    ray[i] = array[i] * (array[i]<0?-1:1);
}

int main()
{
  int array[SIZE] = {0,1,2,3,-4,5,6,7,-8,9,-10,11,12,13,14,20};
  int ray[SIZE];

  absolute(array,ray,SIZE);
  for (int i = 0; i < SIZE; i++ )
    printf("The absolute value of %3i is %3i\n", array[i],ray[i]);
  return 0;
}