Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用x86 Linux汇编语言中的mmap分配内存_Linux_Assembly_Mmap - Fatal编程技术网

无法使用x86 Linux汇编语言中的mmap分配内存

无法使用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

我已成功打开一个文件,并已将文件描述符(7)存储在文件中,并且已将文件大小(153kb)存储在大小中。也就是说,这个mmap系统调用返回一个-14。我不确定我做错了什么

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位安装的虚拟机。