如何在 iOS 上开始使用 ARM?

2024-02-09

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


在我看来,最好的开始方式是

  1. 编写 C 代码小片段(后来的 Objective-C)
  2. 查看对应的汇编代码
  3. 找出足以理解汇编代码的内容
  4. Repeat!

为此,您可以使用 Xcode:

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

实施例1

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

void do_nothing(void)
{
    return;
}

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

_do_nothing:
@ BB#0:
    bx  lr

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

  1. 标签(带有下划线前缀的函数名称)。
  2. 只是编译器发出的注释。
  3. 返回语句。这b表示分支,忽略x现在(它与指令集之间的切换有关),并且lr是链接寄存器,调用者存储返回地址。

实施例2

让我们稍微加强一下并将代码更改为:

extern void do_nothing(void);

void do_nothing_twice(void)
{
    do_nothing();
    do_nothing();
}

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

_do_nothing_twice:
@ BB#0:
    push    {r7, lr}
    mov r7, sp
    blx _do_nothing
    pop.w   {r7, lr}
    b.w _do_nothing

同样,通过在互联网上进行一些搜索,您就会找到每一行的含义。还需要做一些工作,因为进行了两次调用:第一个调用需要返回给我们,因此我们需要更改lr。这是由blx指令,它不仅分支到_do_nothing,而且还将下一条指令的地址(返回地址)存储在lr.

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

_do_nothing_twice:
@ BB#0:
    push    {lr}
    blx _do_nothing
    pop.w   {lr}
    b.w _do_nothing

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

所以代码的作用是:首先,它推送r7 and lr到堆栈,然后设置r7指向新的堆栈帧(位于堆栈顶部,并且sp指向栈顶),然后第一次分支,然后恢复r7 and lr,终于第二次分支了。 Abx lr最后不需要,因为被调用的函数将返回lr,它指向我们的调用者。

实施例3

让我们看最后一个例子:

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

汇编代码是:

_swap:
@ BB#0:
    ldr r2, [r0]
    ldr r3, [r1]
    str r3, [r0]
    str r2, [r1]
    bx  lr

通过一些搜索,您将了解到参数和返回值存储在寄存器中r0-r3,并且我们可以自由地使用它们进行计算。代码的作用很简单:它加载的值r0 and r1指向r2 and r3,然后将它们按交换的顺序存储回来,然后再分支回来。

等等

