реклама на сайте
подробности

 
 
> Как прочитать регистр из прогаммы на С, Максимально просто
b-volkov
сообщение Dec 9 2011, 12:35
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 137
Регистрация: 10-04-07
Из: г. Троицк
Пользователь №: 26 907



Надо переписать значение R14 в некую глобальную переменную. Можно это сделать строкой онлайн-ассемблера и какой? В ассемблере не силен, прпробовал поподбирать сам - не вышло.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vvppvv
сообщение Mar 9 2012, 06:22
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 3-07-05
Пользователь №: 6 485



Цитата(b-volkov @ Dec 9 2011, 16:35) *
Надо переписать значение R14 в некую глобальную переменную. Можно это сделать строкой онлайн-ассемблера и какой? В ассемблере не силен, прпробовал поподбирать сам - не вышло.


Сделать функцию, например:
Код
#pragma inline = forced
char cGetReg_R8 (void) {asm("mov  r16, r8");}


Использовать как обычно, например, вывести R8 в порт А:

Код
    212            PORTA = cGetReg_R8();
   \   00000000   2D08               mov  r16, r8
   \   00000002   BB0B               OUT     0x1B, R16


Просто и лаконично. Хотя компилятор вполне обоснованно ругается, что в функции отсутствует Return :-))

Если нужен именно 14 регистр, то заменить в функции R8 на R14 wink.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 19 2012, 20:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



vvppvv

Попробовал по вышесказанному:
Код
volatile unsigned short SavedR2021;
#pragma inline = forced
unsigned short cGetReg_R2021(void) {
    asm("mov  r16, r20");
    asm("mov  r17, r21");
}
#pragma inline = forced
void cSetR2021(unsigned short new_value) {
    asm("mov  r20, r16");
    asm("mov  r21, r17");
}
int main()
{
    SavedR2021=cGetReg_R2021();
    PORTA^=0x11;
    PORTE=0x23;
    cSetR2021(SavedR2021+0xA5);
    PORTA^=0x11;
    TCCR0=5;
    TIMSK|=(1<<TOIE0);
    PORTE=0x23;
    cSetR2021(SavedR2021);
    .....


В SavedR2021 значение считывается, но строка
Код
cSetR2021(SavedR2021+0xA5);

не выполнилась (не увидел в дизассемблере ожидаемого значения).

То есть метод частично нерабочий?
Или где-то ошибка?

Сообщение отредактировал IgorKossak - Mar 20 2012, 14:22
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 20 2012, 07:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(_Артём_ @ Mar 20 2012, 00:55) *
То есть метод частично нерабочий?
Или где-то ошибка?

Если уж дурить транслятор/оптимизатор, то - с умом:
Код
void cSetR2021(volatile unsigned short new_value) {
    asm("mov  r20, r16");
    asm("mov  r21, r17");
}

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 20 2012, 09:41
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Палыч

Другое дело.

Цитата(Палыч @ Mar 20 2012, 09:14) *
Если уж дурить транслятор/оптимизатор, то - с умом:

Дурить - так с volatile.

Спасибо, Палыч.
Помогло.

Сообщение отредактировал IgorKossak - Mar 20 2012, 14:23
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 20 2012, 14:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Помогло но не совсем:

Код
#pragma inline = forced
inline unsigned short cGetR2829(void) {
    asm("mov  r16, r28");
    asm("mov  r17, r29");
}
#pragma inline = forced
inline void cSetR2829(volatile unsigned short new_value) {
    asm("mov  r28, r16");
    asm("mov  r29, r17");
}


// Disassm.
42:           SavedR2021=cGetR2829();
+00000069:   2F0C        MOV       R16,R28        Copy register
+0000006A:   2F1D        MOV       R17,R29        Copy register
+0000006B:   932D        ST        X+,R18         Store indirect and postincrement
+0000006C:   933C        ST        X,R19          Store indirect
+0000006D:   9711        SBIW      R26,0x01       Subtract immediate from word
43:           cSetR2829(SavedR2021-0x20);
+0000006E:   918D        LD        R24,X+         Load indirect and postincrement
+0000006F:   919C        LD        R25,X          Load indirect
+00000070:   9711        SBIW      R26,0x01       Subtract immediate from word
+00000071:   9780        SBIW      R24,0x20       Subtract immediate from word
+00000072:   8388        STD       Y+0,R24        Store indirect with displacement
+00000073:   8399        STD       Y+1,R25        Store indirect with displacement
+00000074:   2FC0        MOV       R28,R16        Copy register
+00000075:   2FD1        MOV       R29,R17        Copy register


Там работает, а тут нет.
Почему?

Сообщение отредактировал IgorKossak - Mar 20 2012, 14:23
Причина редактирования: Бездумное самоцитирование
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 20 2012, 15:29
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(_Артём_ @ Mar 20 2012, 18:21) *
Там работает, а тут нет.
Почему?

"Ну, Вы, блин, даёте..." (С)

Не работает потому, что Вы своими "извратами" совсем голову задурили транслятору/оптимизатору. Что Вы хотите получить? Полный контроль над регистрами? Пишите на чистом ассемблере - не дурите голову себе и транслятору Си. В отдельных случаях, возможно, и стоить применять такие конструкции (а, стоит ли?), но нужно хорошо представлять: как транслятор "строит" исполняемый код. Некоторые регистры (R28:R29 или регистр Y в частности) транслятор использует для своих нужд, и использование программистом этих регистров "левым" образом приводит к "интересным эффектам"...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 20 2012, 17:06
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Палыч @ Mar 20 2012, 17:29) *
"Ну, Вы, блин, даёте..." (С)

