ARV писал(а):много сил уходило на отслеживание того, какие регистры в каком порядке сохранялись и потом извлекались из стека... очень хотелось автоматизировать этот процесс.
Я же про то речь и веду, что если все тело функции на C будет состоять из одного оператора asm, то не только регистры автоматически будут сохранены, но и для нужд функции регистры можно выделить компилятором не задумываясь о том, какие из них использовать оптимальней.
Например:
Код: Выделить всё
static inline void st7735_spi_tft_read_cs_strobe(void)
{
uint8_t counter, status;
asm volatile ( "; \n\t \
ldi %[status],%[TX_Disable] \n\t \
sts %[UCSRnB_addr], %[status] \n\t \
sbi %[cs_port],%[cs_pin] \n\t \
ldi %[counter], %[delay] ;1 \n \
WAIT_LOOP%=: \n\t \
dec %[counter] ;1 \n\t \
brne WAIT_LOOP%= ;1/2 \n\t \
cbi %[cs_port],%[cs_pin] ;2 \n\t \
ldi %[status],%[TX_Enable] \n\t \
sts %[UCSRnB_addr], %[status] \n \
"
: [counter] "=d" (counter), [status] "=d" (status)
: [delay] "I" (_ST7735_SPI_RAMRD_DELAY_CYCLES_/3+1),
[UCSRnB_addr] "M" (_ST7735_SPI_UCSRnB_ADDRESS_),
[TX_Enable] "M" ((0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(0<<RXEN0)|(1<<TXEN0)),
[TX_Disable] "M" ((0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(0<<RXEN0)|(0<<TXEN0)),
[cs_port] "I" (PIN_TO_PORTn_OFFSET(ST7735_CHIPSELECT_PIN)),
[cs_pin] "I" (PIN_TO_PINn_BIT(ST7735_CHIPSELECT_PIN))
: "cc" );
}
