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 のみが変更されることを示しています。私は再び立ち往生しています。遅くなりましたが、明日また見てみます。