ARV писал(а):uchar писал(а):Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
зададимся вопросом: а зачем это надо?!
Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все было понятно.
Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил,
что результат чтения как и на асме тоже сохраняется в регистре R0.
Сейчас уже разобрался как читать из flash-памяти, поковырял файл pgmspace.h, есть там дефайн такой :
Код: Выделить всё
#define __LPM_classic__(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint8_t __result; \
__asm__ \
( \
"lpm" "\n\t" \
"mov %0, r0" "\n\t" \
: "=r" (__result) \
: "z" (__addr16) \
: "r0" \
); \
__result; \
}))
Не понимаю до конца как работает ассемблерная конструкция

Почему первой идет команда lpm - ведь сначала надо адрес записать в регистр Z?
У оператора mov ссылка %0 соответствует операнду "=r" - это понятно, а операнды "z" и "r0" чему соответствуют?