jmp для адреса во встроенном AVR C

Я пытаюсь написать программу для 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

Может быть, есть лучший способ реализовать это или кто-нибудь может описать, почему эта ошибка может возникнуть?

Спасибо!


person user2009114    schedule 15.03.2014    source источник


Ответы (1)


JMP не принимает регистр в качестве операнда. Для непрямого перехода вы можете использовать IJMP, но при этом неявно используется регистр Z. Таким образом, ваш встроенный ассемблер должен выглядеть примерно так:

asm("ijmp" :: "z" (jmpAddress)); 
person Jester    schedule 15.03.2014