2016-10-19 13 views
2

実際に使用できるメモリポイントはどれですか? 私は電源に、このアセンブリコードを持っている(a、b)は再帰によって:アセンブリーint x86のアドレスを使用して引数を定義することができます

int power(int x, int y);             * 
;***************************************************************************** 
%define x [ebp+8] 
%define y [ebp+12] 
power: 
    push ebp  
    mov ebp, esp 

    mov eax, y ;move y into eax 
    cmp eax, 0 ;compare y to 0 
    jne l10; ;if not equal, jump to l10 
    mov eax, 1 ;move 1 into eax 
    jmp l20; ;jump to l20, the leave, ret label 

l10: 
    mov eax, y ; move y into eax 
    sub eax, 1 ; y-1 
    push eax ; push y-1 onto stack 
    mov ebx, x ; move x into ebx 
    push ebx ; push x onto stack 
    call power ; call power/recursion 
    add esp, 8 ; add 8 to stack(4*2) for the two vars 
    imul eax, x ; multiply the returned value from call by x 

l20: 
    leave ; leave 
    ret ;ret 

それは、このCコードから直接コード化されています:ASMコードは完璧に動作

int power_c(int x, int y) { 
    if (y == 0) { 
     return 1; 
    } else { 
     return power_c(x, y - 1)*x; 
    } 
} 

、任意の提案の調整は素晴らしいことです、私はまだ組み立てに新しいです。私の質問は、私は実際に引数を定義するためにどのアドレスを使用できますか?ここでは2つありますが、私は次のように使います:

%define x [ebp+8] 
%define y [ebp+12] 

もし私がもっと持っていたら、それを増やすだけですか?すべてがint、4bytesなのでそうですか?

%define x [ebp+8] 
%define y [ebp+12] 
%define z [ebp+16] 
%define a [ebp+20] 
%define b [ebp+24] 

私はより多くの引数を定義する必要があるコードで暗礁に乗り上げるてきた、私はちょうどこれを理解することはできません、任意の助けをいただければ幸いです。

+1

xとyは関数の引数であり、ローカル変数ではありません。彼らは異なった扱いを受ける。 – AShelly

+0

参照してください。私は彼らが違っているとは決して考えなかった。これを明確にしていただきありがとうございます。 – Monkleys

+0

@AShellyこちら、https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Framesで説明しました。問題の変更、チェックを編集します。 – Monkleys

答えて

3

引数がスタックに渡されます。呼び出し元は、呼び出し元がそれらをプッシュする必要があります。スペースは、関数の開始時にすでに予約されています。プロトタイプをpower_c(int x, int y, int z)に変更した場合、zは[ebp+16]になります。

ローカル変数(またはオートマチック)は、お客様の責任です。標準的な方法は、@ Peter Cordesがコメントで言及しているように、必要なスペースをespから差し引くことです。だから、あなたはどうなる、ab変数を作成するには:

sub esp, 8 
%define a [ebp+4] 
%define b [ebp-8] 

注意をこの時点でebp == esp+8います。我々はebpに関連する変数をespではなく定義しているので、スタックポインタを変更するpush命令とpop命令を引き続き使用することができます。この機能を終了する前にespebpmov esp, ebp)に戻して、戻りアドレスが正しく検出されるようにしてください。

+0

https://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#Standard_C_Calling_Conventionsでは、この計画についてかなり説明しています。 – AShelly

関連する問題