включение ассемблерных вставок
, '__asm' not supported on this architecture
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.58] |
|
|
| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
включение ассемблерных вставок
, '__asm' not supported on this architecture
|
Сообщ.
#1
,
|
|
|
|
Приветствую
Пишу под 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. использовать встроенные функции мне кажется негибко (не могу манипулировать с регистрами) скажите как тогда надо вставлять код ф отдельный файл и как потом его вызывать! |
|
Сообщ.
#2
,
|
|
|
|
Напиши маленький тестовый проектик, заставь VS выдать по нему ассемблерный код и посмотри, что там и как.
В C-ном исходнике тебе понадобится прототип функции. Вызывать - так же, как и любую другую функцию. |
|
Сообщ.
#3
,
|
|
|
|
а если мой код ассемблерный на функцию не тянет - я хотел некоторые вычисления внутри функции на нем сделать
и еще - как это выглядит то? Т.е. какой-нить code.asm я присоединяю к проекту, а дальше что? Как-то его подгрузить надо и внутрб функции пихнуть |
|
Сообщ.
#4
,
|
|
|
|
Цитата Fireman @ Компилируешь проект и получаешь исполнимый файл.а дальше что? Цитата Fireman @ Внутрь функции не пихнешь. Это будет самостоятельная функция, написанная на ассемблере. внутрб функции пихнуть |
|
Сообщ.
#5
,
|
|
|
|
дело в том что у меня это в классе происходит, ну по идее я могу в функцию передать некоторые указатели на данные, но все же
потом - все же как это делается - просто code.asm в проект добавить, в .cpp вызвать #include "code.asm" и потом вызвать функцию? ты мог бы маленький примерчик привести и еще - если пользоваться интристик функциями - смогу ли я манипулировать регистрами? |
|
Сообщ.
#6
,
|
|
|
|
Делаешь что-то.asm, где пишешь реализацию функции, подключаешь в проект
Делаешь что-то.h, пишешь там прототип функции В исходнике(C/C++) пишешь #include "что-то.h" и затем используешь функцию |
|
Сообщ.
#7
,
|
|
|
|
Так вот про реализацию
например мне нужна функция int min_func(int a, int b) ![]() ![]() 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} надо ведь дописать как функция называется и т.п. |
|
Сообщ.
#8
,
|
|
|
|
Цитата Fireman @ Ну да. Напиши ее на C, сконвертируй с помощью компилятора в ассемблер и получишь все необходимое. Полное декорированное имя функции, код входа в функцию и выходя из нее. Потом подменяешь тело и используешь(удалив реализацию на C). А заодно посмотришь, стоит ли овчинка выделки? надо ведь дописать как функция называется и т.п. ![]() Кстати, есть Intel C++ для XScale под WinCE. |
|
Сообщ.
#9
,
|
|
|
|
Ну я чуть другое имел в виду
Вот раздобыл примерчик один (который я упростил до ужаса) ![]() ![]() .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 ошибку |
|
Сообщ.
#10
,
|
|
|
|
Цитата Fireman @ А я именно это и имел в виду.Ну я чуть другое имел в виду Пишешь ![]() ![]() int min_func(int a, int b) { return a-b; } Затем выкыдываешь исходник на C и заменяешь его исходником(файлом) на ассемблере и пользуешься. |
|
Сообщ.
#11
,
|
|
|
|
![]() ![]() 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 файл откомпилировать, хотя тот стоит в проекте |
|
Сообщ.
#12
,
|
|
|
|
Это ты чего-то не то сделал. Вот что у меня получилось в VS.NET(под x86):
![]() ![]() ; 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 Добавлено Как правило, такой сгенерированный исходник содержит много лишнего - его можно безболезненно подчистить и использовать. Добавлено Естественно, это я скомпилировал для примера, никаких настроек компиляции кроме генерации листинга не менял, а использовал те, что предложила IDE. |
|
Сообщ.
#13
,
|
|
|
|
так в том то и дело что ARM это не 386 :-(
иначе ч просто бы ассемблерные вставки вставил бы сейчас получил такое Цитата fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'THUMB' и как с этим бороться не знаю в .h у меня ![]() ![]() void Example1(void); а в .asm ![]() ![]() _text SEGMENT OPTION LANGUAGE:c Example1 PROC FRAME ; rest of function ... ret Example1 ENDP _text ENDS END |
|
Сообщ.
#14
,
|
|
|
|
Цитата Fireman @ Ну так у меня просто нет под рукой компилятора под XScale. так в том то и дело что ARM это не 386 |
|
Сообщ.
#15
,
|
|
|
|
а как его включить то?
эта ошибка вылезла потому что он (как я понимаю) код ассемблерный принял за .x86 в этом то вся и беда - не могу задать ARM код |