2010-12-06 4 views
3

Also nahm ich Montage Programmierung. Auf meiner Ubuntu-Box ist das ganz einfach: Mit NASMamd GNU ld konnte ich in einer halben Stunde mehr oder weniger komplizierte HelloWorld-Programme schreiben. Aber wenn es um das iPhone geht, ist es so kompliziert. Als erstes habe ich ein JB'en iPhone 3G auf der Firmware 4.2.1, was bedeutet, dass ich den ARM-Port des Darwin-Kernels v10 benutze. Sekunde. Ich muss GNU als verwenden, da es kein NASM für iPhone gibt: die native Toolchain (sowohl Xcode unter Mac OS X als auch die Opensource tooolchain unter Linux) verwenden GCC. So habe ich grundlegende Informationen gesammelt über: - wie man Assembly in GNU als Sprache schreiben; - Was sind die grundlegenden ARM-Anweisungen, Register, Speicherzugriff.ARM Darwin Assembly - Suche nach Systemaufrufen (Tutorial vielleicht)

Aber auch HelloWorld benötigt Kernel-Aufrufe zum Schreiben auf stdout. Meine Frage ist: welcher Kernel-Aufruf zu verwenden ist und wie (welche Argumente wohin gehen); Ich sollte die Anweisung swi # ARM verwenden, oder?

Also, können Sie bitte einige Informationen/Links zu Tutorials, oder jemand mit einem ARM Darwin Hello World Asm Code?

Ab jetzt konnte ich dies tun:

;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 

auf ARM, jedoch konnte ich nur tun, wie folgt:

.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 

So jemand bitte?

+2

Eine gute Sache, die Sie tun können GCC mit der -S-Flag ausgeführt werden, die geben wird Sie Assembly-Ausgabe, die Sie sehen können, um zu sehen, wie es geht. –

+0

Danke, leider habe ich das versucht, aber ich habe nur ziemlich "verschleierten" Code, was auf _printf in libgcc verwiesen wurde. Darf ich die __asm ​​__() C-Funktion verwenden, um Inline-ASM nach Intel in ARM-Code umzuwandeln? (Ich werde es versuchen). – H2CO3

Antwort

1

Hier ist, wie libc (libSystem) tut es:

; 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 

d.h .:

  1. System-Rufnummer in R12 ist (siehe sys/syscall.h).
  2. Die Systemaufrufanweisung lautet SVC 0x80 (SWI 0x80).
  3. Andere Parameter sind nach dem ABI (R0-R3, dann Stapel).
  4. Bei Fehler wird das Übertrags-Flag gesetzt und die Fehlernummer wird in R0 zurückgegeben.