私の問題は、アセンブリ言語を使用して malloc を呼び出すプログラムを作成する必要があることです。ただし、割り当てられた領域のアドレスを取得する方法がわかりません。それはどこかのメモリに保存されますか?もしそうなら、どうすればそれを見つけることができますか?
3 に答える
最も簡単な解決策は、malloc を呼び出し、その結果を簡単に追跡できる処理 (外部変数への格納など) を実行する簡単な C プログラムを作成し、コンパイルして、生成されたアセンブリ コードを確認することです。
例えば:
extern void * somePointer;
extern int someInt;
void callMalloc(void)
{
somePointer = malloc(someInt);
}
これを Linux でコンパイルすると、x86_64 は次のようになります。
movslq someInt(%rip), %rdi
call malloc
movq %rax, somePointer(%rip)
これがまさにあなたがしなければならないことです - にバイト数を入れ、%rdi
を呼び出しmalloc
、 から結果をコピーし%rax
ます。
malloc
はCライブラリ関数であり、すべてのC関数は呼び出し規約と呼ばれるものに準拠しています。これは、引数がどのように渡され、結果がどのように返されるかを説明しています。
アセンブリからC関数を呼び出す場合は、Cコードにどの呼び出し規約が使用されているかを実際に知っておく必要があります。
コンパイラ/ライブラリが異なれば呼び出し規約も異なりますが、最も一般的なものはすべて、eax
x86のレジスタに整数/ポインタ値を返します(少なくともcdecl
Linux /gccおよびWindowsAPIでは当てはまりsyscall
ます)。
malloc
以下を使用して呼び出す例を次に示しcdecl
ます。
push 24 ; Push the number of bytes we want to allocate
call _malloc ; Call malloc
add esp, 4 ; Undo the push
mov dword ptr [eax], 10 ; Set the first dword of the block to 10
mov dword ptr [eax+4], 5 ; Set the second dword of the block to 5
Win32 を実行している場合は、EAX で返されるように見えます (数年前に書いた古いコードを取得すると、マクロがそれを返すように見えます)。