Не работает системный вызов в inline assembler, в чем проблема?

int main(void)
{
	char *path = "tmp/path";
	asm(
        "movl $39, %%eax\n\t"
        "movl %0, %%ecx\n\t"
        "movl $0x1ff, %%ebx\n\t"
        "int $0x80\n\t" : "r"(path) : "%eax" : "%ebx" : "%ecx"
    );
    return 0;
}
  • Вопрос задан
  • 2707 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Начнём с того, что не "не работает" а даже не компилируется. Потому что
1. у вас единственный in-параметр, его нужно указать после второго двоеточия
2. у вас 3 clobbered регистра, их нужно указать через запятую после третьего двоеточия, т.е.

int main(void)
{
        char *path = "tmp/path";
        asm (
             "movl $39, %%eax\n\t"
             "movl %0, %%ecx\n\t"
             "movl $0x1ff, %%ebx\n\t"
             "int $0x80\n\t"
             : : "r"(path)
             : "%eax", "%ebx", "%ecx"
            );
        return 0;
}


3. собирать надо, судя по коду, под 32 бита, т.е. gcc -m32

А уж после того как скомпилируется -- не работает, потому что

4. у вас перепутан порядок аргументов, в ebx должен идти путь, в ecx -- атрибуты создаваемого каталога
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dinisoid
Почитайте пожалуйста официальную документацию по inline ассемблеру от gnu и многие вещи встанут на свои места, вот вам пример вызова syscall exit
int main(void)
{
__asm__("movl $1,%eax\n\t"         
"xorl %ebx,%ebx\n\t"    
"int  $0x80\n\t");
return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы