アセンブリプログラミングを取り上げました。私のUbuntuボックスでは非常に簡単です:NASMamd GNU ldを使って、HelloWorldスタイルのプログラムを30分で書くことができました。 しかし、それはiPhoneになると、とても複雑です。まず、4.2.1ファームウェアにJB'en iPhone 3Gがあります。これは、Darwinカーネルv10のARMポートを使用していることを意味します。 秒。ネイティブツールチェイン(Mac OS XのXcodeとLinuxのopensource tooolchainの両方)はGCCを使用しています。 私は基本的な情報を集めました: - GNUでアセンブリ言語を書く方法; - 基本的なARM命令、レジスタ、メモリアクセスとは何ですか?ARMダーウィンアセンブリ - システムコールを探しています(おそらくチュートリアル)
でも、HelloWorldでも、stdoutに書き込むためのカーネルコールが必要です。私の質問は、どのカーネルコールをどのように呼び出すか(引数はどこに行くのか)です。私はswi#ARM命令を使うべきです、私はすべきではありませんか?
だから、チュートリアルやARM Darwin Hello world asmコードを使って誰かの情報/リンクを投稿してもらえますか?
今のところ、私はこれを行うことができます:ARMの
;Hello World for Linux and NASM
section data
hello db "Hello World"
helloLen equ $ - hello
section text
global _start
_start:
mov eax, 4 ; sys_write
mov ebx, 1 ; to stdout
mov ecx, hello ; address of string
mov edx, helloLen ; value (because of eq!!!) of strLen
int 0x80 ; call awesome Linux kernel
mov eax, 1 ; sys_exit
mov ebx, 0 ; "return 0; " if you like C
int 0x80 ; call kernel to end program
を、しかし、私はこれだけのように行うことができます:
.text
start:
mov r0, #0
mov r1, #234
add r2, r0, r1
@all mov and add and other stuff works fine
swi #0xc00
@all that I get is Bad system call error
ので、誰でもしてください?ここで
与えるあなたは-SフラグでGCCを実行されて行うことができる一つの良いこと、あなたはどのようにそれを見て見ることができるアセンブリの出力。 –
残念ながら、私はこれを試しましたが、libgccの_printfを参照していたコードはかなり「難読化された」コードしかありませんでした。インラインインテルスタイルのasmをARMコードに変換するために__asm __()C関数を使用できますか? (私はそれを試してみる)。 – H2CO3