1

私はこれが初めてで、これが私がやりたいことです-

  1. ARMv7 アセンブリを使用してループ、カウンターなどの簡単なプログラムを作成する
  2. iPhoneで実行するためにMac / Win / Linuxでコンパイルできるようにしたい
  3. ジェイルブレイクされたiPhoneを持っているので、そこにファイルをアップロードし、ldidで署名して実行できます

無料で入手できるツールを使用してこれを行う方法を教えてください。

ありがとう!

4

1 に答える 1

1

ここで何を達成しようとしているのか疑問に思っています.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

...そしてテストします。

于 2012-09-04T10:12:20.693 に答える