在linux x86上使用int 0x80的nasm中的mmap

时间:2013-05-04 22:11:58

标签: 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显示在int 0x80之后只有eax被修改。我再次陷入困境。它迟到了,我明天再看看它。

1 个答案:

答案 0 :(得分:2)

一个变化,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