【问题标题】:Counting number (HC11)计数号(HC11)
【发布时间】:2020-06-10 21:27:20
【问题描述】:

我还在玩这个 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:

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

由于 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(无符号数)

【问题讨论】:

  • 部分永远不能大于整体。您只有 15 个号码要检查。因此,您的每个计数器都必须能够在最坏的情况下保持数字 15。这是一般的编程问题,而不是 68HC11。就像在 C 中定义一个足够大的变量来保存结果一样,你必须在这里做同样的事情。 QUANTITY 是什么?您指定的数组项数是 15,而不是 200,因此数组的结尾是 ARRAY+15-1。检查结束 (CPX) 时,您可以使用带有 +15 的 BLO 或带有 +14 的 BLS。尝试自己编写一些代码,然后有人可以介入并纠正任何错误。
  • 嘿 Tony,QUANTITY 是数组可以容纳的最大数量的值(元素)。在 ARRAY 我放了一些随机值。你明白我的意思吗?。我使用 THRSim11 编写了一些代码(你知道这个程序吗?)但它根本不正确;我还是绿色的,一切似乎有点“奇怪”(我从答案中学到了很多东西,你解释得很好!)
  • @tonypdmtr 我更新了我的问题;我把它分成了两个不同的部分。在第一部分中,我想获取给定数组中 正、负或零元素 的数量,在最后一部分中,我想从给定数组中获取绝对值。你能帮我解决这两种情况吗?

标签: assembly 68hc11


【解决方案1】:

QUANTITY 定义为 200 在您的示例中似乎毫无意义,因为您对数组进行了硬编码,因此无论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;
}

【讨论】:

  • 感谢您的回复,托尼 :)。 THRSim11 在这一行抛出错误消息:*#ARRAY+::ARRAY* 这个语法正确吗?
  • 语法适用于 ASM11 (aspisys.com/asm11.htm)。我想您可以将其更改为 #ARRAY+QUANTITY 并取消注释 QUANTITY 定义。另外,删除其中的/2。 (我无法帮助你的汇编器,因为我从未使用过它。每个汇编器都有自己的怪癖,而我的 ASM11 最重要!)
  • 因为下面的BLO 命令。如果您更改为#ARRAY+QUANTITY-1,您还必须将BLO 更改为BLS
  • 托尼,是的..这是有道理的:D。我明白这一点,但我不太清楚你做了什么来获得绝对值。您将两个案例合并为一个案例。您能否告诉我如何获得第二部分(给定数组的绝对值)。 -我创建了这个线程stackoverflow.com/questions/62337005/assembly-language-arrays
  • 另外,我怎么能替换这个:::ARRAY,我不想使用 :: 因为它们在我的模拟器上不能正常工作: /
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多