所以我正在为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
有人能指出我正确的方向吗?谢谢
答案 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