Как получить доступ и изменить массив символов в C x86 AT & T встроенной сборки - PullRequest
0 голосов
/ 19 мая 2018

У меня проблемы с решением школьного упражнения, я должен изменить массив символов в c, используя встроенную сборку.В этом случае измените «ahoy» на «aXoy», но я получаю ошибку сегментации.Это мой код:

 #include <stdio.h>

    int main() {
        char string[] = "ahoy";
        __asm__ volatile (
                "mov %0, %%eax;"
                "movb $'X', 1(%%eax);"
                : "=m"(string) : "0"(string) : "memory", "eax");
        printf("%s\n", string);
        return 0
    }

с этим: "mov %0, %%eax;" Я пытаюсь сохранить адрес массива в регистре

, затем с этим: "movb $'X', 1(%%eax);" Я хочу сохранить байт'X' в месте, указанном (%% eax) смещением на 1 байт (символ),

У меня есть строка как в качестве вывода, так и ввода, и "memory", "eax" в клоббере, так как ямодифицируя оба.Что не так с моим кодом?

1 Ответ

0 голосов
/ 19 мая 2018

Используйте gcc -S вместо -c, чтобы посмотреть на вывод сборки компилятора, и вы должны увидеть, что не так.Ограничение "m" создает выражение ссылки на память для доступа к объекту, связанному с ним, а не к регистру, содержащему его адрес.Таким образом, он расширится до чего-то вроде (%ecx), а не %ecx, и первый mov загрузит 4 байта из string, а не из адреса string, в eax.

Один из способов исправить это - использовать ограничение регистра "r"(string).

В качестве альтернативы вы можете заменить mov на lea: lea %0, %%eax.

Есть и другиепроблемы с вашим кодом, такие как бесполезный временный / clobber регистр eax, но они не должны мешать ему работать.

...