"asm" в WinAVR

Модератор: Модераторы разделов

Serg79
Сообщения: 153

"asm" в WinAVR

Сообщение Serg79 »

Требуется написать макрос для загрузки 16-битного значения в регистры r26:r27.
Для 8-битного, проблем нет. Делаю так:

Код: Выделить всё

#define load_val(val)         \
    {                           \
        __asm__ __volatile__    \
        (                       \
            "ldi r26,%0 \n\t"   \
            : "M" (val)         \
        );                      \
    }


Думал, что для 16 такое прокатит:

Код: Выделить всё

#define load_val(val)         \
    {                           \
        __asm__ __volatile__    \
        (                       \
            "ldi r26,%A0 \n\t"  \
            "ldi r27,%B0 \n\t"  \
            : "M" (val)         \
        );                      \
    }

оказалось ошибаюсь.

Кто знает, подскажите как быть, а то уже крыша начинает съезжать. :blink:
Спасибо сказали:
Kirill Frolov
Сообщения: 6
ОС: Debian

Re: "asm" в WinAVR

Сообщение Kirill Frolov »

Serg79 писал(а):
22.09.2006 15:58
Требуется написать макрос для загрузки 16-битного значения в регистры r26:r27.
Для 8-битного, проблем нет. Делаю так:
__asm__ __volatile__ \
( \
"ldi r26,%A0 \n\t" \
"ldi r27,%B0 \n\t" \
: "M" (val) \


Очень это на *WIN*-чтоугодно похоже...

Если проект чисто-ассемблерный -- выкинуть нафиг GCC и использовать AVRA.

Eсли проект смешанный C/ассемблер -- реализовывать подобное средствами языка C.
Спасибо сказали:
Serg79
Сообщения: 153

Re: "asm" в WinAVR

Сообщение Serg79 »

Проблему решил следующим способом:

Код: Выделить всё

#define load_val(val)                              \
    {                                              \
        __asm__ __volatile__                       \
        (                                          \
            "ldi r26,%0 \n\t"                      \
            "ldi r27,%1 \n\t"                      \
            :: "M" ((uint8_t)((uint16_t)(val))),   \
               "M" ((uint8_t)((uint16_t)(val)>>8)) \
        );                                         \
    }

Теперь такое работает без проблем:

Код: Выделить всё

load_val(0x2345);
Спасибо сказали: