jmp在内联AVR C中进行寻址

时间:2014-03-15 17:53:11

标签: c assembly arduino memory-address avr-gcc

我试图为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

是否有更好的方法可以实现这一点,或者有人可以描述为什么会出现此错误?

谢谢!

1 个答案:

答案 0 :(得分:1)

JMP没有将寄存器作为操作数。对于间接跳转,您可以使用IJMP但隐式使用Z寄存器。因此,您的内联asm看起来应该更像:

asm("ijmp" :: "z" (jmpAddress));