我试图使用索引循环反转程序集中的数组

时间:2014-09-16 22:15:20

标签: assembly

所以我正在为M68HC11微处理器类工作。我甚至不知道我是否正在做目标所要求的。我认为我走在正确的轨道上,我认为我的代码至少可以实现任务的相​​同功能,如果不是方法论的话。 这是目标:

“一个16字节的数组先前已经存储在从位置$ A0开始的连续存储器中。使用索引循环编写一个紧凑的68HC11汇编语言程序,它将这些字节以相反的顺序存储在连续的存储单元中,从位置$ C0开始。

如果数组是X,则数组先前已按如下方式存储:

Memory location Contents
    $A0          x1
    $A1          x2
    $A2          x3
        etc

程序运行后,数组也将按如下方式存储:

Memory location Contents
    $C0          x16
    $C1          x15
    $C2          x14
        etc

以$ E000找到你的程序。“

这是我的代码:

* HW2 PROGRAM

        ORG $E000 ;Beginning of Program

COUNTER EQU #16 ;Initialize Counter with number of bytes
COUNTERTWO  EQU #0

FIRST   EQU #$A0 ; Location of first array

SECOND  EQU #$C0 ; Location of second array

        LDX FIRST; Set X index register to First array
        LDY SECOND; SET Y INDEX register to second array


DO      LDAA COUNTER, X
        STAA COUNTERTWO, Y


        INC COUNTERTWO; increment counter for array2
        DEC COUNTER ; decrement COUNTER for array1

        BNE DO ; loop back to do



SPIN    BRA SPIN ;Spin loop to end program

        ORG $FFFE

        FCB $E0
        FCB $00

有人能指出我正确的方向吗?谢谢

2 个答案:

答案 0 :(得分:1)

我建议您在开始之前编写更高级别的程序说明:

extern char X[16];
extern char Y[16];

void func(void) __attribute__((noreturn))
{
   int counter = ??;                    //what should counter be?
   for (int countertwo = 0; counter; counter--, countertwo++)
   {
       Y[countertwo] = X[counter];
   }
   l1:
   goto l1;
}

在您的程序集版本中,您已将countertwo初始化为零,这表示0索引数组。为什么然后将counter初始化为16而不是15?

答案 1 :(得分:1)

ARRAY1              equ       $A0
ARRAY2              equ       $C0
LENGTH              equ       16
RESET               equ       $FFFE
ROM                 equ       $E000

                    org       ROM

Start               ldx       #ARRAY1             ;X -> start of source array
                    ldy       #ARRAY2+LENGTH-1    ;Y -> end of destination array
                    ldab      #LENGTH             ;B = number of bytes to copy
Loop                ldaa      ,x                  ;A = source byte
                    staa      ,y                  ;write to destination
                    inx                           ;bump up source pointer
                    dey                           ;bump down destination pointer
                    decb                          ;one less byte to copy
                    bne       Loop                ;repeat until done

                    bra       *                   ;halt

                    org       RESET
                    dw        Start