2013-02-10 2 views
0

Я пытаюсь сделать макрос, который принимает аргументы 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 
+3

Извините, но что не так с вызовом 'mmap' - это функция, которая принимает 6 аргументов, почему вы пишете встроенный ассемблер, чтобы называть его? Это также довольно дорогостоящий вызов, поэтому bypassinc библиотеки C, чтобы удалить полдюжины инструкций, не собирается собирать вас много. И, по крайней мере, попробуйте объяснить, ЧТО не работает. –

+1

Я экспериментирую с тем, чтобы не использовать libc. Просто пытаюсь улучшить свои навыки программирования на низком уровне. И я точно не знаю, что случилось, я получаю ошибку seg. Я думаю, что это связано с перемещением информации и типов? – Kalon

+0

Вы посмотрели на сгенерированный ассемблер. Вы используете регистр EVERY, за исключением ESP, поэтому я не удивлен, если компилятор испортил это. Избежать libc не является хорошей целью! –

ответ

0

вы передаете указатель в качестве аргумента системного вызова, он должен быть mmaps системного вызова номер в EAX, прежде чем сделать Int 0x80 ,

+0

Я не думаю, что это правильно - вы имеете в виду, что 'x' берется как указатель? PTR = r, что составляет %% 0. –

+0

Да, я намеренно сделал int x = 90 для syscall. – Kalon

+0

Я не знаю x. Следует снова взглянуть на код. – Santosh

Смежные вопросы