Assembly 我正在尝试使用索引循环反转程序集中的数组

Assembly 我正在尝试使用索引循环反转程序集中的数组,assembly,Assembly,所以我正在为M68HC11微处理器课程做作业。我甚至不知道我是否在做目标要求的事情。我认为我在正确的轨道上,我认为我的代码至少可以实现任务的相同功能,如果不是方法的话。 这是目标: “一个16字节数组以前已存储在从位置$A0开始的连续内存中。使用索引循环编写一个紧凑的68HC11汇编语言程序,该循环将以从位置$C0开始的相反顺序将这些字节存储在连续内存位置中 如果数组为X,则该数组以前的存储方式如下: Memory location Contents $A0 x1

所以我正在为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
程序运行后,阵列也将按如下方式存储:

Memory location Contents
    $A0          x1
    $A1          x2
    $A2          x3
        etc
Memory location Contents
    $C0          x16
    $C1          x15
    $C2          x14
        etc
将您的程序定位在$E000。”

这是我的代码:

*HW2程序

        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

谁能给我指出正确的方向吗?谢谢你

我建议你在开始之前写一篇更高层次的课程描述:

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的数组。那么为什么要将计数器初始化为16而不是15

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