如何在 iPhone 上进行内联汇编?
它是如何完成的? 我需要采取哪些步骤以及需要考虑哪些陷阱和问题?
How is it done? What steps do I need to take and what pitfalls and gotchas are there to consider?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我已经让它工作了,感谢 Apple Devforums 上的一些内部帮助,您应该注册,如果您是一名专注的 iPhone 开发人员。
首先,它是__asm__(),而不是普通的asm()。
其次,默认情况下,XCode 生成一个编译目标,该目标根据 ARM Thumb 指令集编译内联汇编,因此 usat 未被识别为正确的指令。 要解决此问题,请在目标上执行“获取信息”。 向下滚动到“GCC 4.0 - 代码生成”部分,然后取消选中“Compile for Thumb”。 如果您将 Active SDK 设置为“Device”,那么下面的代码片段将可以正常编译,
当然,现在它无法与 iPhone 模拟器一起使用。 但是 TargetConditionals.h 已经定义了您可以 #ifdef 反对的定义。 即TARGET_OS_IPHONE和TARGET_IPHONE_SIMULATOR。
I've gotten this to work, thanks to some inside help over at the Apple Devforums, you should sign up if you're a dedicated IPhone developer.
First thing's first, it's __asm__(), not plain asm().
Secondly, by default, XCode generates a compilation target that compiles inline assembly against the ARM Thumb instruction set, so usat wasn't recognized as a proper instruction. To fix this, do "Get Info" on the Target. Scroll down to the section "GCC 4.0 - Code Generation" and uncheck "Compile for Thumb". Then this following snippet will compile just fine if you set the Active SDK to "Device"
Naturally, now it won't work with the IPhone Simulator. But TargetConditionals.h has defines you can #ifdef against. Namely TARGET_OS_IPHONE and TARGET_IPHONE_SIMULATOR.
我编写了大量 ARM Cortex-A8 汇编代码。 iPhone 上的 CPU 是 ARM11(据我所知),因此核心指令集是相同的。
您到底在寻找什么? 如果你愿意的话我可以给你一些例子。
编辑:
我刚刚发现在 iPhone 上你必须使用 llvm-gcc 编译器。 据我所知它应该理解 GCC 的内联汇编语法。 如果是这样,所有 ARM 内联汇编器教程也将在 iPhone 上运行。
这是一个非常小的内联汇编函数(C 语言)。 你能告诉我它是否可以在 iphone 上编译并运行吗? 如果它有效,我可以咆哮一下如何在 ARM 内联汇编器中做有用的事情,特别是对于 ARMv6 架构和 DSP 扩展。
应等于:
I write quite a bit of ARM Cortex-A8 assembly-code. The CPU on the iPhone is an ARM11 (afaik) so the core instruction set is the same.
What exactly are you looking for? I could give you some examples if you want.
EDIT:
I just found out that on the iPhone you have to use the llvm-gcc compiler. As far as I know it should understand the inline assembler syntax from GCC. If so all the ARM inline assembler tutorials will work on the iPhone as well.
Here is a very minimal inline assembler function (in C). Could you please tell me if it compiles and works on the iphone? If it works I can rant a bit how to do usefull stuff in ARM inline assembler, especially for the ARMv6 architecture and the DSP extensions.
should be equivalent to:
寄存器也可以在内联汇编中显式使用
The registers can also be used explicitly in inline asm
对于不需要重度浮动操作的应用,建议使用拇指。 Thumb 使代码尺寸更小,并且代码执行速度更快。
所以你应该只在 3D 游戏等应用程序中关闭 Thumb...
Thumb is recommended for application which do not require heavy float operation. Thumb makes the code size smaller and results also in a faster code execution.
So you should only turn Thumb off for application like 3D games...
背景
arm64
iPhone 上的内联汇编
asm 关键字
-ansi
/-std
):使用__asm__
asm
__asm
asm 语法
AFAIK,有很多 asm 语法
AT&T 语法
~=GNU 语法
~=UNIX 语法
英特尔语法
ARM 语法
这里只关注最常用的
GNU/GCC
语法GNU/UNIX 语法
Basic Asm
Extended Asm
My Examples 代码
clang
ARM64
调用ARM64的svc 0x80
文档
Background
arm64
Inline assembly on the iPhone
asm keyword
-ansi
/-std
): use__asm__
asm
__asm
asm syntax
AFAIK, there many asm syntax
AT&T syntax
~=GNU syntax
~=UNIX syntax
Intel syntax
ARM syntax
here only focus on most common used
GNU/GCC
syntaxGNU/UNIX syntax
Basic Asm
Extended Asm
My Example code
clang
ARM64
inline asm to call svc 0x80 for ARM64 using Extended Asm
Doc