А я чо, я - ничо. Оно само...


Цитата(Палыч @ Mar 20 2012, 17:29) *
Не работает потому, что Вы своими "извратами" совсем голову задурили транслятору/оптимизатору. .


Ну прямо вас послушаешь - руки ему заламываю.
Просто ведь говорю транслятору: дай регистр, установи регистр. А он мне - тут работаю, здесь не работаю.

Цитата(Палыч @ Mar 20 2012, 17:29) *
Что Вы хотите получить? Полный контроль над регистрами?

Нет, блин, неограниченную власть над миром.
Но чот не выходит.

Цитата(Палыч @ Mar 20 2012, 17:29) *
Пишите на чистом ассемблере

Всегда на асме? Не дай бог.

Цитата(Палыч @ Mar 20 2012, 17:29) *
В отдельных случаях, возможно, и стоить применять такие конструкции (а, стоит ли?),

Так я хочу в отдельных случаях...
Хотя может и не стоит (мне уже про это говорили тут).

Цитата(Палыч @ Mar 20 2012, 17:29) *
Некоторые регистры (R28:R29 или регистр Y в частности) транслятор использует для своих нужд

Ну я тоже хочу его иногда поюзать.

Цитата(Палыч @ Mar 20 2012, 17:29) *
и использование программистом этих регистров "левым" образом приводит к "интересным эффектам"...

Видимо такой эффект и наблюдается.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- b-volkov   Как прочитать регистр из прогаммы на С   Dec 9 2011, 12:35
- - Палыч   Примерно так: Кодchar X; ......... asm("ST...   Dec 9 2011, 17:20
- - KRS   Цитата(b-volkov @ Dec 9 2011, 16:35)...   Dec 13 2011, 21:29
- - usav   b-volkov: Надо переписать значение R14 -----------...   Dec 14 2011, 17:24
- - Палыч   Цитата(_Артём_ @ Mar 20 2012, 21:06) Ну п...   Mar 21 2012, 06:23
- - _Артём_   Цитата(Палыч @ Mar 21 2012, 08:23) Вы дол...   Mar 21 2012, 13:28
- - Сергей Борщ   QUOTE (_Артём_ @ Mar 21 2012, 15:28) Но и...   Mar 21 2012, 15:03
- - _Артём_   Цитата(Сергей Борщ @ Mar 21 2012, 17:03) ...   Mar 21 2012, 17:23
- - KRS   Цитата(Сергей Борщ @ Mar 21 2012, 19:03) ...   Mar 21 2012, 17:42
- - _Артём_   Цитата(KRS @ Mar 21 2012, 19:42) в послед...   Mar 21 2012, 18:07
- - KRS   Цитата(_Артём_ @ Mar 21 2012, 22:07) В 6-...   Mar 22 2012, 11:50


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 15:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016