Сообщение от DrunyaRuma
|
компилятор для передачи параметров использует регистры r16-r23,а все что не уместилось передается через стек
|
Именно так, если переменных много, то не уместившиеся R16-23 передаются через стек данных.
Только я не понимаю ЗАЧЕМ привязывать переменные к определённым регистрам?
Обьявим переменные
Код:
|
unsigned char variable1,variable2,variable3,variable4,variable5, variable6,variable7,variable8,variable9,variable10 ,variable11,variable12,variable13;
variable2=20
variable3=30
variable4=40
variable5=50
variable6=60
variable7=70
variable8=80
variable9=90 |
Вы в АСМе загрузите значения из переменных в НУЖНЫЕ ВАМ регистры и будете с ними работать.
Код:
|
lds R1,variable1
lds R2,variable2
lds R3,variable3
lds R4,variable4
lds R5,variable5
lds R6,variable6
lds R7,variable7
lds R8,variable8
lds R16,variable9
lds R17,variable10
lds R18,variable11
lds R19,variable12
lds R20,variable13
//далее работаете в регистрах. Потом при необходимости выгружаете в пременные.
sts variable12,R19
sts variable13,R20 |
в файле ‹intrinsics.h› определены:
__delay_cycles(unsigned long); // Задержка в тактах. Аргумент только константа
__insert_opcode(); //вставтить код коанды
__no_operation(); //ассемблерный NOP
__swap_nibbles(unsigned char); //обмен тетрад
__watchdog_reset(); // сброс watchdog
__indirect_jump_to(unsigned long); //косвеный переход
__enable_interrupt(); // разрешить глобальное прерывание
__disable_interrupt(); // запретить глобальное прерывание
unsigned char __save_interrupt(void); //сохранить состояние глобальное прерывание
__restore_interrupt(unsigned char); //востановить глобальное прерывание
__sleep(); //спящий режим
unsigned int __multiply_unsigned(unsigned char, unsigned char);
signed int __multiply_signed(signed char, signed char);
signed int __multiply_signed_with_unsigned(signed char, unsigned char);
unsigned int __fractional_multiply_unsigned(unsigned char, unsigned char);
signed int __fractional_multiply_signed(signed char, signed char);
signed int __fractional_multiply_signed_with_unsigned(signed char, signed char);
__flash unsigned dimenshion[16] @0x00 = {0,1,2,3}; //обьявление масива в FLASH с адреса и инициализацией
__load_program_memory(const unsigned char __flash *); //
_SPM_PAGEWRITE(Addr); //запись FLASH страницы
_SPM_GET_LOCKBITS(); //чтение LOCKBITS
_SPM_GET_FUSEBITS(); //чтение FUSEBITS
__eeprom unsigned dimenshion[16] @0x00 = {0,1,2,3}; //обьявление масива в EPROM с адреса и инициализацией
__EEPUT(ADR,VAL); //запись EEPROM
__EEGET(VAR,ADR); //чтение EEPROM
//макросы для задержек, точная задержка при целом значении задающей частоты генератора в МГц (1, 2, 3, 4, ..., 10,
#define delay_us(temp)(__delay_cycles((temp * fclc)/1000000));/* макрос задержки на "temp" микросекунд
#define delay_ms(temp)(__delay_cycles((temp * fclc)/1000));/* макрос задержки на "temp" миллисекунд
#define delay_s(temp)(__delay_cycles(temp * fclc));/* макрос задержки на "temp" секунд