2010-12-06 12 views
3

アセンブリプログラミングを取り上げました。私のUbuntuボックスでは非常に簡単です:NASMamd GNU ldを使って、HelloWorldスタイルのプログラムを30分で書くことができました。 しかし、それはiPhoneになると、とても複雑です。まず、4.2.1ファームウェアにJB'en iPhone 3Gがあります。これは、Darwinカーネルv10のARMポートを使用していることを意味します。 秒。ネイティブツールチェイン(Mac OS XのXcodeとLinuxのopensource tooolchainの両方)はGC​​Cを使用しています。 私は基本的な情報を集めました: - 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 

ので、誰でもしてください?ここで

+2

与えるあなたは-SフラグでGCCを実行されて行うことができる一つの良いこと、あなたはどのようにそれを見て見ることができるアセンブリの出力。 –

+0

残念ながら、私はこれを試しましたが、libgccの_printfを参照していたコードはかなり「難読化された」コードしかありませんでした。インラインインテルスタイルのasmをARMコードに変換するために__asm __()C関数を使用できますか? (私はそれを試してみる)。 – H2CO3

答えて

1

はそれをしないかのlibc(はlibSystem)です:

; ssize_t read(int, void *, size_t) 
       EXPORT _read 
_read 
       MOV  R12, #3   ; SYS_read 
       SVC  0x80 ; 'А'  ; do a syscall 
       BCC  _ok    ; carry clear = no error 
       LDR  R12, =(cerror_ptr - . - 8) ; otherwise call error handler 
       LDR  R12, [PC,R12] ; load pointer 
       B  _call_error 
       DCD cerror_ptr - . 
_call_error        
       BX  R12 ; cerror ; jump to it (error number is in R0) 
_ok 
       BX  LR    ; return to caller 
; End of function _read 

すなわち:

  1. システムコール番号は(SYS/syscall.hを参照してください)R12です。
  2. システムコール命令はSVC 0x80(SWI 0x80)です。
  3. その他のパラメータはABI(R0-R3、スタック)に従います。
  4. エラーの場合、キャリーフラグがセットされ、エラー番号がR0に返されます。
関連する問題