无法使用x86 Linux汇编语言中的mmap分配内存
我已成功打开一个文件,并已将文件描述符(7)存储在文件中,并且已将文件大小(153kb)存储在大小中。也就是说,这个mmap系统调用返回一个-14。我不确定我做错了什么无法使用x86 Linux汇编语言中的mmap分配内存,linux,assembly,mmap,Linux,Assembly,Mmap,我已成功打开一个文件,并已将文件描述符(7)存储在文件中,并且已将文件大小(153kb)存储在大小中。也就是说,这个mmap系统调用返回一个-14。我不确定我做错了什么 push %esi #Save non-general-purpose registers push %edi #Save non-general-purpose registers push %ebp #Save non-genera
push %esi #Save non-general-purpose registers
push %edi #Save non-general-purpose registers
push %ebp #Save non-general-purpose registers
movl FILE, %edi #Move file descriptor into edi
movl $0, %ebp #Offset to 0
movl $0x2, %esi #MAP_PRIVATE
movl $0x3, %edx #PROT_READ
movl FSIZE, %ecx #File length
movl $0, %ebx # *addr = NULL
movl $90, %eax #mmap Sys Call
int $0x80 #Call kernel
test %eax, %eax #Error check
js _error
MMAP 90=$5A
使用NASM和Intel语法映射帧缓冲区设备fb0的示例
%define XRes 400h
%define YRes 300h
%define Mapsize (XRes*YRes*4) ; 1024x768x32
section .text
call MAP_FB ; mmap
;----------- Subroutine----
MAP_FB: mov eax, 5 ; syscall nr: open
xor edx, edx
mov ebx, DEVICE ; pointer/offset auf File/Device-Name
mov ecx, 2 ; /usr/include/bits/fcntl.h = O_RDWR
int 80h
mov [FD], eax ; File discriptor
mov ebx, MMAP
mov eax, 5Ah ; mmap(90)
int 80h
mov esi, eax ; pointer mmap-FRAMEBUFFER
ret
section .data
DEVICE DB "/dev/fb0", 0, 0, 0, 0
MMAP: DD 0 ; start - suggest memory address to allocate
DD Mapsize ; length
DD 3 ; prot (PROT_READ + PROT_WRITE)
DD 1 ; flags (MAP_SHARED = 1)
FD: DD 0 ; file discriptor(handle)
DD 0 ; offset into file to start reading
你试过C语言吗?如果你做了,你比较过生成的代码了吗?也试着把你的程序
strace
。我看到sys\u mmap(=90)在ebx
中取一个指向“args”结构的指针。可能的sys_map2(=192)在ebp
中获取参数?您确定这是32位x86吗?如果它是x86_64,那么mmap不是syscall 90(在这种情况下,无论如何,您也不会使用int 0x80)…它是一个运行Ubuntu 32位安装的虚拟机。