2009-10-16 24 views
13

Tôi muốn bắt đầu viết bộ mã hóa ARM và chạy nó trên iPhone.Quy trình làm việc để viết mã lắp ráp ARM trên iphone

Điều này không nhằm mục đích sử dụng trong ứng dụng được phát hành cho cửa hàng ứng dụng - Về cơ bản tôi muốn giải quyết sự cố trên ProjectEuler bằng ARM và iPhone, chỉ cho mục đích sở thích và giáo dục.

Tôi làm cách nào để thực hiện việc này? Tôi đã không thể đưa ra một cách để có được một dự án đang chạy bằng cách sử dụng bất kỳ cánh tay viết tay nào.

Trả lời

8

tôi đã không thể tìm thấy bất kỳ thông tin về làm thế nào để viết mã lắp ráp đặc biệt dành cho iPhone, nhưng cũng giống như những người khác nói ở đây, bạn có thể:

1) viết báo cáo inline asm trong C/Mã C++/ObjC hoặc 2) viết các hàm lắp ráp độc lập trong một tệp '.s' và chỉ cần thêm nó vào các nguồn XCode của bạn, hoặc 3) viết các hàm lắp ráp độc lập cho một bộ lắp ngoài như NASM. Bạn viết mã lắp ráp trong một tệp '.s' và tạo tệp đối tượng '.o' bằng cách sử dụng NASM và liên kết tệp đối tượng với dự án của bạn trong XCode. Vì vậy, nếu bạn chỉ cố gắng viết một vài hướng dẫn lắp ráp thì lắp ráp nội tuyến sẽ là cách dễ nhất, nhưng nếu bạn có kế hoạch viết một số chức năng lắp ráp sau đó tôi muốn giới thiệu một tập tin lắp ráp độc lập. Và nếu bạn có kế hoạch viết nhiều chức năng lắp ráp với các macro và muốn có khả năng tương thích đa nền tảng, vv, thì tôi khuyên bạn nên sử dụng NASM để biên dịch mã assembly của bạn thành một tệp đối tượng. Bởi vì tôi đang sử dụng XCode gcc assembler và nó khá thiếu so với NASM. Bạn có thể tải NASM miễn phí tại http://www.nasm.us/

Khi bạn đã thiết lập môi trường lắp ráp, bạn cần tìm hiểu cách viết mã Assembly ARM! Vì iPhone (và nhiều thiết bị di động và điện thoại thông minh khác) sử dụng bộ hướng dẫn ARM. Có một giới thiệu rất tốt nhưng cũ để lắp ráp ARM tại http://www.coranac.com/tonc/text/asm.htm.

Khi nói đến lập trình lắp ráp, hướng dẫn tham chiếu bộ hướng dẫn chính thức thường là nguồn thông tin chính cho mọi thứ bạn sẽ viết, vì vậy bạn nên truy cập trang web ARM và tải xuống ARM and Thumb-2 Quick Reference Card (dài 6 trang) 2 tài liệu đầy đủ cho CPU chính xác của bạn. Ví dụ, iPhone 3GS và iPhone 4 đều có CPU ARMv7-A Cortex-A8, vì vậy bạn có thể tải xuống ARM Architecture Reference Manual ARMv7-A and ARMv7-R Edition (dài 2000 trang) cho bạn biết chính xác hướng dẫn nào có sẵn và chính xác cách chúng hoạt động và Cortex™-A8 Technical Reference Manual giải thích thời gian chỉ dẫn, vv cho CPU cụ thể của bạn.

+1

tại sao bạn nên giới thiệu một bộ lắp ráp x86 để viết cụm ARM? – WinterMute

+1

yeah thực sự tôi vừa mới nhận ra rằng NASM không hỗ trợ ARM, nó chỉ thực hiện x86! Tôi khá mới để lắp ráp ARM vì vậy tôi không biết một bộ ghép ARM tốt mà cũng là miễn phí, xin lỗi. –

6

Bạn có thể sử dụng gcc để tạo đường thẳng asm với __asm__ hoặc chỉ nhận được gnu as cho và viết mã trong các tệp riêng biệt. Bạn sẽ không gặp vấn đề gì sau khi liên kết chúng với dự án của bạn, nhưng tôi khuyên bạn nên sử dụng mã c/Objective-C để kết thúc các lệnh asm của bạn, khi viết toàn bộ ứng dụng iPhone trong bộ assembler hơi khó (bạn cần được khá tốt trong objC thời gian chạy internals).

