Проблема при попытке вызвать mmap в 32-битной сборке i386 - PullRequest
2 голосов
/ 27 января 2020

Моя цель состоит в том, чтобы у меня была страница памяти, которую я могу установить как исполняемый, чтобы в нее можно было вставлять фактический машинный код и выполнять из сборки, как в C. Но застрял с вызовом функции. В соответствии с https://syscalls.w3challs.com/?arch=x86

функция mmap может быть вызвана для соответствующей установки регистров. Вот мой ассемблерный код

 mov ebx, 0      ;address
 mov ecx, 4028   ;size
 mov edx, 0x7    ;protection: PROT_EXEC | PROT_WRITE | PROT_READ
 mov esi, 0x22   ;flags: MAP_ANONYMOUS | MAP_PRIVATE
 mov edi, -1     ;fd: according to man page shoud be set to -1
 mov ebp, 0      ;offset: according to man page shoud be set to zero
 mov eax, 0x5a
 int 0x80

Поскольку man-страница не говорит о значении MAP_ANONYMOUS, мне пришлось искать его, я не знаю, * это это правильно. В конце, однако, eax устанавливается на -14. Что я считаю ошибкой. Я делаю что-то не так с регистрами? Действительно ли возвращаемое значение mmap действительно go в eax? В чем проблема? Я использую Nasm для компиляции сборки. Вот как я это делаю

nasm -g -f elf32 test1.asm
ld -m elf_i386 test1.o -o output
...