ASMのプロシージャでローカル変数を設定するにはどうすればよいでしょうか。
ありがとう!!
変数をスタックに格納する場合は、そのためのスペースを予約する必要があります。これは通常、スタックの配置に合わせて配置する、スペースを作成する「変数」のサイズであるSUB ESP,xxx
シーケンスで行われます(通常はxxx
4バイト、8または16にすることもできます)。この規則の唯一の例外は、変数がレジスターにある場合です。この場合、PUSH
そのレジスターでを実行できます。
このスペースは関数の終了時にクリーンアップする必要があるためPUSH
、レジスターを編集した場合は、POP
それを行う必要があります。または、最初に編集したサイズ/スタックサイズに合わせて編集したレジスターのサイズはADD ESP,xxx
どこxxx
でしたか。SUB
PUSH
読み取りと書き込みはを使用して行われMOV
ますが、スタックフレームがある場合とない場合の2つのケースがあるため、ここで少し注意が必要です。
スタックフレームがないと、スタック上の関数の引数を補正する必要があるため、より多くの計算が必要になります。したがって、関数が2つの引数を取り、スタック上の整数にスペースを割り当てる場合、を介して書き込むことができますMOV [ESP + 0xC],value
。読み取りは同じです。MOV EAX,[ESP + 0xC]
。
スタックフレームを使用すると、引数はに正のインデックスを取り、EBP
割り当てられたメモリはから負のインデックスを取りますEBP
。したがって、上記の同じ例では、を実行しますMOV EAX,[EBP-4]
。
ご覧のとおり、これは少し注意が必要です。より良い方法は、必要なものを表すCまたはC ++コードを作成し、それをコンパイルして-O0
(スタック変数がレジスターに削除されないように最適化せずにコンパイルします)、それを逆アセンブルすることです。コンパイラがそれをどのように行うかを見てください。