Bạn có thể quan tâm đến việc sử dụng Makefiles tùy chỉnh, tuy nhiên các dự án Xcode cũng phải đủ cho hầu hết các taks.

+3

Các công cụ dành cho iPhone bao gồm công cụ lắp ráp, không cần phải ra ngoài và nhận riêng. Bạn có thể bao gồm các tệp .s trong dự án XCode của bạn và nó sẽ "chỉ hoạt động". –

+0

vâng, đó * là * gnu là;) – Farcaller

4

Cũng lưu ý rằng không có gì sai với việc bao gồm lắp ráp trong bản đăng ký của cửa hàng ứng dụng. Nó chỉ sử dụng các khuôn khổ không công khai mà họ cau mày.

Chúng không quan tâm đến cách nhị phân được tạo miễn là nó hoạt động, trông rất ổn, và tuân thủ quy tắc nói trên.

+0

Hmm, tôi nghĩ họ KHÔNG quan tâm nó được tạo ra như thế nào - nó phải do Xcode/target-C nhưng bạn có thể sẽ lấy đi một số asm. –

+0

Chúng cho phép nhiều trình tạo mã thay thế ngay bây giờ, như trình biên dịch Adobe hoặc mono ... Nó không phải được biên dịch bằng cách sử dụng XCode hoặc Objective-C. –

1

Vì vậy, đây là mô tả nhanh về cách thực sự bao gồm mã asm ARM vào dự án Xcode, điều này được thử nghiệm trong các phiên bản Xcode lên tới 4.3. Đối với dự án cụ thể của tôi, tôi muốn xác định một hàm trong mã ASM được lưu với tên tệp như "decode_arm.s". Tôi đã có một C thực hiện các chức năng tương tự được biên dịch khi chạy theo giả lập, do đó, logic cpp có điều kiện ở đây đảm bảo rằng mã ASM ARM chỉ được biên dịch vào dự án khi thực sự biên dịch cho thiết bị.

// This file implements the following C functions for the ARM platform. 
// Both ARM6 and ARM7 devices are supported by this implementation. 
// 
// maxvid_decode_c4_sample16() 

#if defined(__arm__) 
# define COMPILE_ARM 1 
# if defined(__thumb__) 
# define COMPILE_ARM_THUMB_ASM 1 
# else 
# define COMPILE_ARM_ASM 1 
# endif 
#endif 

#if defined(COMPILE_ARM) 
# define USE_GENERATED_ARM_ASM 1 
#endif // COMPILE_ARM 

#if defined(USE_GENERATED_ARM_ASM) 
    .section __TEXT,__text,regular 
    .section __TEXT,__textcoal_nt,coalesced 
    .section __TEXT,__const_coal,coalesced 
    .section __TEXT,__picsymbolstub4,symbol_stubs,none,16 
    .text 
    .align 2 
    .globl _maxvid_decode_c4_sample16 
    .private_extern _maxvid_decode_c4_sample16 
_maxvid_decode_c4_sample16: 
    @ args = 0, pretend = 0, frame = 0 
    @ frame_needed = 1, uses_anonymous_args = 0 
    stmfd sp!, {r4, r5, r6, r7, lr} 
    add r7, sp, #12 
    stmfd sp!, {r8, r10, r11} 

    (ASM CODE HERE) 

    ldmfd sp!, {r8, r10, r11} 
    ldmfd sp!, {r4, r5, r6, r7, pc} 
    .subsections_via_symbols 

#else 
    // No-op when USE_GENERATED_ARM_ASM is not defined 
#endif 
+0

Với Xcode 4.5 (clang 4), bây giờ bạn cần bao gồm đối số dòng lệnh -no-integrated-as cho nội tuyến AT & T inline này để làm việc. Thêm nó vào mục tiêu .s "Target" -> "Build Phase" – MoDJ

+0

Tôi cũng tạo ra bài đăng blog này cung cấp một khung thời gian cho thời gian thực thi ARM asm trong iOS. Xem ví dụ về dự án Xcode tại http://www.modejong.com/blog/post10_arm_timing_framework/index.html – MoDJ

Các vấn đề liên quan