[英]How to embed a asm code block into c program which is compiled with clang and will be run on Android
众所周知,我们可以将 asm 代码嵌入到 C 程序中,如下所示。
void make_dir() {
int ret = 0;
char *dir = "./test_asm";
int mode = 0777;
asm volatile(
"movl $39, %%eax\n\t"
"int $0x80\n\t"
"movl %%eax, %0\n\t"
: "=m"(ret)
: "b"(dir), "c"(mode));
}
但是当我在 Android Studio 中使用 clang 在 android 上编译它时会出现构建错误。 错误信息如“Error:(96, 7) error: invalid input constraint 'b' in asm”。
为什么会发生这种情况?
您尝试组装的代码不是创建目录的好方法。 它特定于 32 位 x86 处理器,不能为几乎所有 Android 设备中的 ARM 处理器组装或运行。 这是有问题的,因为它没有声明它破坏了 EAX 寄存器,并且使用内存输出操作数并编写自己的 mov 存储而不只是告诉编译器它可以找到结果的位置(在 EAX 中使用“=a”(在 EAX 中)是愚蠢的( ret))。
如果这个汇编代码片段是你知道的在 C 中创建目录的唯一方法,那么你需要学习正常的 C 方法。 这将适用于相当现代的 Android 版本(至少 5.0 及以上版本,我从未看过任何更旧的版本)、它们运行的任何处理器,以及几乎任何源自 UNIX 的操作系统。 它更易于阅读和维护,并且没有显着的速度损失。 这是一个简单的例子:
#include <sys/stat.h>
void make_dir() {
char *dir = "./test_asm";
int mode = 0777;
if (0 != mkdir( dir, mode)) {
printf( "Directory creation failed\n");
}
}
mkdir 调用及其返回值在几乎所有关于 C 的书籍和任何合适的开发人员工具集的文档中都有更详细的解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.