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

 
 
> Пытаюсь освоить ASM вставку
QuickWitted
сообщение Dec 2 2008, 13:59
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Я основной разработчик и концептор сайта http://www.swordgreenline.narod.ru/
До этого я разрабатывал некоммерческий софт для нашего сайта на асме.

По просьбам пользователей сейчас пробую прикрутить коммуникационный драйвер на СИ.
Т.е.
1 есть рабочий драйвер на СИ
2 есть отлаженная программа на асме
и я хочу объединить их.

на СИ всё переписать нереально - элементарно не влезет...

пишу под ATMega8

с вопросом сборки проекта на си я разобрался...
поставил avr-gcc. Пакет avr-gcc на платформе Windows входит в состав пакета WinAVR.
собираю через Makefile и получаю рабочий хэкс.

Теперь подходим к вопросу как делать вставки на асме в программу СИ

мне нужен массив.
как я понял на СИ массив и переменная его заполненности объявляются так:

#define My_BUFLEN 254
static unsigned short My_buf[My_BUFLEN];
static uchar My_head = 0;

теперь вопрос
1) как правильно объявить асм вставку?
2) из асма обратиться к массиву?
3) можно ли создать процедуру на асме вызываемую с СИ?

на Си в коде есть ещё одна структура

static uchar Buffinput[6] = { 1, 0,0,0,0,0, }

как обратиться к ней на асме?

Как на си объявить обработчик прерывания по переполнению таймера
на асме это выглядит так

.org OVF0addr ; Overflow0 Interrupt Vector adres
rjmp OVF0handler ; Прерывание по переполнению

ниже
OVF0handler:
действие
reti

Сообщение отредактировал QuickWitted - Dec 2 2008, 14:36


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
XVR
сообщение Dec 2 2008, 14:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(QuickWitted @ Dec 2 2008, 16:59) *
Теперь подходим к вопросу как делать вставки на асме в программу СИ

мне нужен массив.
Нет, нужен кусок кода. Массив - это данные.
Цитата
теперь вопрос
1) как правильно объявить асм вставку?
Вставить асм команду в С программу - asm("...")

Цитата
2) из асма обратиться к массиву?
3) можно ли создать процедуру на асме вызываемую с СИ?
Так, тут надо уточнить детали - кусок программы на asm используется как 'черный ящик' (в виде готового hex), или же он компилируется вместе с программой на С ? Если первое, то все взаимодействие придется проводить на уровне голых адресов (т.е. никаких массивов в С), если второе, то можно состыковать и массивы и процедуры, причем в обе стороны.


Цитата
Как на си объявить обработчик прерывания по переполнению таймера
на асме это выглядит так

.org OVF0addr ; Overflow0 Interrupt Vector adres
rjmp OVF0handler ; Прерывание по переполнению
Смотри доки к winavr, какое то ключевое слово (типа __attribute__((interrupt)) или соотвествующий define) у описания функции
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Dec 2 2008, 14:28
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(XVR @ Dec 2 2008, 19:19) *
Вставить асм команду в С программу - asm("...")


Мне не команду а кусок обработчика
моей математики...

Цитата(XVR @ Dec 2 2008, 19:19) *
Так, тут надо уточнить детали - кусок программы на asm используется как 'черный ящик' (в виде готового hex), или же он компилируется вместе с программой на С ?


в виде файла асм, который я написал и отладил.
обработчик прерывания, который заполняет массив данными
их пережёвывает, получает хэш, сравнивает по табличке и выдаёт результат в
static uchar Buffinput[6] = { 1, 0,0,0,0,0, }

после драйвер на си занимается их передачей во внешний мир.


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
msalov
сообщение Dec 2 2008, 14:37
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(QuickWitted @ Dec 2 2008, 16:28) *
Мне не команду а кусок обработчика
моей математики...
в виде файла асм, который я написал и отладил.
обработчик прерывания, который заполняет массив данными
их пережёвывает, получает хэш, сравнивает по табличке и выдаёт результат в
static uchar Buffinput[6] = { 1, 0,0,0,0,0, }

