Как встроить блок кода ASM в программу C, которая скомпилирована с Clang и будет работать на Android - PullRequest
0 голосов
/ 24 декабря 2018

Как известно, мы можем встроить ассемблерный код в программу на 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));
}

Но при компиляции на андроиде с помощью clang в android studio будет ошибка сборки.Сообщение об ошибке выглядит так: «Ошибка: (96, 7) ошибка: недопустимое ограничение ввода« b »в asm».Кто-нибудь может помочь объяснить, почему это так?Большое спасибо!

1 Ответ

0 голосов
/ 30 декабря 2018

Код, который вы пытаетесь собрать, не является хорошим способом создания каталога.Он специфичен для 32-битных процессоров x86 и не может собираться или работать на процессорах ARM, которые есть практически на всех устройствах Android.Он глючит, потому что не может объявить, что он забивает регистр 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");
    }
}

Вызов mkdir и его возвращаемое значение объясняются более подробно практически в любой книге по Си и в документации любого достойного набора инструментов разработчика.

...