如何在iOS上开始使用ARM?

Ste*_*hez 2 c arm objective-c ios

只是好奇如何开始了解iOS下的ARM.任何帮助都会非常好.

Tam*_*ese 20

在我看来,最好的入门方式是

  1. 编写C代码的小片段(后面的Objective-C)
  2. 查看相应的汇编代码
  3. 找出足以理解汇编代码
  4. 重复!

为此,您可以使用Xcode:

  1. 创建一个新的iOS项目(单视图应用程序很好)
  2. 添加一个C文件scratchpad.c
  3. 在项目构建设置中,将"生成调试符号"设置为"否"
  4. 确保目标是iOS设备,而不是模拟器
  5. 打开scratchpad.c并打开助理编辑器
  6. 将助理编辑器设置为Assembly并选择"Release"

例1

将以下函数添加到scratchpad.c:

void do_nothing(void)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

如果您现在在助理编辑器中刷新程序集,您应该看到许多以点(指令)开头的行,然后是

_do_nothing:
@ BB#0:
    bx  lr
Run Code Online (Sandbox Code Playgroud)

我们暂时忽略这些指令并查看这三行.通过在互联网上进行一些搜索,您会发现这些行是:

  1. 标签(以下划线为前缀的函数名称).
  2. 只是编译器发出的注释.
  3. 退货声明.该b方法分支,忽略了x现在(它是与指令集之间切换),并且lr是链接寄存器,其中呼叫者存储返回地址.

例2

让我们加强一点并将代码更改为:

extern void do_nothing(void);

void do_nothing_twice(void)
{
    do_nothing();
    do_nothing();
}
Run Code Online (Sandbox Code Playgroud)

保存并刷新程序集后,您将获得以下代码:

_do_nothing_twice:
@ BB#0:
    push    {r7, lr}
    mov r7, sp
    blx _do_nothing
    pop.w   {r7, lr}
    b.w _do_nothing
Run Code Online (Sandbox Code Playgroud)

再次,通过在互联网上进行一些搜索,您将找到每一行的含义.需要做更多的工作,因为要进行两次调用:第一次调用需要返回给我们,所以我们需要改变lr.这是由blx指令完成的,该指令不仅分支到_do_nothing,而且还存储下一条指令(返回地址)的地址lr.

因为我们更改了返回地址,所以我们必须将它存储在某个地方,因此它会被压入堆栈.第二次跳转有一个.w后缀,但是现在让我们忽略它.为什么函数看起来不像这样?

_do_nothing_twice:
@ BB#0:
    push    {lr}
    blx _do_nothing
    pop.w   {lr}
    b.w _do_nothing
Run Code Online (Sandbox Code Playgroud)

这也可以,但在iOS中,惯例是将帧指针存储在其中r7.帧指针指向堆栈中我们存储前一帧指针和前一个返回地址的位置.

那么是什么代码所做的是:首先,它推动r7lr堆栈,然后将其设置r7为指向新的堆栈帧(这是在堆栈的顶部,并sp指向堆栈的顶部),然后将其枝条作在第一时间,然后将其恢复r7lr,最后将其分支为第二次.一个bx lr是没有必要的结束,因为被调用的函数将返回lr,这点对我们的调用者.

例3

我们来看看最后一个例子:

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
Run Code Online (Sandbox Code Playgroud)

汇编代码是:

_swap:
@ BB#0:
    ldr r2, [r0]
    ldr r3, [r1]
    str r3, [r0]
    str r2, [r1]
    bx  lr
Run Code Online (Sandbox Code Playgroud)

通过一些搜索,您将了解到参数和返回值存储在寄存器中r0- r3并且我们可以自由地使用它们进行计算.什么代码确实很简单:它加载的值r0r1点在r2r3,然后将它们存储在回交换顺序,那么它的分支回来.

等等

就是这样:编写小片段,获取足够的信息以粗略地了解每行中发生的事情,重复一遍.希望有所帮助!

  • 好的答案,糟糕的问题. (2认同)