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