2010-12-06 2 views
3

Итак, я занялся программированием сборки. В моем поле Ubuntu довольно просто: используя NASMamd GNU ld, я смог написать более или менее сложные программы в стиле HelloWorld через полчаса. Но когда дело доходит до iPhone, это так сложно. Прежде всего, у меня есть JB'en iPhone 3G на прошивке 4.2.1, что означает, что я использую порт ARM ядра Darwin v10. Второй. Я должен использовать GNU, поскольку NASM для iPhone не существует: встроенная инструментальная цепочка (как Xcode в Mac OS X, так и openware tooolchain на Linux) использует GCC. Итак, я собрал основную информацию о: - как писать сборку в GNU как язык; - каковы основные инструкции ARM, регистры, доступ к памяти.ARM Darwin assembly - поиск системных вызовов (возможно, обучение)

Но даже для HelloWorld требуются вызовы ядра для записи в stdout. Мой вопрос: какое ядро ​​следует использовать и как (какие аргументы идут туда); Я должен использовать инструкцию swi # ARM, не так ли?

Итак, можете ли вы разместить какую-либо информацию/ссылки на учебные пособия или кого-нибудь с ARM Darwin Hello world asm code?

В настоящее время, я мог бы сделать это:

;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 

Итак, кто-нибудь, пожалуйста?

+2

Одна хорошая вещь, которую вы можете сделать, это запустить GCC с флагом -S, который даст вы сборочный вывод, на который вы можете посмотреть, как он это делает. – 2010-12-06 23:13:37

ответ

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.
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