如何将asm代码块嵌入到用clang编译并将在android上运行的c程序中

时间:2018-12-24 13:44:39

标签: android c assembly clang

众所周知,我们可以将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上编译它时,会出现构建错误。 该错误消息例如为“错误:(96,7)错误:asm中的无效输入约束'b'”。 有谁可以帮助解释为什么? 非常感谢!

1 个答案:

答案 0 :(得分:2)

您要汇编的代码不是创建目录的好方法。它专用于32位x86处理器,不能为几乎所有Android设备中的ARM处理器装配或运行。这是有问题的,因为它无法声明它掩盖了EAX寄存器,并且使用内存输出操作数并编写自己的mov存储是愚蠢的,而不是仅仅告诉编译器在哪里可以找到结果(在EAX中使用“ = a”( 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");
    }
}

在任何有关C的书以及任何不错的开发人员工具的文档中,都会更详细地说明mkdir调用及其返回的值。