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

 
 
> С + ASM прерывание, простой вопрос
SasaVitebsk
сообщение May 21 2007, 12:38
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Касается IAR для AVR.
Как мне подключить ASM файл к проекту? Можно просто добавить его. Компилятор поймёт?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение May 21 2007, 18:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Спасибо за быстрый ответ. Хотелось бы ещё уточнений. Я перечитал документы и примеры приведённые на Atmel и в составе IAR и некоторые моменты всётаки не понял. Не бейте больно.

1) На сколько я понял соглашение о передаваемых параметрах (в смысле их привязки к регистрам) действует только на extern функции? Внутри одного файла сам компилятор может поступать как ему заблагорассудится?
2) В приведенных примерах написания функций на асме не видно чтобы сохранялись какие либо регистры. Компилятор что анализирует прогу асм на предмет использования регистров? Вроде бы так не должно быть, так как ассемблирование осуществляется после компиляции, а регистры должны быть определены до линковки? sad.gif Или, что более правдоподобно, определены регистры, которыми я могу пользоваться? Очень похоже, что это регистры R0-R3,R16-R23,R30,R31 вне зависимости от числа вызываемых параметров. Не пинайте пожалуйста, подтвердите или опровергните.

Да, здесь идёт речь не о прерывании, а о функции на ассемблере.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 21 2007, 18:58
Сообщение #3


Шаман
******

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



Цитата(SasaVitebsk @ May 21 2007, 21:45) *
Спасибо за быстрый ответ. Хотелось бы ещё уточнений. Я перечитал документы и примеры приведённые на Atmel и в составе IAR и некоторые моменты всётаки не понял. Не бейте больно.

1) На сколько я понял соглашение о передаваемых параметрах (в смысле их привязки к регистрам) действует только на extern функции? Внутри одного файла сам компилятор может поступать как ему заблагорассудится?
2) В приведенных примерах написания функций на асме не видно чтобы сохранялись какие либо регистры. Компилятор что анализирует прогу асм на предмет использования регистров? Вроде бы так не должно быть, так как ассемблирование осуществляется после компиляции, а регистры должны быть определены до линковки? sad.gif Или, что более правдоподобно, определены регистры, которыми я могу пользоваться? Очень похоже, что это регистры R0-R3,R16-R23,R30,R31 вне зависимости от числа вызываемых параметров. Не пинайте пожалуйста, подтвердите или опровергните.

Да, здесь идёт речь не о прерывании, а о функции на ассемблере.

1. И внутри одного файла компилятор следует указанному правилу.
2. Смотря какие регистры. Рабочие регистры (Вы их привели) не сохраняются, об этом заботится участок кода, вызывающий данную функцию. Остальные используемые регистры должны сохраняться в стеке данных. Параметры передаются через R16-R23, через пары X и Z(при вызове функций с аттрибутами __x_z) и через стек данных если регистров оказалось мало. Но если до этого уже дошло, то уж лучше на С писать.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 21 2007, 20:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(IgorKossak @ May 21 2007, 21:58) *
1. И внутри одного файла компилятор следует указанному правилу.
2. Смотря какие регистры. Рабочие регистры (Вы их привели) не сохраняются, об этом заботится участок кода, вызывающий данную функцию. Остальные используемые регистры должны сохраняться в стеке данных. Параметры передаются через R16-R23, через пары X и Z(при вызове функций с аттрибутами __x_z) и через стек данных если регистров оказалось мало. Но если до этого уже дошло, то уж лучше на С писать.


Простите что отрываю, но хотелось бы разобраться по лучше, так как к асму перешёл для повышения эффективности и было бы глупо вылизывать не разобравшись. sad.gif

По поводу п.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

Что я сделал неверно?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:04
Рейтинг@Mail.ru


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