我试图为arduino编写一个程序,它可变地计算一个绝对地址,然后跳转到它(这是一个更大目的的一个更大程序的一部分),但是我遇到了一些麻烦。目前,我正在做类似以下的事情:
uint16_t v_pc;
uint16_t jmpAddress;
jmpAddress = 0x00cf;
v_pc = 0x01;
jmpAddress = calc_address(jmpAddress, v_pc);
asm("jmp %0" :: "r" (jmpAddress));
其中calc_address是:
uint16_t calc_address(uint16_t jmpAddress, uint16_t v_pc){
return jmpAddress += v_pc;
}
然而,当我尝试链接程序(即avr-gcc -mmcu = atmega328p program.o -o program)时,它给出了以下错误:
undefined reference to `r24' collect2: error: ld returned 1 exit status
是否有更好的方法可以实现这一点,或者有人可以描述为什么会出现此错误?
谢谢!
答案 0 :(得分:1)
JMP
没有将寄存器作为操作数。对于间接跳转,您可以使用IJMP
但隐式使用Z
寄存器。因此,您的内联asm看起来应该更像:
asm("ijmp" :: "z" (jmpAddress));