就是这样:编写小片段,获取足够的信息以大致了解每行中发生的情况,然后重复。希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 iOS 上开始使用 ARM? 的相关文章

  • 使用 Storyboard 时获取 NSManagedObjectContext

    目标是获取当前的 NSManagedObjectContext 以便使用 Core Data 在 iOS 4 3 中 我将 UINavigationController 的委托设置为 AppDelegate 如下所示 在 AppDelega
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 为什么这个 SKPhysicsJointPin 不能将这 2 个精灵保持在一起?

    我显然不太了解 SKPhysicsJoint 但是除了 Apple 文档之外 网上的信息还很少 下面的代码有什么问题 我认为应该保持头部和颈部永久连接 我的意图是它们就像两张带有大头针的纸 这样它们可以旋转一点 但不仅仅是完全分开 当我运行
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 为什么 File.exists() 在多线程环境中表现不稳定?

    我有一个在 java JDK 1 7 下运行的批处理进程 它在具有 RHEL 2 6 18 308 el5 1 SMP 的系统上运行 此过程从数据库获取元数据对象的列表 它从该元数据中提取文件的路径 该文件可能实际存在 也可能不存在 该过程
  • 是否可以将 char * 转换为结构?

    这是我的问题 rcvfrom 参数之一是 char 一旦我从中获取数据 我想将其转换为结构 然而选角并不成功 我究竟做错了什么 这是我所做的 struct int8 t seq int8 t ack bool flag char data
  • Jenkins 将构建参数传递给 email-ext 模板

    如何将构建参数传递给 email ext jelly 模板 在进行一些构建之前 我想放置不同的自定义消息 一些公告 非代码更改 决策等 我正在考虑将其作为构建参数 以便我看到一个屏幕 提示我输入如果我要手动构建 请发送消息 编辑 我找到了一
  • 在 Bash 中检查字符串是否包含斜杠或反斜杠?

    我目前正在尝试让我的 bash 脚本检查字符串是否包含 or a 但不知何故我无法让它工作 这是我到目前为止得到的 if 1 then elif if 1 then fi 非常感谢帮助 谢谢 这检查是否 or 都在变量中 string if
  • Ant Javac 和 Commandline Javac 给出不同的结果

    我有一个导入一些 servlet 库的类 当我从命令行编译它时 一切都很好 当我使用 ant 编译任务来编译它时 它给出了在其路径中找不到 servlet 库的错误 这是已知 常见的现象吗 这是我的 Ant 目标
  • 使用 getElementsByTagName 选择所有 div

    我正在做一个项目 我只能使用 JS 来操作 HTML 文件 我想更改 HTML 中所有 div 的背景颜色 目前我有以下内容 Highlight Function function highlight e e target style ba
  • 如何删除单个换行符?

    我想删除文本中的单行符 但不删除双行符 我可以使用替换行 r n 如何删除单个换行符 EDIT 我还需要在每行之前添加空格 例如 如果原始文本是 line1 line2 line3 它必须转换为 line1 line2 line3 如果我明
  • 如何解决“未捕获的类型错误:将循环结构转换为 JSON”

    我正在执行一个网页 但在控制台上检查它时显示以下错误 未捕获的类型错误 将循环结构转换为 JSON console log JSON stringify physicianInfo Ext Ajax request async true u
  • Netbeans 可以在特定虚拟机中运行项目吗?

    我的 Win7 系统上安装了 64 位 Java 7 JDK 然而 我正在从事的项目之一需要调用一些古老的 C DLL 通过 JNI 而我只有 32 位版本 如果我尝试在 64 位 JVM 中运行它 我会收到错误 无法在 AMD 64 位平
  • EXCEL 应用程序窗口未在 workbook.close() 上关闭

    当我使用打开工作簿时 wbTest xlwings Book test xlsm EXCEL 应用程序打开并显示工作簿 但是当做一个 wbTest close 之后 工作簿关闭 但 EXCEL 窗口保持打开状态 因此我必须手动关闭它 即使x
  • 如何在jquery中通过url发送json并在下一个html页面上解析它?

    我想通过 url 将 json 数据发送到下一个 html 页面 我通过模拟器检查了它 因为我正在为移动应用程序工作 网址无法重定向到下一页 它目前正在崩溃 这背后的原因是什么 我如何在下一页解析它 我是 jquery 新手 有什么想法吗
  • 如何将我们自己的选项添加到“使用完成操作”菜单

    我想从 使用完成操作 弹出菜单运行我的应用程序 我创建了一个小应用程序 它是 文件编辑器 当我单击任何文件管理器中的任何 txt 文件时 我希望我的应用程序也位于 使用 popmp 菜单完成操作 中 您需要向 Android manifes
  • 在 Ubuntu 20.04 上设置 ONNX 运行时(C++ API)

    我目前正在尝试让我的图像处理程序在 Ubuntu 来自 Windows 上运行 我已经成功构建并链接了 OpenCV 和 Boost 库以与我的 cpp 程序一起使用 但是我还没有找到任何关于在 Ubuntu 20 04 上设置 Onnx
  • r动画,参数曲线

    我正在使用动画包来绘制参数曲线 x sin t 和 y sin t 2 以及使用以下代码追踪曲线的圆 require animation x lt seq 1 1 length 20 y lt x 2 plot x y type l lib
  • execve("/bin/sh", 0, 0);在管道中

    我有以下示例程序 include
  • 从私有 Docker 注册表中删除镜像的方法

    我设置了一个私有 Docker 注册表 并且我已将其他计算机上的一些映像推送到此注册表 它是一个 V2 注册表 我不知道从存储库中删除图像的新方法 因为这些推送的图像没有在 CLI 中列出 docker 图像 谁能建议我从磁盘中删除这些图像
  • 为 302 重定向到的另一个域设置 cookie

    这个问题比其他任何问题都更像是一个现实检验 我很确定这是可能的 但想确定一下 我正在编写一个代理服务器 它接收 HTTP 请求 将它们传递到远程服务器 然后返回远程服务器的响应 我遇到了一个问题 远程服务器响应之一是设置 cookie 的
  • _popen: 不显示 shell 窗口 (SW_HIDE)

    当我在 c mfc 中执行 popen 命令时 它会打开一个我不喜欢的 shell 窗口 是否可以将其隐藏 例如 当您尝试使用 ShellExecute 函数执行命令时 它可以选择使用 SW HIDE 隐藏 shell 窗口 注释来自文档
  • 如何从 django 的查询集中排除非活动用户

    我想从我的项目中排除非活跃用户 example 1 url users 1 friends will show all friends of that user 我想只显示朋友列表中的活跃用户 example 2 url users 1 f
  • 如何在 iOS 上开始使用 ARM?

    只是好奇如何开始了解 iOS 下的 ARM 任何帮助都会非常好 在我看来 最好的开始方式是 编写 C 代码小片段 后来的 Objective C 查看对应的汇编代码 找出足以理解汇编代码的内容 Repeat 为此 您可以使用 Xcode 创