после драйвер на си занимается их передачей во внешний мир.

Для того что бы можно было вызвать асм-функцию из с-функции, асм-функция должна соответствовать соглашению о используемых регистрах, которое называется ABI, ссылку приводил. Если же хотите в с-фунцию вставить асм код - читайте про формат inline assembly для gcc, ссылки приводил.
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Dec 2 2008, 14:50
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(gotty @ Dec 2 2008, 19:37) *
Для того что бы можно было вызвать асм-функцию из с-функции, асм-функция должна соответствовать соглашению о используемых регистрах


Брр...
Ты помоему про комповый СИ, а я про WinAVR
и никаких особых соглашений я в примере не видел....

Рабочий пример
/* Register assignments for usbMeasureFrameLength on gcc */
/* Calling conventions on gcc:
* First parameter passed in r24/r25, second in r22/23 and so on.
* Callee must preserve r1-r17, r28/r29
* Result is passed in r24/r25
*/
# define resL r24
# define resH r25
# define cnt16L r24
# define cnt16H r25
# define cntH r26
#endif
# define cnt16 cnt16L

; extern unsigned usbMeasurePacketLength(void);
; returns time between two idle strobes in multiples of 7 CPU clocks
.global usbMeasureFrameLength
usbMeasureFrameLength:
ldi cntH, 6 ; wait ~ 10 ms for D- == 0
clr cnt16L
clr cnt16H
usbMFTime16:
dec cntH
breq usbMFTimeout
usbMFWaitStrobe: ; first wait for D- == 0 (idle strobe)
sbiw cnt16, 1 ;[0] [6]
breq usbMFTime16 ;[2]
sbic USBIN, USBMINUS ;[3]
rjmp usbMFWaitStrobe ;[4]
usbMFWaitIdle: ; then wait until idle again
sbis USBIN, USBMINUS ;1 wait for D- == 1
rjmp usbMFWaitIdle ;2
ldi cnt16L, 1 ;1 represents cycles so far
clr cnt16H ;1
usbMFWaitLoop:
in cntH, USBIN ;[0] [7]
adiw cnt16, 1 ;[1]
breq usbMFTimeout ;[3]
andi cntH, USBMASK ;[4]
brne usbMFWaitLoop ;[5]
usbMFTimeout:
#if resL != cnt16L
mov resL, cnt16L
mov resH, cnt16H
#endif
ret

#undef resL
#undef resH
#undef cnt16
#undef cnt16L
#undef cnt16H
#undef cntH

#endif /* USB_CFG_HAVE_MEASURE_FRAME_LENGTH */


Регистров из примера мне хватит...

вопрос
как обратиться к элементу массива?
как обратиться к элементу структуры из 6 байт?
как обратиться к переменной?

А функцию мне надо без параметров и возвращаемых величин.
просто запустить на исполнение амс код.


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 2 2008, 18:37
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(QuickWitted @ Dec 2 2008, 17:50) *
вопрос
как обратиться к элементу массива?
как обратиться к элементу структуры из 6 байт?
как обратиться к переменной?
Массив, равно как и переменная, равно как и структура из 6ти байт - суть метки в сегменте данных (+ зарезервированное место, но это не существенно). Посмотри ассемблер после компилятора (ключ -s) и найди, как выглядят эти метки (скорее всего это будут имена переменных с подчеркиванием вначале). У себя в асм опиши их как .globl <name> и используй



