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に変換する方法を知りたいです。ほとんどの場合、syscall の引数はアセンブリと同じ順序でマップされますが、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 のアドレスに何かをロードすると、segfault が発生します。eax を ebx に置き換えると、エラーなしで実行されます。返されたアドレスがebxにあること、またはebxを使用しているときに.dataセクションに書いていることを誰かが確認できますか。

Gdb は、int 0x80 の後に eax のみが変更されることを示しています。私は再び立ち往生しています。遅くなりましたが、明日また見てみます。

4

1 に答える 1

2

1 つの変更点として、args の定義は ia32 の dq ではなく dd でなければなりません。以下の 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 に答える