-1

そこで私はアセンブリプログラミングを始めました。私の Ubuntu ボックスでは非常に単純です。NASMamd GNU ld を使用して、多かれ少なかれ複雑な HelloWorld スタイルのプログラムを 30 分で作成できました。しかし、iPhone の場合は非常に複雑です。まず、4.2.1 ファームウェアの JB'en iPhone 3G を使用しています。つまり、Darwin カーネル v10 の ARM ポートを使用しています。2番。iPhone 用の NASM がないため、GNU を使用する必要があります。ネイティブ ツールチェーン (Mac OS X の Xcode と Linux のオープンソース ツールチェーンの両方) は GCC を使用します。そこで、次の基本情報をまとめました。 - GNU でアセンブリを言語として記述する方法。-基本的なARM命令、レジスタ、メモリアクセスは何ですか。

ただし、HelloWorld でさえ、stdout に書き込むためにカーネル呼び出しが必要です。私の質問は、どのカーネル呼び出しをどのように使用するか (どの引数がどこに行くのか) です。swi # ARM 命令を使用する必要がありますね。

それで、チュートリアルへの情報/リンク、またはARM Darwin Hello world asmコードを持っている人を投稿してもらえますか?

今のところ、私はこれを行うことができます:

;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

ただし、ARMでは、次のようにすることしかできませんでした:

.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

では、どなたかお願いします。

4

2 に答える 2

1

すぐに見つけられるのが一番ですが、最初の投稿が古いことに気づきました

http://blog.softboysxp.com/post/7888230192/a-minimal-168-byte-mach-o-arm-executable-for-ios

.text
.globl start

start:
mov r2, #14
adr r1, hello_str
mov r0, #1
mov r12, #4
swi 0x80

mov r0, #0
mov r12, #1
swi 0x80

hello_str:
.ascii  "Hello, World!\n"

compile:
as new.asm -o new.o
ld new.o -o new
./new
于 2012-08-12T06:38:43.730 に答える
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. システム コール番号は R12 にあります (sys/syscall.h を参照)。
  2. システムコール命令は SVC 0x80 (SWI 0x80) です。
  3. その他のパラメーターは、ABI (R0-R3、次にスタック) に従います。
  4. エラーの場合、キャリー フラグが設定され、エラー番号が R0 に返されます。
于 2010-12-07T10:30:25.610 に答える