|
Пытаюсь освоить ASM вставку |
|
|
|
Dec 2 2008, 13:59
|

Местный
  
Группа: Участник
Сообщений: 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
--------------------
|
|
|
|
|
 |
Ответов
|
Dec 2 2008, 14:19
|
Гуру
     
Группа: Свой
Сообщений: 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) у описания функции
|
|
|
|
|
Dec 2 2008, 14:28
|

Местный
  
Группа: Участник
Сообщений: 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, } после драйвер на си занимается их передачей во внешний мир.
--------------------
|
|
|
|
|
Dec 2 2008, 14:37
|
Знающий
   
Группа: Свой
Сообщений: 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, ссылки приводил.
|
|
|
|
|
Dec 2 2008, 14:50
|

Местный
  
Группа: Участник
Сообщений: 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 байт? как обратиться к переменной? А функцию мне надо без параметров и возвращаемых величин. просто запустить на исполнение амс код.
--------------------
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|