Linux 使用mmap函数创建数组。汇编程序x86_64 AT&;T
我想创建一个包含例如4个值的数组 这是我的密码: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个。您忘记
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,我已将其更改为-1mov$-1,%r8
并将r10设置为3(map\u匿名)。现在我已收到rax0xFFFFFFFFFFFFFF
(map\u失败)您必须保留map\u私有
标志,或将其设置为map\u匿名
。规则是,必须指定MAP_PRIVATE
或MAP_SHARED
中的一个,但不能同时指定两个,此外,还必须指定零个或多个其他标志,包括MAP_ANONYMOUS
。现在我将1放入r10mov$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,我已将其更改为-1mov$-1,%r8
,并将r10设置为3(map_匿名)。系统调用rax为0xFFFFFFFFFFFFFF后-映射失败。我想在没有C库的情况下实现它MAP\u匿名
is0x20
和MAP\u私有
is0x02
()。。。不确定从何处获得错误的值。所以,MAP_ANONYMOUS | MAP_PRIVATE
gives0x22
。OP没有指定他所在的系统,两个标志的值对我来说都是陌生的,但现在是时候问一下了。。。就这一点而言,是马赫数的值<代码>#定义映射_private0x0002
和#定义映射_anon0x1000
@皮奥多,你在开发什么系统?Linux?雨衣?完全不同的东西?我在Ubuntu Linux上工作。我在r10中加入了0x22,它似乎可以工作。谢谢你们杰斯特和我,谢谢你们把你们的时间浪费在像我这样的人身上。我真的很感谢你的帮助。谢谢