i want to call mmap syscall. In C code this was success, but from asm i have returned -9(bad file descritor) returned value after syscall instruction.
- Where is the mistake?
- Do I understand correctly that if after the system call instruction in the register eax the number is less than zero, then it can be converted to errno, and if more, then this is the returned address?
asm code:
.text
.globl _start
.set PROT_READ, 0x1
.set PROT_WRITE, 0x2
.set MAP_PRIVATE, 0x2
.set MAP_ANONYMOUS, 0x20
_start:
pushq %rbp
movq %rsp, %rbp
movl $PROT_READ, %ecx # PROT_READ
orl $PROT_WRITE, %ecx # PROT_WRITE
movl $MAP_PRIVATE, %r9d # MAP_PRIVATE
orl $MAP_ANONYMOUS, %r9d # MAP_ANONYMOUS
movl $9, %eax
movq $0, %rdi
movq $24, %rsi
movl %ecx, %edx
movl %r9d, %ecx
movl $-1, %r8d
movl $0, %r9d
syscall
mov %rax, %rbx
movl $1, (%rbx) # store value
popq %rbp
retq
C code:
#define MAP_ANONYMOUS 0x20
int a = PROT_READ | PROT_WRITE; // result 3
int b = MAP_PRIVATE | MAP_ANONYMOUS; // result 34
void *ptr = mmap (NULL, 7, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);