Моя цель состоит в том, чтобы у меня была страница памяти, которую я могу установить как исполняемый, чтобы в нее можно было вставлять фактический машинный код и выполнять из сборки, как в 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