2008-10-26 27 views

Trả lời

18

tôi đã nhận được này để làm việc, nhờ vào sự giúp đỡ bên trên tại Apple Devforums, bạn nên đăng ký nếu bạn là một nhà phát triển dành riêng cho iPhone.

Điều đầu tiên trước tiên là __asm ​​__(), không phải là đồng bằng asm().

Thứ hai, theo mặc định, XCode tạo mục tiêu biên dịch biên dịch tập hợp nội tuyến dựa vào tập lệnh ARM Thumb, vì vậy usat không được nhận dạng như một hướng dẫn thích hợp. Để khắc phục điều này, hãy thực hiện "Nhận thông tin" trên Target. Cuộn xuống phần "GCC 4.0 - Tạo mã" và bỏ chọn "Biên dịch cho ngón tay cái". Sau đó, đoạn mã sau đây sẽ biên dịch tốt nếu bạn đặt SDK hoạt động thành "Thiết bị"

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

Đương nhiên, bây giờ nó sẽ không hoạt động với Trình mô phỏng IPhone. Nhưng TargetConditionals.h đã xác định bạn có thể #ifdef chống lại. Cụ thể là TARGET_OS_IPHONETARGET_IPHONE_SIMULATOR.

+2

Tôi nghĩ bạn có nghĩa là __asm ​​__() thay vì asm đơn giản(). –

+0

Tại sao nó không hoạt động với iPhone Simulator? Có phải là không có lắp ráp hoạt động trên giả lập, hoặc là nó mà bạn phải có một bộ khác nhau của hướng dẫn lắp ráp bởi vì nó đang chạy trên i386? – Roberto

+0

@Roberto: Bạn hiểu rồi. Trình mô phỏng đang chạy trên x86, vì vậy bạn không thể chạy lắp ráp ARM. Nó sẽ không biên dịch. –

11

Tôi viết khá nhiều mã ARM Cortex-A8. CPU trên iPhone là ARM11 (afaik) nên tập lệnh lõi là như nhau.

Chính xác bạn đang tìm kiếm điều gì? Tôi có thể cung cấp cho bạn một số ví dụ nếu bạn muốn.


EDIT:

Tôi chỉ phát hiện ra rằng trên iPhone bạn phải sử dụng trình biên dịch llvm-gcc. Theo như tôi biết nó nên hiểu cú pháp lắp ráp nội tuyến từ GCC. Nếu vậy tất cả các hướng dẫn lắp ráp nội tuyến ARM cũng sẽ hoạt động trên iPhone.

Đây là chức năng lắp ghép nội tuyến rất nhỏ (trong C). Bạn có thể vui lòng cho tôi biết nếu nó biên dịch và hoạt động trên iphone? Nếu nó hoạt động tôi có thể rant một chút làm thế nào để làm công cụ hữu ích trong lắp ráp ARM inline, đặc biệt là đối với kiến ​​trúc ARMv6 và các phần mở rộng DSP.

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

nên tương đương với:

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

Tôi không thể thực hiện việc biên dịch này. Tôi đã thử qua XCode của Apple. Trình biên dịch thực sự được đặt thành GCC 4 theo mặc định. Nếu tôi biên dịch nó bằng cách sử dụng nó nó phàn nàn của một lệnh không hợp lệ 'usat' và nếu tôi đặt nó bằng cách sử dụng llvm-gcc thì nó sẽ phàn nàn về kiến ​​trúc không hợp lệ, 'armv6'. –

+0

thử thử nghiệm gcc -O3 -march = armv6.c –

+0

không phải là llvm-gcc thực sự là một trình biên dịch nhắm mục tiêu đến máy ảo llvm? – artificialidiot

0

Nên sử dụng ngón tay cái cho ứng dụng không yêu cầu hoạt động nổi nặng. Ngón tay cái làm cho kích thước mã nhỏ hơn và kết quả cũng trong thực thi mã nhanh hơn.

Vì vậy, bạn chỉ nên bật Thumb tắt cho các ứng dụng như trò chơi 3D ...

+3

Thực ra, theo quy tắc, sử dụng tập lệnh Thumb chậm hơn đáng kể so với sử dụng bộ lệnh ARM. Như một quy tắc của ngón tay cái (không có ý định chơi chữ), bạn đạt được 1/3 kích thước mã và mất 1/3 tốc độ. Xem ví dụ. http://www.arm.com/pdfs/Thumb-2CoreTechnologyWhitepaper-Final4.pdf –

1

Các thanh ghi cũng có thể được sử dụng một cách rõ ràng trong asm inline

void foo(void) { 
#if TARGET_CPU_ARM64 
    __asm ("sub  sp, sp, #0x60"); 
    __asm ("str  x29, [sp, #0x50]"); 
#endif 
} 
Các vấn đề liên quan