【问题标题】:Making MMAP macro with x86 asm使用 x86 asm 制作 MMAP 宏
【发布时间】:2013-02-10 01:16:42
【问题描述】:

我正在尝试制作一个宏,它接受一个 ptr 和 mmap 的参数,然后相应地设置它。这是我目前所拥有的:

#define MY_MMAP(PTR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) \
({              \
int x = 90; \
asm  (          \
    "movl %1, %%eax \n"     \
    "movl %2, %%ebx \n" \
    "movl %3, %%ecx \n" \
    "movl %4, %%edx \n" \
    "movl %5, %%esi \n" \
    "movl %6, %%edi \n" \
    "movl %7, %%ebp \n" \
    "int $0x80 \n"          \
    "movl %%eax, %0"      \
    :"=r" (PTR)     \
    : "eax" (x) ,"ebx" (ARG1), "ecx" (ARG2), "edx" (ARG3), "esi" (ARG4), "edi" (ARG5), "ebp" (ARG6) \
    :           \
    );          \
})

但是,当我使用它时,此代码不起作用。有人可以帮帮我吗?

  char * readBuffer;
  MY_MMAP(readBuffer, 0, (sizeOfRead + 1),  PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1 ,0);

这是由 gcc 制作的汇编代码:

 movl %eax, %eax 
 movl $0, %ebx 
 movl %ecx, %ecx 
 movl $3, %edx 
 movl $34, %esi 
 movl $-1, %edi 
 movl $0, %ebp 
 int $0x80 
 mov %eax, %ebx

【问题讨论】:

  • 打扰了,但是调用mmap 有什么问题 - 它是一个需要 6 个参数的函数,你为什么要编写内联汇编来调用它?这也是一个相当昂贵的调用,因此绕过 C 库来删除六条指令并不会给你带来很多好处。至少,试着解释什么是行不通的。
  • 我正在尝试避免使用 libc。只是想提高我的低级编程技能。而且我不知道到底出了什么问题,我遇到了段错误。我认为这与移动信息和类型有关?
  • 你看过生成的汇编器吗?您正在使用除 ESP 之外的每个寄存器,所以如果编译器搞砸了,我并不感到惊讶。避免使用 libc 不是一个好目标!
  • 在描述中添加了 ASM 代码
  • 在内联 asm 中使用这样的 mov 几乎总是一个错误。在进入 asm 语句时,您的约束应该在正确的寄存器中具有值。

标签: c assembly macros x86


【解决方案1】:

您将指针作为参数传递给系统调用,在执行 int 0x80 之前,它应该是 eax 中的 mmaps 系统调用号。

【讨论】:

  • 我不认为这是正确的 - 你的意思是 x 被当作一个指针? PTR 为 =r,即 %%0。
  • 是的,我特意为系统调用设置了一个 int x = 90。
猜你喜欢
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多