упс, _Pasha опередил
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- QuickWitted   Пытаюсь освоить ASM вставку   Dec 2 2008, 13:59
- - gotty   http://www.ibiblio.org/gferg/ldp/GCC-Inlin...mbly-...   Dec 2 2008, 14:15
|- - QuickWitted   Цитата(gotty @ Dec 2 2008, 19:15) А ещё п...   Dec 2 2008, 14:38
|- - gotty   Цитата(QuickWitted @ Dec 2 2008, 16:38) И...   Dec 2 2008, 14:40
- - gotty   Цитата(QuickWitted @ Dec 2 2008, 16:44) Б...   Dec 2 2008, 14:54
|- - QuickWitted   Цитата(gotty @ Dec 2 2008, 19:54) Разве? ...   Dec 2 2008, 15:01
|- - gotty   Цитата(QuickWitted @ Dec 2 2008, 17:01) Е...   Dec 2 2008, 15:06
|- - zltigo   Цитата(gotty @ Dec 2 2008, 18:06) Да и ес...   Dec 2 2008, 17:50
|- - QuickWitted   Цитата(zltigo @ Dec 2 2008, 22:50) А заче...   Dec 2 2008, 17:58
|- - _Pasha   Цитата(QuickWitted @ Dec 2 2008, 21:58) г...   Dec 2 2008, 18:29
|- - zltigo   Цитата(_Pasha @ Dec 2 2008, 21:29) и vola...   Dec 2 2008, 19:41
|- - Огурцов   Неа, Об авторе.   Dec 2 2008, 20:11
|- - QuickWitted   Ну и финальный вопрос как в си указать куда компи...   Dec 3 2008, 16:18
|- - Сергей Борщ   Цитата(QuickWitted @ Dec 3 2008, 18:18) в...   Dec 3 2008, 16:48
|- - QuickWitted   Прочитал предложенную документацию, но понимания н...   Dec 4 2008, 06:07
|- - zltigo   Цитата(QuickWitted @ Dec 4 2008, 09:07) ....   Dec 4 2008, 06:32
||- - QuickWitted   Цитата(zltigo @ Dec 4 2008, 11:32) Понима...   Dec 4 2008, 07:50
||- - 777777   Цитата(QuickWitted @ Dec 4 2008, 10:33) И...   Dec 4 2008, 07:55
|||- - QuickWitted   Цитата(777777 @ Dec 4 2008, 12:55) Как те...   Dec 4 2008, 09:40
|||- - 777777   Цитата(QuickWitted @ Dec 4 2008, 12:40) Т...   Dec 4 2008, 10:23
|||- - QuickWitted   Цитата(777777 @ Dec 4 2008, 15:23) Извини...   Dec 4 2008, 10:38
|||- - _Pasha   Цитата(QuickWitted @ Dec 4 2008, 14:38) Д...   Dec 4 2008, 10:52
|||- - QuickWitted   Цитата(_Pasha @ Dec 4 2008, 15:52) Понял,...   Dec 4 2008, 13:58
|||- - XVR   Цитата(QuickWitted @ Dec 4 2008, 16:58) а...   Dec 4 2008, 18:10
|||- - QuickWitted   Цитата(XVR @ Dec 4 2008, 23:10) Да уж, уз...   Dec 5 2008, 02:18
|||- - XVR   Цитата(QuickWitted @ Dec 5 2008, 05:18) Л...   Dec 5 2008, 09:31
|||- - QuickWitted   Цитата(XVR @ Dec 5 2008, 14:31) У пользов...   Dec 5 2008, 11:24
|||- - defunct   Цитата(QuickWitted @ Dec 5 2008, 13:24) Б...   Dec 7 2008, 04:28
|||- - QuickWitted   Цитата(defunct @ Dec 7 2008, 09:28) даже ...   Dec 7 2008, 11:45
|||- - defunct   Цитата(QuickWitted @ Dec 7 2008, 13:45) 1...   Dec 7 2008, 21:12
|||- - QuickWitted   Цитата(defunct @ Dec 8 2008, 02:12) 1 - E...   Dec 8 2008, 10:11
||- - Сергей Борщ   Цитата(QuickWitted @ Dec 4 2008, 09:50) е...   Dec 4 2008, 10:24
|- - _Pasha   Цитата(QuickWitted @ Dec 4 2008, 10:07) Т...   Dec 4 2008, 08:36


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

 


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


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