Linux 使用mmap函数创建数组。汇编程序x86_64 AT&;T

Linux 使用mmap函数创建数组。汇编程序x86_64 AT&;T,linux,assembly,x86-64,mmap,system-calls,Linux,Assembly,X86 64,Mmap,System Calls,我想创建一个包含例如4个值的数组 这是我的密码: mov $32,%rsi # 4 x 8bytes mov $9,%rax mov $0,%rdi mov $0x3,%rdx mov $0x01,%r10 mov $0,%r9 syscall 现在我有一个新的地址,在rax中是32字节 当我试图将某些东西放入其中时,例如: mov $0,%r14 mov $3,%rdx mov %rdx,(%rax,%r14,8) 它给我SIGSEGV errormmap需要6个参数,但只传递5个。您忘记

我想创建一个包含例如4个值的数组 这是我的密码:

mov $32,%rsi # 4 x 8bytes
mov $9,%rax
mov $0,%rdi
mov $0x3,%rdx
mov $0x01,%r10
mov $0,%r9
syscall
现在我有一个新的地址,在rax中是32字节

当我试图将某些东西放入其中时,例如:

mov $0,%r14
mov $3,%rdx
mov %rdx,(%rax,%r14,8)

它给我SIGSEGV error

mmap
需要6个参数,但只传递5个。您忘记为文件描述符设置
r8
。假设您想要分配匿名内存,那么应该将其设置为
-1
,当然
MAP\u anonymous
也应该在标志中设置


PS:如果您有可用的C库,分配内存的简单方法就是调用
malloc()

系统调用后
rax
的值是多少?是否映射失败(0xFFFFFFFFFFFFFFFF)?此外,对于系统调用,系统调用进入
rax
,参数按顺序进入寄存器
rdi rsi rdx r10 r8 r9
。对于
void*mmap(void*addr,size\u t length,int prot,int flags,int fd,off\u t offset)这意味着addr->rdi,length->rsi,prot->rdx,flags->r10,fd->r8和offset->r9。为什么不设置r8?rax在系统调用后有0xFFFFFFFFFFFFF7。r8默认为0,我已将其更改为-1
mov$-1,%r8
并将r10设置为3(map\u匿名)。现在我已收到rax
0xFFFFFFFFFFFFFF
(map\u失败)您必须保留
map\u私有
标志,或将其设置为
map\u匿名
。规则是,必须指定
MAP_PRIVATE
MAP_SHARED
中的一个,但不能同时指定两个,此外,还必须指定零个或多个其他标志,包括
MAP_ANONYMOUS
。现在我将1放入r10
mov$1,%r10
作为
MAP_PRIVATE
,syscal之后的rax现在是
0xffffffffffffed
,但是当我想在这个
mov%rdx上做一个操作时,(%rax,%r14,8)
它给了我SIGSEGV错误,我发现
MAP_PRIVATE
是0x1,
MAP_ANONYMOUS
是0x3,在对01和11进行OR操作之后,我得到了与0x3相同的11。我尝试在r10中输入1,2,3,4,5,6,7数字,始终以SIGSEGV error结尾。r8为0,我已将其更改为-1
mov$-1,%r8
,并将r10设置为3(map_匿名)。系统调用rax为0xFFFFFFFFFFFFFF后-映射失败。我想在没有C库的情况下实现它
MAP\u匿名
is
0x20
MAP\u私有
is
0x02
()。。。不确定从何处获得错误的值。所以,
MAP_ANONYMOUS | MAP_PRIVATE
gives
0x22
。OP没有指定他所在的系统,两个标志的值对我来说都是陌生的,但现在是时候问一下了。。。就这一点而言,是马赫数的值<代码>#定义映射_private0x0002
#定义映射_anon0x1000
@皮奥多,你在开发什么系统?Linux?雨衣?完全不同的东西?我在Ubuntu Linux上工作。我在r10中加入了0x22,它似乎可以工作。谢谢你们杰斯特和我,谢谢你们把你们的时间浪费在像我这样的人身上。我真的很感谢你的帮助。谢谢