正负零(组装)

Positive, negative and zero (assembly)

我正在对旧 MCU (68hc11) 进行编程,我正在尝试使用 68hc11 指令从 C 语言迁移到汇编代码。

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

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

Array: contains some random values

QUANTITY: represent the highest number of elements that the ARRAY can hold

我用 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 [=11=]
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 [=12=]
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

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

What's wrong with my code?

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

LDD 0,Y

很明显,您正在使用 16 位数字进行操作。否则,您将使用 LDALDB 而不是 LDD.

CPY #(ARRAY+QUANTITY-1)

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

如果QUANTITY是元素的个数,而你用的是16位的数,你要乘以2:

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

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

INY
INY
INY
BLT NEGATIVE_NUMBER

INY指令将修改零标志,因此影响BLTBGEBEQ指令。 LDD 和分支指令之间不能使用 INY

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

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

编辑

I'm not understanding this part: INY followed by 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
    ...