В предложенных макросах есть неточности, хотя они и работоспособны. Вы не указываете, что r26:r27 являются "запорченными" (clobbers). Потенциально это может привести к глюкам программы. Но вот зачем Вам такой способ использования регистровой пары? Как вы ее дальше собираетесь использовать? Можно подойти к проблеме по другому. В gcc есть отличный способ привязать регистр к переменной, например, так:
Код
#include <stdint.h>
int16_t main ( void )
{
register uint16_t xreg asm ("r26");
xreg = 0x1234;
*(uint8_t *)xreg = 0x11;
xreg = 0x2345;
*(uint8_t *)xreg = 0x22;
xreg = 0x3456;
*(uint8_t *)xreg = 0x33;
return *(int16_t *)xreg;
}
Такое использование не сбивает оптимизатор.
Код
5: register uint16_t xreg asm ("r26");
6:
7: xreg = 0x1234;
8: *(uint8_t *)xreg = 0x11;
\ 0008 81E1 ldi r24,lo8(17)
\ 000a 8093 3412 sts 4660,r24
9: xreg = 0x2345;
10: *(uint8_t *)xreg = 0x22;
\ 000e 82E2 ldi r24,lo8(34)
\ 0010 8093 4523 sts 9029,r24
11: xreg = 0x3456;
\ 0014 A6E5 ldi r26,lo8(13398)
\ 0016 B4E3 ldi r27,hi8(13398)
12: *(uint8_t *)xreg = 0x33;
\ 0018 83E3 ldi r24,lo8(51)
\ 001a 8C93 st X,r24
13:
14: return *(int16_t *)xreg;
15: }
\ 001c 8D91 ld r24,X+
\ 001e 9C91 ld r25,X
С уважением.