|
С + ASM прерывание, простой вопрос |
|
|
|
 |
Ответов
(1 - 7)
|
May 21 2007, 18:45
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Спасибо за быстрый ответ. Хотелось бы ещё уточнений. Я перечитал документы и примеры приведённые на Atmel и в составе IAR и некоторые моменты всётаки не понял. Не бейте больно. 1) На сколько я понял соглашение о передаваемых параметрах (в смысле их привязки к регистрам) действует только на extern функции? Внутри одного файла сам компилятор может поступать как ему заблагорассудится? 2) В приведенных примерах написания функций на асме не видно чтобы сохранялись какие либо регистры. Компилятор что анализирует прогу асм на предмет использования регистров? Вроде бы так не должно быть, так как ассемблирование осуществляется после компиляции, а регистры должны быть определены до линковки?  Или, что более правдоподобно, определены регистры, которыми я могу пользоваться? Очень похоже, что это регистры R0-R3,R16-R23,R30,R31 вне зависимости от числа вызываемых параметров. Не пинайте пожалуйста, подтвердите или опровергните. Да, здесь идёт речь не о прерывании, а о функции на ассемблере.
|
|
|
|
|
May 21 2007, 18:58
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(SasaVitebsk @ May 21 2007, 21:45)  Спасибо за быстрый ответ. Хотелось бы ещё уточнений. Я перечитал документы и примеры приведённые на Atmel и в составе IAR и некоторые моменты всётаки не понял. Не бейте больно. 1) На сколько я понял соглашение о передаваемых параметрах (в смысле их привязки к регистрам) действует только на extern функции? Внутри одного файла сам компилятор может поступать как ему заблагорассудится? 2) В приведенных примерах написания функций на асме не видно чтобы сохранялись какие либо регистры. Компилятор что анализирует прогу асм на предмет использования регистров? Вроде бы так не должно быть, так как ассемблирование осуществляется после компиляции, а регистры должны быть определены до линковки?  Или, что более правдоподобно, определены регистры, которыми я могу пользоваться? Очень похоже, что это регистры R0-R3,R16-R23,R30,R31 вне зависимости от числа вызываемых параметров. Не пинайте пожалуйста, подтвердите или опровергните. Да, здесь идёт речь не о прерывании, а о функции на ассемблере. 1. И внутри одного файла компилятор следует указанному правилу. 2. Смотря какие регистры. Рабочие регистры (Вы их привели) не сохраняются, об этом заботится участок кода, вызывающий данную функцию. Остальные используемые регистры должны сохраняться в стеке данных. Параметры передаются через R16-R23, через пары X и Z(при вызове функций с аттрибутами __x_z) и через стек данных если регистров оказалось мало. Но если до этого уже дошло, то уж лучше на С писать.
|
|
|
|
|
May 21 2007, 20:04
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(IgorKossak @ May 21 2007, 21:58)  1. И внутри одного файла компилятор следует указанному правилу. 2. Смотря какие регистры. Рабочие регистры (Вы их привели) не сохраняются, об этом заботится участок кода, вызывающий данную функцию. Остальные используемые регистры должны сохраняться в стеке данных. Параметры передаются через R16-R23, через пары X и Z(при вызове функций с аттрибутами __x_z) и через стек данных если регистров оказалось мало. Но если до этого уже дошло, то уж лучше на С писать. Простите что отрываю, но хотелось бы разобраться по лучше, так как к асму перешёл для повышения эффективности и было бы глупо вылизывать не разобравшись.  По поводу п.1. разобрался. Там почему-то приведено две таблицы размещения параметров и я в них подзапутался. Далее вопрос, возникший в связи с Вашим ответом 2. Значит ли это, что чем больше регистров я использую, тем больше их сохраняется или это означает, что сохраняются все перечисленные регистры вне зависимости от использования? И последний мелкий вопрос. На Си объявлен след. массив: uint8_t static Ekr[2][SIZE_EKR]; На асме я его объявляю как EXTERN SizeXb, Ekr, NEkr И пытаюсь использовать типа Код add R30,LOW(Ekr) // Сместить от начала экранной области adc R31,HIGH(Ekr) Возникает ошибка Error[43]: Illegal effective address D:\work\AVR IAR C\Panno\driv_graf.asm 49 Что я сделал неверно?
|
|
|
|
|
May 21 2007, 21:28
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(SasaVitebsk @ May 21 2007, 23:04)  ...к асму перешёл для повышения эффективности ... Спорное поползновение. Цитата(SasaVitebsk @ May 21 2007, 23:04)  Далее вопрос, возникший в связи с Вашим ответом 2. Значит ли это, что чем больше регистров я использую, тем больше их сохраняется или это означает, что сохраняются все перечисленные регистры вне зависимости от использования? Сохранять следует только то, что используется. Но чем больше используется, тем легче запутаться, а ошибку ассемблер не покажет, т. к. ему всё равно. Цитата(SasaVitebsk @ May 21 2007, 23:04)  Error[43]: Illegal effective address D:\work\AVR IAR C\Panno\driv_graf.asm 49 Ошибка в строке 49. По моему вместо HIGH(Ekr) рекомендуется писать Ekr>>8 или что-то в этом роде. в одном из мануалов об этом писалось.
|
|
|
|
|
May 21 2007, 22:55
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(IgorKossak @ May 22 2007, 00:28)  Спорное поползновение.
Сохранять следует только то, что используется. Но чем больше используется, тем легче запутаться, а ошибку ассемблер не покажет, т. к. ему всё равно.
Ошибка в строке 49. По моему вместо HIGH(Ekr) рекомендуется писать Ekr>>8 или что-то в этом роде. в одном из мануалов об этом писалось. Спасибо во всём разобрался. Вместо add r,LOW(xxx) надо было конечно использовать subi r,low(-xxx), а иначе никак.  Называется "давно не брал я в руки шашек". Подразучился ассемблить.  А вылизывать данный кусок - можно. Это вывод точки. За кадр может вызываться пару тысяч раз. И от её эффективности напрямую зависит загруженность проца. Почему то Си не совсем так генерит, как я хочу. Ну например я пишу ему: Код maska =3; if((X & (1<<1))!=0) { __swap_nibbles(maska); __swap_nibbles(Color); } Так он вообще выкидывает эту конструцию. Пришлось написать следующее. Код maska =3; if((X & (1<<1))!=0) { maska = 0x30; Color <<= 4; } Ну и так далее. Но в общем переписыванием добился почти двухкратной оптимизации. Хотелось бы конечно попробовать так прогу написать, чтобы сразу несколько точек обрабатывалось, но тут сравнения пойдут и программа будет совсем нелинейная. Не красивая. С другой стороны сейчас у меня в байте 4 точки (по два бита), а если перейти на ARM, то там выигрыш от такого алгоритма будет очень существенный. Надо покумекать. Спасибо всем.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|