Перейти к содержанию
    

Асемблерный код в Си

Пишу свой первый проект для МК, учусь в процессе, осваиваю Си (CodeVisionAVR).

Столкнулся с проблемой, решения которой немогу найти ни в книгах ни в примерах.

Вот суть: пишу функцию для SPI (используется модуль USI в ATTyni26) на ассемблере, как передать параметры я разобрался а вот как вернуть результат этой функции никак ума не приложу. Вот код функции:

 

char spi_transfer(char data)

{

#asm

ld r16, y

out 0xf, r16

ldi r16, (1<<USIWM0)+(0<<USICS0)+(1<<USITC)

ldi r17, (1<<USIWM0)+(0<<USICS0)+(1<<USITC)+(1<<USICLK)

 

out 0xd, r16

out 0xd, r17

out 0xd, r16

out 0xd, r17

out 0xd, r16

out 0xd, r17

out 0xd, r16

out 0xd, r17

out 0xd, r16

out 0xd, r17

out 0xd, r16

out 0xd, r17

out 0xd, r16

out 0xd, r17

out 0xd, r16

out 0xd, r17

in r16, 0xf

#endasm

return;

}

 

Как нужно реализовать return ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как нужно реализовать return ?
Читать в хелпе - там точно было, сам читал года 2 назад. В самом крайнем случае посмотреть исходники библиотек из комплекта компилятора - там множество функций, возвращающих значение.

Вот только то, что вы привели нам в пример надо стараться писать на С. В противном случае вы связываете руки оптимизатору и получаете непортируемую на другие компиляторы программу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А библиотек для работы с SPI нет готовых ? Они уже оптимизированы должны быть.
Какая, нах, библиотека????? Три строки кода - и уже библиотека нужна?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

char spi_transfer(char data)

{

#asm

[skip]

#endasm

return;

}

 

Как нужно реализовать return ?

Функция, которую вы привели в примере написана не на ассемблере, а на С с ассемблерной вставкой. Ассемблерная функция пишется в отдельном файле по правилам для компилятора ассемблера. А у вас просто С функция, в которую вставили некоторое количество ассемблерных команд.

 

Доступ к локальным переменным из ассемблерной вставки у разных компиляторов выглядит по разному. Посмотрите help. Скорее всего пройдет нечто похожее на LD REG, LOCAL_VAR для загрузки регистра и LD LOCAL_VAR, REG для сохранения результата ассемблерной вставки в локальную переменную. Далее достаточно просто выполнить return LOCAL_VAR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу свой первый проект для МК, учусь в процессе, осваиваю Си (CodeVisionAVR).

Столкнулся с проблемой, решения которой немогу найти ни в книгах ни в примерах.

Вот суть: пишу функцию для SPI (используется модуль USI в ATTyni26) на ассемблере, как передать параметры я разобрался а вот как вернуть результат этой функции никак ума не приложу.

посмотрите пример инициализации ЖКИ в библиотеке поставляемой вместе с CodeVision.

там точно есть возврат параметра. и почитайте какие регистры использует компилятор и микшируйте

осторожно.

Изменено пользователем sKWO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Функция, которую вы привели в примере написана не на ассемблере, а на С с ассемблерной вставкой. Ассемблерная функция пишется в отдельном файле по правилам для компилятора ассемблера. А у вас просто С функция, в которую вставили некоторое количество ассемблерных команд.

 

Доступ к локальным переменным из ассемблерной вставки у разных компиляторов выглядит по разному. Посмотрите help. Скорее всего пройдет нечто похожее на LD REG, LOCAL_VAR для загрузки регистра и LD LOCAL_VAR, REG для сохранения результата ассемблерной вставки в локальную переменную. Далее достаточно просто выполнить return LOCAL_VAR.

 

 

Спасибо за разъяснения. Посмотрел внимательнее Help и нашёл

 

The functions return their values in the registers (from LSB to MSB):

R30 for char and unsigned char

R30, R31 for int and unsigned int

R30, R31, R22, R23 for long and unsigned long.

 

 

 

Ну вот эти 3 строки кода и вылезли в проблему...

 

Вы неправы, это не проблема, а временная трудность с которой рано или поздно пришлось бы столкнуться. А если постоянно использовать готовые библиотеки то никогда и не научишься правильно и грамотно писать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...