На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> включение ассемблерных вставок , '__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 код
                                  Специально установил eMbedded Visual Tools. Вот что он мне выдал под ARM:
                                  ExpandedWrap disabled
                                        .verstamp   3 10
                                        .option pic0
                                        .file   1 "C:\programmer\projects\test\test002\sep_func.cpp"
                                        .data   .drectve
                                        .align  2
                                        .align  0
                                    __drectve:
                                        .ascii  "-defaultlib:corelibc.lib -defaultlib:coredll.lib "
                                        .text  
                                        .align  2
                                        .file   1 "C:\programmer\projects\test\test002\sep_func.cpp"
                                        .globl  ?min_func@@YAHHH@Z
                                        .loc    1 1
                                    #line 1 "C:\programmer\projects\test\test002\sep_func.cpp"  int min_func(int a, int b) {
                                        .ent    ?min_func@@YAHHH@Z 2
                                    ?min_func@@YAHHH@Z:
                                        .option O0
                                        .option foo
                                        .option foo
                                        sw  $4, 0($29)
                                        sw  $5, 4($29)
                                        .frame  $29, 0, $31
                                        .prologue   0
                                        .bgnb   9
                                        .bgnb   0
                                        .loc    1 2
                                    #line 2 "C:\programmer\projects\test\test002\sep_func.cpp"     return a-b;
                                        lw  $14, 0($29)
                                        lw  $15, 4($29)
                                        subu    $2, $14, $15
                                        b   $32
                                        .loc    1 3
                                    #line 3 "C:\programmer\projects\test\test002\sep_func.cpp"  }
                                        .endb   0
                                    $32:
                                        .endb   0
                                        b   $33
                                    $33:
                                        .livereg    0x2000FF0E,0x00000FFF
                                        j   $31
                                        .end


                                  Добавлено
                                  Хотя нет, стоп, это под MIPS :)

                                  Добавлено
                                  А вот это под ARM:
                                  ExpandedWrap disabled
                                        TTL C:\programmer\projects\test\test002\sep_func.cpp
                                     
                                        AREA    |.drectve|, DRECTVE
                                        DCB "-defaultlib:coredll.lib "
                                        DCB "-defaultlib:corelibc.lib "
                                     
                                        EXPORT  |?min_func@@YAHHH@Z|            ; min_func
                                     
                                        AREA    |.pdata|, PDATA
                                    |$T223| DCD |?min_func@@YAHHH@Z|
                                        DCD 0x40000703
                                    ; File C:\programmer\projects\test\test002\sep_func.cpp
                                     
                                        AREA    |.text|, CODE
                                     
                                    |?min_func@@YAHHH@Z| PROC               ; min_func
                                     
                                    ; 1    : int min_func(int a, int b) {
                                     
                                        mov       r12, sp
                                        stmdb     sp!, {r0, r1}  ; stmfd
                                        stmdb     sp!, {r12, lr}  ; stmfd
                                    |$M221|
                                     
                                    ; 2    :    return a-b;
                                     
                                        ldr       r3, [sp, #8]
                                        ldr       r2, [sp, #0xC]  ; 0xC = 12
                                        sub       r0, r3, r2
                                     
                                    ; 3    : }
                                     
                                        ldmia     sp, {sp, pc}  ; ldmfd
                                    |$M222|
                                     
                                        ENDP  ; |?min_func@@YAHHH@Z|, min_func
                                     
                                        END


                                  Добавлено
                                  А вот это под ARM:
                                  ExpandedWrap disabled
                                        TTL C:\programmer\projects\test\test002\sep_func.cpp
                                     
                                        AREA    |.drectve|, DRECTVE
                                        DCB "-defaultlib:coredll.lib "
                                        DCB "-defaultlib:corelibc.lib "
                                     
                                        EXPORT  |?min_func@@YAHHH@Z|            ; min_func
                                     
                                        AREA    |.pdata|, PDATA
                                    |$T223| DCD |?min_func@@YAHHH@Z|
                                        DCD 0x40000703
                                    ; File C:\programmer\projects\test\test002\sep_func.cpp
                                     
                                        AREA    |.text|, CODE
                                     
                                    |?min_func@@YAHHH@Z| PROC               ; min_func
                                     
                                    ; 1    : int min_func(int a, int b) {
                                     
                                        mov       r12, sp
                                        stmdb     sp!, {r0, r1}  ; stmfd
                                        stmdb     sp!, {r12, lr}  ; stmfd
                                    |$M221|
                                     
                                    ; 2    :    return a-b;
                                     
                                        ldr       r3, [sp, #8]
                                        ldr       r2, [sp, #0xC]  ; 0xC = 12
                                        sub       r0, r3, r2
                                     
                                    ; 3    : }
                                     
                                        ldmia     sp, {sp, pc}  ; ldmfd
                                    |$M222|
                                     
                                        ENDP  ; |?min_func@@YAHHH@Z|, min_func
                                     
                                        END


                                  Добавлено
                                  Т.е. тебе нужно:
                                  ExpandedWrap disabled
                                       TTL имя
                                       EXPORT  |?min_func@@YAHHH@Z|                    ; min_func
                                     
                                       AREA    |.text|, CODE
                                     
                                    |?min_func@@YAHHH@Z| PROC                               ; min_func
                                     
                                       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}
                                     
                                       ENDP  ; |?min_func@@YAHHH@Z|, min_func
                                     
                                       END
                                    trainer, а проектик тогда выслать можешь?
                                    я сейчас пытаюсь реализовать - просто бывает что он просто не компилирует asm

                                    Цитата
                                    error LNK2019: unresolved external symbol "int __cdecl min_func(int,int)" (?min_func@@YAHHH@Z) referenced in function main


                                    пока вот что выдает
                                    Сообщение отредактировано: Fireman -
                                      Я бы выложил, но не получается. Вылазит Zero-sized reply :)
                                      Давай e-mail в приват

                                      Добавлено
                                      В общем добавил я в проект .asm, сделал для него Custom Build, в параметрах указал:
                                      armasm -cpu StrongARM1 -32 $(InputDir)\$(InputName).asm $(IntDir)\$(InputName).obj
                                      И все. Компилируется и собирается на ура.

                                      Добавлено
                                      У тебя возможно другие параметры для запуска ассемблера. Да может и Custom Build делать не надо.
                                        Цитата
                                        1>------ Build started: Project: test002, Configuration: Debug Windows Mobile 5.0 Pocket PC SDK (ARMV4I) ------
                                        1>Performing Custom Build Step
                                        1>Microsoft ® ARM Macro Assembler Version 14.00.50725
                                        1>Copyright © Microsoft Corporation. All rights reserved.
                                        1>error A0049: only one source file can be assembled: Mobile
                                        1>Project : error PRJ0019: A tool returned an error code from "Performing Custom Build Step"
                                        1>Build log was saved at "file://d:\test002\Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug\BuildLog.htm"
                                        1>test002 - 1 error(s), 0 warning(s)
                                        ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


                                        если не указывать Custom Build то выбрать можно только MASM
                                          Ну он тебе пишет: "Только один исходник может быть ассемблирован."
                                          Цитата
                                          error A0049: only one source file can be assembled: Mobile

                                          Ты Custom build сделал только для .asm-файла или для всего проекта?
                                            Цитата trainer @
                                            Ты Custom build сделал только для .asm-файла или для всего проекта?

                                            Для .asm
                                            А где для всего проекта то? Ведь в Custom Build я же выставлял именно чем asm файл компилировать и как
                                              Цитата Fireman @
                                              А где для всего проекта то?
                                              Можно ведь менять параметры как для всего проекта, так и для конкретного файла. Зависит от того, на чем правую кнопочку мыши нажмешь в Solution explorer'е.
                                                ну да
                                                но счелкая на asm файле я выставляю Custom Build указываю armasm и ключи
                                                а что с остальными делать? Где еще Custom Build выставлять и что ты под этим понимаешь
                                                  Цитата Fireman @
                                                  Где еще Custom Build выставлять
                                                  Больше нигде. Только для конкретного asm-файла.
                                                    Так я так и сделал - но ошибка то осталась
                                                    Вот и не знаю как с ней бороться
                                                      Файл с самим проектом(makefile-подобный) выложи
                                                        вот все что есть
                                                        Прикреплённый файлПрикреплённый файлtest002.rar (151.85 Кбайт, скачиваний: 158)
                                                          Понятно. Туго ассемблеру с именами папок/файлов, содержащими пробелы. Попробуй изменить на такое:
                                                          ExpandedWrap disabled
                                                            armasm -cpu StrongARM1 -32 "$(InputDir)\$(InputName).asm" "$(IntDir)\$(InputName).obj"
                                                          Или замени имя цели на что-нибудь, не содержащее пробелов
                                                            Действительно, дело было в этом - заменил строку на которую ты привел - все заработало. Спасибо
                                                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                            0 пользователей:


                                                            Рейтинг@Mail.ru
                                                            [ Script execution time: 0.1493 ]   [ 15 queries used ]   [ Generated: 1.07.26, 05:49 GMT ]