Я пытаюсь сделать макрос, который принимает аргументы ptr и mmap, а затем установить его соответствующим образом. Это то, что у меня есть до сих пор:Создание макроса MMAP с x86 asm
#define MY_MMAP(PTR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) \
({ \
int x = 90; \
asm ( \
"movl %1, %%eax \n" \
"movl %2, %%ebx \n" \
"movl %3, %%ecx \n" \
"movl %4, %%edx \n" \
"movl %5, %%esi \n" \
"movl %6, %%edi \n" \
"movl %7, %%ebp \n" \
"int $0x80 \n" \
"movl %%eax, %0" \
:"=r" (PTR) \
: "eax" (x) ,"ebx" (ARG1), "ecx" (ARG2), "edx" (ARG3), "esi" (ARG4), "edi" (ARG5), "ebp" (ARG6) \
: \
); \
})
Однако этот код не работает, когда я его использую. Кто-нибудь может мне помочь?
char * readBuffer;
MY_MMAP(readBuffer, 0, (sizeOfRead + 1), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1 ,0);
Вот код сборки, сделанный НКУ:
movl %eax, %eax
movl $0, %ebx
movl %ecx, %ecx
movl $3, %edx
movl $34, %esi
movl $-1, %edi
movl $0, %ebp
int $0x80
mov %eax, %ebx
Извините, но что не так с вызовом 'mmap' - это функция, которая принимает 6 аргументов, почему вы пишете встроенный ассемблер, чтобы называть его? Это также довольно дорогостоящий вызов, поэтому bypassinc библиотеки C, чтобы удалить полдюжины инструкций, не собирается собирать вас много. И, по крайней мере, попробуйте объяснить, ЧТО не работает. –
Я экспериментирую с тем, чтобы не использовать libc. Просто пытаюсь улучшить свои навыки программирования на низком уровне. И я точно не знаю, что случилось, я получаю ошибку seg. Я думаю, что это связано с перемещением информации и типов? – Kalon
Вы посмотрели на сгенерированный ассемблер. Вы используете регистр EVERY, за исключением ESP, поэтому я не удивлен, если компилятор испортил это. Избежать libc не является хорошей целью! –