1

私の問題は、アセンブリ言語を使用して malloc を呼び出すプログラムを作成する必要があることです。ただし、割り当てられた領域のアドレスを取得する方法がわかりません。それはどこかのメモリに保存されますか?もしそうなら、どうすればそれを見つけることができますか?

4

3 に答える 3

2

最も簡単な解決策は、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ます。

于 2012-11-04T22:03:21.710 に答える
0

mallocはCライブラリ関数であり、すべてのC関数は呼び出し規約と呼ばれるものに準拠しています。これは、引数がどのように渡され、結果がどのように返されるかを説明しています。

アセンブリからC関数を呼び出す場合は、Cコードにどの呼び出し規約が使用されているかを実際に知っておく必要があります。

コンパイラ/ライブラリが異なれば呼び出し規約も異なりますが、最も一般的なものはすべて、eaxx86のレジスタに整数/ポインタ値を返します(少なくともcdeclLinux /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
于 2012-11-13T21:32:54.313 に答える
0

Win32 を実行している場合は、EAX で返されるように見えます (数年前に書いた古いコードを取得すると、マクロがそれを返すように見えます)。

于 2012-11-05T20:56:43.057 に答える