0

ASMのプロシージャでローカル変数を設定するにはどうすればよいでしょうか。

ありがとう!!

4

1 に答える 1

18

変数をスタックに格納する場合は、そのためのスペースを予約する必要があります。これは通常、スタックの配置に合わせて配置する、スペースを作成する「変数」のサイズであるSUB ESP,xxxシーケンスで行われます(通常はxxx4バイト、8または16にすることもできます)。この規則の唯一の例外は、変数がレジスターにある場合です。この場合、PUSHそのレジスターでを実行できます。

このスペースは関数の終了時にクリーンアップする必要があるためPUSH、レジスターを編集した場合は、POPそれを行う必要があります。または、最初に編集したサイズ/スタックサイズに合わせて編集したレジスターのサイズはADD ESP,xxxどこxxxでしたか。SUBPUSH

読み取りと書き込みはを使用して行われMOVますが、スタックフレームがある場合とない場合の2つのケースがあるため、ここで少し注意が必要です。

スタックフレームがないと、スタック上の関数の引数を補正する必要があるため、より多くの計算が必要になります。したがって、関数が2つの引数を取り、スタック上の整数にスペースを割り当てる場合、を介して書き込むことができますMOV [ESP + 0xC],value。読み取りは同じです。MOV EAX,[ESP + 0xC]

スタックフレームを使用すると、引数はに正のインデックスを取り、EBP割り当てられたメモリはから負のインデックスを取りますEBP。したがって、上記の同じ例では、を実行しますMOV EAX,[EBP-4]

ご覧のとおり、これは少し注意が必要です。より良い方法は、必要なものを表すCまたはC ++コードを作成し、それをコンパイルして-O0(スタック変数がレジスターに削除されないように最適化せずにコンパイルします)、それを逆アセンブルすることです。コンパイラがそれをどのように行うかを見てください。

于 2012-06-05T07:13:06.570 に答える