-2

我正在编写一个旧的 MCU (68hc11),我正在尝试使用 68hc11 指令从 C 语言迁移到汇编代码。

我想在汇编中编写一个程序,计算给定数组中存在的正、负和零值的数量。请注意,ARRAY 中的所有值都可以是正数或全负数或全零,你明白吗?所以我应该定义将正确存储数量的变量的大小。

注意:数组的结尾是:ARRAY+QUANTITY-1

数组:包含一些随机值

QUANTITY:表示 ARRAY 可以容纳的最大元素数

我用 C 写了这个程序:

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

[...]

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

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
VRESET      EQU   $FFFE

QUANTITY    EQU 800 ;MEANS THE MAXIMUM AMOUNT OF VALUES THAT THE ARRAY WILL CONTAIN

            ORG RWM

POSITIVE        RMB 2
NEGATIVE        RMB 2
ZEROS           RMB 2

            ORG ROM
START:
            CLRA
            CLRB
            CLR POSITIVE
            CLR ZEROS
            CLR NEGATIVE
            LDY #ARRAY
            
LOOP
            CPY #(ARRAY+QUANTITY-1)

            BHI END
            LDD 0,Y
            INY
            BLT NEGATIVE_NUMBER
            BEQ ZERO_NUMBER
            BGE POSITIVE_NUMBER
            
            
NEGATIVE_NUMBER     INC NEGATIVE
                        BRA LOOP
                        
POSITIVE_NUMBER     INC POSITIVE
                        BRA LOOP
                        
ZERO_NUMBER         INC ZEROS
                        BRA LOOP
                        

END         BRA END

ARRAY       DW    78,554,-44,-4,2547,0,-3,0,1,7,8,

        ORG VRESET
        DW  START

我的代码有什么问题?

编辑:

错误

RWM         EQU $0
ROM         EQU   $C000
VRESET      EQU   $FFFE

QUANTITY    EQU 800 ;MEANS THE MAXIMUM AMOUNT OF VALUES THAT THE ARRAY WILL CONTAIN

            ORG RWM

POSITIVE        RMB 2
NEGATIVE        RMB 2
ZEROS           RMB 2

            ORG ROM
START:
            CLRA
            CLRB
            CLR POSITIVE
            CLR ZEROS
            CLR NEGATIVE
            LDY #(ARRAY-2)
            
LOOP
             INY
         INY
             CPY #(ARRAY+2*QUANTITY-1)
         BHI END
         LDD 0,Y
         BLT NEGATIVE_NUMBER
                 BEQ ZERO_NUMBER
                 BGE POSITIVE_NUMBER
            
            
NEGATIVE_NUMBER     INC NEGATIVE
                        BRA LOOP
                        
POSITIVE_NUMBER     INC POSITIVE
                        BRA LOOP
                        
ZERO_NUMBER         INC ZEROS
                        BRA LOOP
                        

END         BRA END

ARRAY       DW    78,554,-44,-4,2547,0,-3,0,1,7,8,

        ORG VRESET
        DW  START

我得到了这个输出(不确定)

年龄

4

1 回答 1

2

我的代码有什么问题?

我只是快速浏览了您的程序,所以我的回答可能是错误的:

LDD 0,Y

显然,您正在使用 16 位数字进行操作。否则,您将使用LDAorLDB代替LDD.

CPY #(ARRAY+QUANTITY-1)

QUANTITY如果数组的大小以字节为单位(例如,在 的情况下为 30 ),这将是正确的int A[15]

如果QUANTITY是元素的数量并且您使用 16 位数字进行操作,则必须乘以 2:

CPY #(ARRAY+2*QUANTITY-1)
INY

这再次适用于 8 位元素。对于 16 位元素,您必须向每个元素添加两个或增加Y两次:

INY
INY
INY
BLT NEGATIVE_NUMBER

INY指令将修改零标志,因此影响BLT,BGEBEQ指令。您不能使用INYbetweenLDD和分支指令。

BLT ...
BEQ ...
BGE ...

不是真正的错误,但BGE指令将始终分支。您可以POSITIVE_NUMBER在指令后放置数字代码BEQ并删除BGE指令。

编辑

我不理解这部分:INY其次Bxx

我正在考虑三种不同的方法来做到这一点。最简单的似乎是:

    LDY #(ARRAY-2)  ; Because we'll do INY twice right now
LOOP
    INY
    INY
    CPY #(ARRAY+2*QUANTITY-1)
    BHI END
    LDD 0,Y
    BLT NEGATIVE_NUMBER
    ...
于 2020-06-21T14:20:22.610 回答