Написал макросы для работы со стеком...
Но я не являюсь спецом по ASM в AVRGCC.
Прошу великих Гуру окинуть сие творчество на передмет косяков...
И вообще, можно-ли в GCC использовать стек в таком ключе или есть нюансы?
Код
// ============================================================================
#define __avr_stack_pop() \
(__extension__({ \
uint8_t __result; \
__asm__ __volatile__ \
( \
"pop %0" "\n\t" \
: "=r" (__result) \
: \
); \
__result; \
}))
// ============================================================================
#define __avr_stack_push(value) \
(__extension__({ \
uint8_t __value = (uint8_t)value; \
__asm__ __volatile__ \
( \
"push %0" "\n\t" \
: \
: "r" (__value) \
); \
}))
Тест:
Код
#define stack_push __avr_stack_push
#define stack_pop __avr_stack_pop
unsigned char i = 0;
do
{
stack_push(i);
i = stack_pop();
} while (++i<5);
Выход:
Код
cabe: 80 e0 ldi r24, 0x00; 0
cac0: 8f 93 push r24
cac2: 8f 91 pop r24
cac4: 8f 5f subi r24, 0xFF; 255
cac6: 85 30 cpi r24, 0x05; 5
cac8: d8 f3 brcs .-10 ; 0xcac0 <main+0x2>