私はこれが初めてで、これが私がやりたいことです-
- ARMv7 アセンブリを使用してループ、カウンターなどの簡単なプログラムを作成する
- iPhoneで実行するためにMac / Win / Linuxでコンパイルできるようにしたい
- ジェイルブレイクされたiPhoneを持っているので、そこにファイルをアップロードし、ldidで署名して実行できます
無料で入手できるツールを使用してこれを行う方法を教えてください。
ありがとう!
ここで何を達成しようとしているのか疑問に思っています.ARMアセンブラでの開発を学ぶことですか? iOS アプリケーションを作成しますか?
最近では、完全なアプリケーションをアセンブラーで作成する正気な人はいません。彼らは高級言語を使用しており、いくつかの制限されたケースでは、アセンブラーで最適化しています。これは非常に専門的で有用なスキルです。
完全な C プログラムを代理ホストとして使用することは、開始するのに適した方法です。(ほとんど) 空の関数を呼び出す単純な Hello world プログラムを C で作成します。
XCode を使用して (ほとんどの場合) これを機能させることができます (オプションのコマンドライン ツールをインストールする必要があります)。ARM の最終リンク段階を除くすべては、clang
. これは明らかに MacOSX のみです。
この種の実験のより良い代替手段は、iOS のロックダウンされた環境と戦っていない ARM Linux システムです。Raspberry Piはこの仕事に最適です。ARMv7 用のクロスコンパイル ツールチェーンが必要です。Ubuntu を使用している場合は、ビルド済みのパッケージがすぐに利用できます。
Main.c
#include<stdio.h>
extern void func();
int main()
{
printf("Hello World\n");
func();
}
とfunc.c
#include <stdio.h>
void func()
{
printf("In func()\n");
}
ホスト環境用に両方をコンパイルし、実行して動作を確認します。
gcc main.c func.c
`./a.out'
次に、ターゲット環境用にコンパイルします。クロスコンパイルツールの正確な名前は、インストールしたものによって異なります (私の場合はarm-angstrom-linux-gnueabi-gcc
)
arm-angstrom-linux-gnueabi-gcc main.c func.c
ターゲットにコピーし、それが機能することを証明します。
これで、アセンブラを書き始めることができます。gcc
被害者ファイルの ARM アセンブラを作成します。func.c
これにより、ファイルが作成されます。func.s
arm-angstrom-linux-gnueabi-gcc func.c -s
:
.cpu arm7tdmi-s
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 18, 4
.file "func.c"
.section .rodata
.align 2
.LC0:
.ascii "In func()\000"
.text
.align 2
.global func
.type func, %function
func:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
ldr r0, .L2
bl puts
sub sp, fp, #4
ldmfd sp!, {fp, lr}
bx lr
.L3:
.align 2
.L2:
.word .LC0
.size func, .-func
.ident "GCC: (GNU) 4.5.4 20120305 (prerelease)"
.section .note.GNU-stack,"",%progbits
ここで、ラベルfunc:
との間が -.L3
のビジネス エンドであり、func()
ほとんどすべての機能がプロローグとエピローグであることがわかります。これらが何であるかを理解し、どのレジスタを使用するかについてのガイダンスについては 、 ARM Procedure Call Standardを確認してください。
編集が完了したら、GCC で全体を再度コンパイルします。
arm-angstrom-linux-gnueabi-gcc main.c func.s
...そしてテストします。