linux - 在 linux x86 上使用 int 0x80 在 nasm 中进行 mmap

标签 linux nasm mmap system-calls

我正在用 nasm 为 linux 编写一个小型库,我正在实现 malloc atm。

代码的 C 表示看起来像

void * malloc(int size) {
    return mmap(0, size, 3, 34, -1, 0);
}

现在我必须将其转换为程序集,但我无法加载参数。

mov eax, 90
; load args (help)
int 0x80
; move adress to eax

我想知道如何将 C 代码转换为 asm。在大多数情况下,系统调用的参数映射顺序与汇编中的顺序相同,但 mmap 需要 6 个参数,而内核最多需要 5 个参数。

我还想知道返回值存储在哪里。

那么,我该如何实现呢。

更新:

代码:

section .data
mmap_arg:  ; ugly
  .addr:   dq 0
  .len:    dq 512
  .prot:   dq 3
  .flags:  dq 34
  .fd:     dq -1
  .offset: dq 0

mmap_test:
  mov eax, 90
  mov ebx, mmap_arg
  int 0x80

它似乎可以正常工作,但是当我在 eax 的地址加载某些内容时,出现段错误。当我用 ebx 替换 eax 时,它运行时没有错误。 谁能确认返回地址在ebx中,或者我在使用ebx时写在.data部分。

Gdb 显示只有 eax 在 int 0x80 之后被修改。我又卡住了。时间不早了,明天再看看。

最佳答案

一个变化,args 定义必须是 dd,而不是 ia32 上的 dq。下面的 mallocSample 函数会将最近分配的内存返回到 eax 中。

        global  main
        extern  printf

        section .data
mmap_arg:  ; ugly
  .addr:   dd 0
  .len:    dd 512
  .prot:   dd 3
  .flags:  dd 34
  .fd:     dd -1
  .offset: dd 0

        section .text

mallocSample:
        ;old_mmap
        mov eax, 90
        lea ebx, [mmap_arg]

        int $80

        ret

main:
        ;malloc sample
        call mallocSample
        push eax
        push    message
        call    printf
        add     esp, 8
        ret
message:
        db      'our malloc gives address: 0x%x', 10, 0

关于linux - 在 linux x86 上使用 int 0x80 在 nasm 中进行 mmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379451/

相关文章:

macos - 在 Mac OSX 上使用 NASM 和 ld

c - linux kernel 2.4.32编译中大量函数的多重定义

linux - 连接文件夹中的大量文件时参数列表太长

linux - 将/var/www 更改为/srv 得到 403

从程序集中调用 expf

macos - 在 Mac OS X Maverick 上安装/编译 NASM 包

linux - 如何在 shell 脚本中读取单个字符

linux - 5 基本的mmap相关查询

python - Python C 模块中的映射——有什么需要注意的陷阱吗?

java - 为什么人们说 MappedByteBuffer 的 mmap 更快?