Вставка ассемблерного кода

Крущь
Offline
Зарегистрирован: 26.05.2017

Прокомментируйте пожалуйста эквивалентность кода на С (первые два оператора присваивания) и  на ассемблере.

Загружаем из двух 8-битных  регистров в 16-битную переменную. В ассемблере не вижу сдвига на 8, да и вообще форму записи со спецсимволами % и обратными наклонными чертами пока еще не понимаю. Последняя строчка отдаленно похожа на тернарную форму, но тоже мимо моего понимания.

И наконец, почему asm вставка объявлена volatile, она что может модифицироваться по ходу дела ?

static uint16_t out21;
//  out21 = ADCL;
// out21 |= ADCH << 8;
asm volatile(
             "lds %A0,  %1\n\t"
             "lds %B0,  %2"
            : "=w" (out21): "n"(&ADCL), "n"(&ADCH));

 

Logik
Offline
Зарегистрирован: 05.08.2014

16-и битная переменная - это два 8-битных регистра, вот мы и видим две загрузки по 8 бит. Потому сдвига нет. объявлена volatile для подавления возможности оптимизации. Чтоб компилятор не выкинул не первую загрузку решив out21 что это действие уже раз выполнено и нет смысла его повторять.

Крущь
Offline
Зарегистрирован: 26.05.2017

Logik пишет:
16-и битная переменная - это два 8-битных регистра, вот мы и видим две загрузки по 8 бит. Потому сдвига нет. объявлена volatile для подавления возможности оптимизации. Чтоб компилятор не выкинул не первую загрузку решив out21 что это действие уже раз выполнено и нет смысла его повторять

Приведенные Си код и ассемблемрный полностью эквивалентны?

Объявлена volatile  процедура, т.е. код программы ?

Где прочесть описание asm вставок с непонятными символами %\n\t    "=w"  ?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Крущь пишет:

Приведенные Си код и ассемблемрный полностью эквивалентны?

В принципе да. Только с пунктуацией косячки.

 

Крущь пишет:

Где прочесть описание asm вставок с непонятными символами %\n\t    "=w"  ?

Гугль не говорит ? :) Можно тут почитать например.

Крущь
Offline
Зарегистрирован: 26.05.2017

dimax пишет:
В принципе да. Только с пунктуацией косячки.
В чем косяки и как выглядит без косяков?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Крущь, в приведённой ссылке пунктуация описана + дана куча примеров, прочтите внимательно и увидите.

Крущь
Offline
Зарегистрирован: 26.05.2017

Прочту, я не лентяй. Но сходу выявить косяки не могу. Подскажите пожалуйста.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Внимательность для программиста архиважное качество. 

Ваш пример

asm volatile(
"lds %A0,  %1\n\t"
"lds %B0,  %2"
: "=w" (out21): "n"(&ADCL), "n"(&ADCH)
);

И аналогичный пример из статьи.

asm volatile (
"in %A0,%1" "\n\t"
"in %B0,(%1) + 1": "=r" (result): "I" (_SFR_IO_ADDR(port))
);

Всё таки попробуйте сказать, что у вас не так?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Крущь пишет:

Где прочесть описание asm вставок с непонятными символами %\n\t    "=w"  ?

Вот Вы пользуетесь вариантом avr-gcc для MCU компании Atmel, так? И задаёте такие вопросы. Тогда Вам встречный вопрос: чем Вас не устравивает руководство на сайте производителя - компании Atmel? Или Вы туда даже не смотрели?

Ребята, я понимаю, что типа там новички и т.п., но запомните Вы наконец волшебную формулу - RTFM. Иначе будете постоянно слышать другую - GTFO!