0

我正在为 linux 编写一个 nasm 中的小型库,并且正在实现 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 之后被修改。我又卡住了。时间不早了,我明天再看看。

4

1 回答 1

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
于 2013-05-05T03:42:56.240 回答