出于教育目的,我想向现有的 iPhone 应用程序添加一个用 ARM 汇编语言编写的函数。一般来说,我不需要 ARM 汇编教程,因为我已经读了太多了。我只是不知道如何实际运行代码!
我想做的是这样的:
无用.h:
void useless();
无用.s:
useless:
bx lr
如果这也适用于模拟器,那就太好了...在模拟器上,.s 文件将无法编译,所以我也许应该这样做:
无用.s:
#if I_AM_ARM
useless:
bx lr
#endif
无用.c:
#if !I_AM_ARM
void useless()
{
}
#endif
我知道我使用的语法已损坏,但如何正确编写它? (仅仅因为我想尝试一些内联汇编就破坏模拟器上的应用程序是不可能的......)
第二好的选择是使用内联汇编,但我强烈喜欢非内联汇编。
Thanks!
编辑:我想学习ARM汇编,所以我想找到一种方法来编译ARM汇编代码,并执行ARM汇编代码。
我终于自己找到了答案。其实没那么难。不过我只解决了 32 位 ARM 版本的问题。
无用.h:
void useless();
无用.s:
#ifdef __arm__
.syntax unified
.globl _useless
.align 2
.code 16
.thumb_func _useless
_useless:
//.cfi_startproc
bx lr
//.cfi_endproc
// CFI means Call Frame Information
// Optionally. Use for better debug-ability.
#endif
无用.c:
#ifndef __arm__
void useless()
{
}
#endif
Notes:
CLANG ARM 汇编器语法与您在网络上的示例中看到的有点不同。评论开头为//
and /* multiline comments */
也得到支持。它还理解标准 C 预处理器。如果您指定了arm函数(.code 32
)程序就会崩溃。线路.thumb_func _useless
可以省略,它仍然有效。我不知道这意味着什么。如果您省略.code 16
行,程序崩溃。
有关#ifdef
。对于 ARMv7,__arm__
被定义为。对于 ARMv8,即 iPhone 5S 上的 64 位变体,__arm__
没有定义,但是__arm64__
而是被定义。上述代码不适用于 64 位 ARM 版本。相反,实施来自useless.c
将会被使用。 (我没有忘记ARMv7,只是我目前手中没有带有该拱门的设备,所以我无法测试。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)