2

我还在玩这个MC

现在我想计算给定数组中的正数/负数和 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   $0
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

我在这里有点困惑,因为我需要考虑最坏的情况,我的意思是:全部为正,或全部为负或全部为零。所以,我应该根据要保存的信息定义可变大小。我认为数组的末尾应该是 ARRAY + QUANTITY-1。

编辑#1:

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

由于 th ARRAY 包含以下元素:

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

我应该得到这个输出:

POSITIVES       11  
NEGATIVES       2   
ZEROS           2

但要记住:

我必须考虑最坏的情况,即:全部为正,或全部为负或全部为零


另一个不同的情况:

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

我可以使用“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        $0
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

我想将ARRAY中的所有绝对元素存储在ABSOLUTE中

PS:我没有定义 ABSOLUTE 的尺寸

我想在 ABSOLUTE 中看到这些值:

4,144,447,14,555,1147(无符号数)

4

1 回答 1

1

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

RAM                 equ       $0
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;
}
于 2020-06-11T22:52:01.547 回答