-1

所以我开始了汇编编程。这在我的 Ubuntu 机器上非常简单:使用 NASMamd GNU ld,我能够在半小时内编写或多或少复杂的 HelloWorld 风格的程序。但是当谈到 iPhone 时,它​​是如此复杂。首先,我有一个JB'en iPhone 3G on 4.2.1固件,也就是说我使用的是Darwin kernel v10的A​​RM端口。第二。我必须使用 GNU,因为 iPhone 没有 NASM:本机工具链(Mac OS X 上的 Xcode 和 linux 上的开源工具链)使用 GCC。所以我收集了有关以下方面的基本信息: - 如何用 GNU 编写程序集作为语言;- 什么是基本的 ARM 指令、寄存器、内存访问。

但即使是 HelloWorld 也需要内核调用才能写入标准输出。我的问题是:使用什么内核调用以及如何使用(哪些参数去哪里);我应该使用 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

IE:

  1. 系统调用号在 R12 中(参见 sys/syscall.h)。
  2. 系统调用指令为 SVC 0x80 (SWI 0x80)。
  3. 其他参数根据ABI(R0-R3,然后stack)。
  4. 出错时,设置进位标志并在 R0 中返回错误号。
于 2010-12-07T10:30:25.610 回答