2008-10-26 20 views

Odpowiedz

18

stałam się to do pracy, dzięki jakiejś wewnętrznej pomocy nad na Apple Devforums, należy zarejestrować się, jeśli jesteś dedykowany programista iPhone.

Pierwszą rzeczą pierwszy, to __asm ​​__(), nie zwykły asm().

Po drugie, domyślnie XCode generuje cel kompilacji, który kompiluje zestaw inline względem zestawu instrukcji ARM Thumb, dzięki czemu usat nie został rozpoznany jako właściwa instrukcja. Aby to naprawić, wykonaj polecenie "Pobierz informacje" na celu. Przewiń w dół do sekcji "GCC 4.0 - Generowanie kodu" i odznacz "Kompiluj dla kciuka". Wtedy ten Poniższy urywek skompiluje dobrze jeśli ustawić Active SDK do „Device”

inline int asm_saturate_to_255 (int a) { 
    int y; 
    __asm__("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a)); 
    return y; 
} 

Oczywiście, teraz nie działa z iPhone Simulator. Ale TargetConditionals.h zdefiniował, że możesz #ifdef przeciwko. Mianowicie TARGET_OS_IPHONE i TARGET_IPHONE_SIMULATOR.

+2

Myślę, że masz na myśli __asm ​​__() zamiast zwykłego asm(). –

+0

Dlaczego to nie działa z symulatorem iPhone'a? Czy na symulatorze nie działa żaden zestaw montażowy, czy też musisz mieć inny zestaw instrukcji montażu, ponieważ działa on na i386? – Roberto

+0

@Roberto: Masz to. Symulator działa na x86, więc nie można uruchomić zespołu ARM. Po prostu się nie skompiluje. –

11

Piszę sporo kodu montażowego ARM Cortex-A8. CPU na iPhonie to ARM11 (afaik), więc podstawowy zestaw instrukcji jest taki sam.

Czego dokładnie szukasz? Mogę podać ci kilka przykładów, jeśli chcesz.


EDIT:

Właśnie się dowiedziałem, że na iPhone trzeba użyć kompilatora LLVM z-gcc. O ile mi wiadomo, powinien on rozumieć składnię wbudowanego assemblera z GCC. Jeśli tak, wszystkie samouczki wbudowanego modułu ARM ARM będą działać również na telefonie iPhone.

Oto bardzo minimalna wbudowana funkcja asemblera (w C). Czy możesz mi powiedzieć, czy kompiluje i działa na iPhone'ie? Jeśli to działa, mogę trochę przetłumaczyć, jak robić użyteczne rzeczy w wbudowanym asemblerze ARM, szczególnie w architekturze ARMv6 i rozszerzeniach DSP.

inline int saturate_to_255 (int a) 
{ 
    int y; 
    asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a)); 
    return y; 
} 

powinna być równa:

inline int saturate_to_255 (int a) 
{ 
    if (a < 0) a =0; 
    if (a > 255) a = 255; 
    return a; 
} 
+1

Nie udało mi się skompilować tego. Próbowałem przez XCode Apple. Kompilator jest domyślnie ustawiony na GCC 4. Jeśli skompiluję go za pomocą tego, to narzeka na niepoprawną instrukcję "usat" i jeśli ustawię ją przy użyciu llvm-gcc, to narzeka na niepoprawną architekturę "armv6". –

+0

spróbuj gcc -O3 -march = test armv6.c –

+0

nie jest llvm-gcc faktycznie kompilator, który celuje w maszynę wirtualną llvm? – artificialidiot

0

Kciuk jest zalecany do aplikacji, które nie wymagają ciężkiej operacji pływania. Thumb zmniejsza rozmiar kodu i powoduje również szybsze wykonywanie kodu.

Należy więc włączyć tylko kciuk dla aplikacji takich jak gry 3D ...

+3

Właściwie, z reguły używanie zestawu instrukcji Thumb jest znacznie wolniejsze niż przy użyciu zestawu instrukcji ARM. Zgodnie z regułą (gra słów nie jest przeznaczona), zyskujesz 1/3 rozmiaru kodu i tracisz 1/3 prędkości. Zobacz np. http://www.arm.com/pdfs/Thumb-2CoreTechnologyWhitepaper-Final4.pdf –

1

Rejestry mogą być również stosowane wprost w inline asm

void foo(void) { 
#if TARGET_CPU_ARM64 
    __asm ("sub  sp, sp, #0x60"); 
    __asm ("str  x29, [sp, #0x50]"); 
#endif 
} 
Powiązane problemy