На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> включение ассемблерных вставок , '__asm' not supported on this architecture
    Приветствую
    Пишу под XScale архитекстуру (ARM)
    Visual Studio .NET 2005

    Нужно сделать вставку на ассемблере, но компилятор ругнулся

    Цитата
    error C4235: nonstandard extension used : '__asm' keyword not supported on this architecture


    MSDN выдал:

    Цитата
    For example, the _asm keyword is not supported for the Itanium Processor Family (IPF) compiler. All assembly code must be written in a separate file or should be used through an intrinsic. See Intrinsics Available on Intel 64-bit Platforms for more information.


    использовать встроенные функции мне кажется негибко (не могу манипулировать с регистрами)
    скажите как тогда надо вставлять код ф отдельный файл и как потом его вызывать!
      Напиши маленький тестовый проектик, заставь VS выдать по нему ассемблерный код и посмотри, что там и как.

      В C-ном исходнике тебе понадобится прототип функции. Вызывать - так же, как и любую другую функцию.
        а если мой код ассемблерный на функцию не тянет - я хотел некоторые вычисления внутри функции на нем сделать
        и еще - как это выглядит то? Т.е. какой-нить code.asm я присоединяю к проекту, а дальше что? Как-то его подгрузить надо и внутрб функции пихнуть
          Цитата Fireman @
          а дальше что?
          Компилируешь проект и получаешь исполнимый файл.

          Цитата Fireman @
          внутрб функции пихнуть
          Внутрь функции не пихнешь. Это будет самостоятельная функция, написанная на ассемблере.
            дело в том что у меня это в классе происходит, ну по идее я могу в функцию передать некоторые указатели на данные, но все же
            потом - все же как это делается - просто code.asm в проект добавить, в .cpp вызвать #include "code.asm" и потом вызвать функцию?
            ты мог бы маленький примерчик привести

            и еще - если пользоваться интристик функциями - смогу ли я манипулировать регистрами?
              Делаешь что-то.asm, где пишешь реализацию функции, подключаешь в проект
              Делаешь что-то.h, пишешь там прототип функции
              В исходнике(C/C++) пишешь #include "что-то.h" и затем используешь функцию
              Сообщение отредактировано: trainer -
                Так вот про реализацию
                например мне нужна функция int min_func(int a, int b)

                ExpandedWrap disabled
                  mov         r12, sp
                  stmdb       sp!, {r0, r1}
                  stmdb       sp!, {r12, lr}
                  sub         sp, sp, #4
                   
                  // тут код
                   
                  ldr         r0, [sp]
                  add         sp, sp, #4
                  ldmia       sp, {sp, pc}


                надо ведь дописать как функция называется и т.п.
                  Цитата Fireman @
                  надо ведь дописать как функция называется и т.п.
                  Ну да. Напиши ее на C, сконвертируй с помощью компилятора в ассемблер и получишь все необходимое. Полное декорированное имя функции, код входа в функцию и выходя из нее. Потом подменяешь тело и используешь(удалив реализацию на C). А заодно посмотришь, стоит ли овчинка выделки? :)

                  Кстати, есть Intel C++ для XScale под WinCE.
                  Сообщение отредактировано: trainer -
                    Ну я чуть другое имел в виду
                    Вот раздобыл примерчик один (который я упростил до ужаса)

                    ExpandedWrap disabled
                      .386
                      .model flat, c
                       
                       
                      .code
                       
                      sieve PROC uses ebx
                          mov eax, 0
                        RET
                      sieve ENDP
                       
                      end


                    это для Itanium было сделано (ну и x86 тоже переваривает)
                    а для ARM другие макросы надо использовать - вот в чем дело и я их никак не могу найти <_<

                    P.S. кстати Visual Studio .NET не выдает ошибки в asm файле (просто сообщаяет о факте ошибки, но где и какая - молчок) - это не исправить?

                    Добавлено
                    все пробую - он просто не хочет компилировать код - т.е. не пытается откомпилировать asm, поэтому не может работать с функцией которая существует только как протиитп (в h) и в итоге получаю LNK ошибку
                    Сообщение отредактировано: Fireman -
                      Цитата Fireman @
                      Ну я чуть другое имел в виду
                      А я именно это и имел в виду.
                      Пишешь
                      ExpandedWrap disabled
                        int min_func(int a, int b) {
                           return a-b;
                        }
                      компилируешь не в объектный код, а в ассемблерный и видишь, что там должно быть. Включая полное декорированное имя функции, код входа в функцию и выхода из нее. Я сам так делал, например, с IAR EWAVR - там у меня весь проект был написан на C, только один обработчик прерывания на ассемблере.
                      Затем выкыдываешь исходник на C и заменяешь его исходником(файлом) на ассемблере и пользуешься.
                      Сообщение отредактировано: trainer -
                        ExpandedWrap disabled
                          int min_func(int a, int b)
                          {
                          00011000  mov         r12, sp
                          00011004  stmdb       sp!, {r0, r1}
                          00011008  stmdb       sp!, {r12, lr}
                          0001100C  sub         sp, sp, #4
                             return a-b;
                          00011010  ldr         r2, a
                          00011014  ldr         r3, b
                          00011018  sub         r3, r2, r3
                          0001101C  str         r3, [sp]
                          }
                          00011020  ldr         r0, [sp]
                          00011024  add         sp, sp, #4
                          00011028  ldmia       sp, {sp, pc}
                           
                          int main(void)
                          {
                          0001102C  sub         sp, sp, #4
                              return 0;
                          00011030  mov         r3, #0
                          00011034  str         r3, [sp]
                          }


                        но это же не то :-(

                        я про то что он даже не пытается .asm файл откомпилировать, хотя тот стоит в проекте
                          Это ты чего-то не то сделал. Вот что у меня получилось в VS.NET(под x86):
                          ExpandedWrap disabled
                            ; Listing generated by Microsoft (R) Optimizing Compiler Version 13.10.3077
                             
                                TITLE   .\sep_func.cpp
                                .386P
                            include listing.inc
                            if @Version gt 510
                            .model FLAT
                            else
                            _TEXT   SEGMENT PARA USE32 PUBLIC 'CODE'
                            _TEXT   ENDS
                            _DATA   SEGMENT DWORD USE32 PUBLIC 'DATA'
                            _DATA   ENDS
                            CONST   SEGMENT DWORD USE32 PUBLIC 'CONST'
                            CONST   ENDS
                            _BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
                            _BSS    ENDS
                            $$SYMBOLS   SEGMENT BYTE USE32 'DEBSYM'
                            $$SYMBOLS   ENDS
                            $$TYPES SEGMENT BYTE USE32 'DEBTYP'
                            $$TYPES ENDS
                            _TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
                            _TLS    ENDS
                            ;   COMDAT ?min_func@@YAHHH@Z
                            _TEXT   SEGMENT PARA USE32 PUBLIC 'CODE'
                            _TEXT   ENDS
                            sxdata  SEGMENT DWORD USE32 'SXDATA'
                            sxdata  ENDS
                            FLAT    GROUP _DATA, CONST, _BSS
                                ASSUME  CS: FLAT, DS: FLAT, SS: FLAT
                            endif
                             
                            INCLUDELIB LIBCD
                            INCLUDELIB OLDNAMES
                             
                            PUBLIC  ?min_func@@YAHHH@Z              ; min_func
                            EXTRN   __RTC_InitBase:NEAR
                            EXTRN   __RTC_Shutdown:NEAR
                            ;   COMDAT rtc$IMZ
                            ; File c:\programmer\projects\test\test001\sep_func.cpp
                            rtc$IMZ SEGMENT
                            __RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
                            rtc$IMZ ENDS
                            ;   COMDAT rtc$TMZ
                            rtc$TMZ SEGMENT
                            __RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
                            ; Function compile flags: /Odt /RTCsu /ZI
                            rtc$TMZ ENDS
                            ;   COMDAT ?min_func@@YAHHH@Z
                            _TEXT   SEGMENT
                            _a$ = 8                         ; size = 4
                            _b$ = 12                        ; size = 4
                            ?min_func@@YAHHH@Z PROC NEAR                ; min_func, COMDAT
                             
                            ; 1    : int min_func(int a, int b) {
                             
                                push    ebp
                                mov ebp, esp
                                sub esp, 192                ; 000000c0H
                                push    ebx
                                push    esi
                                push    edi
                                lea edi, DWORD PTR [ebp-192]
                                mov ecx, 48                 ; 00000030H
                                mov eax, -858993460             ; ccccccccH
                                rep stosd
                             
                            ; 2    :    return a-b;
                             
                                mov eax, DWORD PTR _a$[ebp]
                                sub eax, DWORD PTR _b$[ebp]
                             
                            ; 3    : }
                             
                                pop edi
                                pop esi
                                pop ebx
                                mov esp, ebp
                                pop ebp
                                ret 0
                            ?min_func@@YAHHH@Z ENDP                 ; min_func
                            _TEXT   ENDS
                            END
                          Вот у тебя должно быть примерно такое же, но для XScale

                          Добавлено
                          Как правило, такой сгенерированный исходник содержит много лишнего - его можно безболезненно подчистить и использовать.

                          Добавлено
                          Естественно, это я скомпилировал для примера, никаких настроек компиляции кроме генерации листинга не менял, а использовал те, что предложила IDE.
                            так в том то и дело что ARM это не 386 :-(
                            иначе ч просто бы ассемблерные вставки вставил бы

                            сейчас получил такое

                            Цитата
                            fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'THUMB'


                            и как с этим бороться не знаю

                            в .h у меня
                            ExpandedWrap disabled
                              void Example1(void);


                            а в .asm
                            ExpandedWrap disabled
                              _text SEGMENT
                              OPTION LANGUAGE:c
                              Example1 PROC FRAME
                                 ; rest of function ...
                                 ret
                              Example1 ENDP
                              _text ENDS
                              END
                              Цитата Fireman @
                              так в том то и дело что ARM это не 386
                              Ну так у меня просто нет под рукой компилятора под XScale. :)
                                а как его включить то?
                                эта ошибка вылезла потому что он (как я понимаю) код ассемблерный принял за .x86

                                в этом то вся и беда - не могу задать ARM код
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.1904 ]   [ 16 queries used ]   [ Generated: 1.07.26, 07:01 GMT ]