繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM