それで今朝、私は組み立てについて混乱した質問を投稿しました、そして私はいくつかの素晴らしい本物の助けを受け取りました、それは本当に感謝しています。
そして今、私は組み立てを始め、それがどのように機能するかを理解し始めています。
私が理解していると思うことには、スタック、割り込み、バイナリ/ 16進数、そして一般的にほとんどの基本的な操作(jmp、push、movなど)が含まれます。
私が理解するのに苦労していて助けを求めている概念は以下のとおりです-あなたが以下のいずれかに取り組むことができればそれは大きな助けになるでしょう:
- .dataセクションで正確に何が起こっていますか?これらの変数は宣言していますか?
- もしそうなら、後でコードセクションで変数を宣言できますか?そうでない場合は、なぜですか?もしそうなら、どのように、そしてなぜデータセクションを使用するのですか?
- レジスターとは何ですか?変数と比較してどうですか?つまり、それが小さな情報を格納する場所であることを知っています...しかし、それは私には変数のように聞こえます。
- 配列を作成するにはどうすればよいですか?私はこれが一種のランダムに見えることを知っていますが、私はこのようなことをどのように行うのか興味があります。
- 各レジスターの用途に関する一般的な慣行のリストはどこかにありますか?私はまだ完全には理解していませんが、たとえば、プロシージャからの「戻り値」を格納するために特定のレジスタを使用する必要があると言う人がいます-そのようなプラクティスの包括的または少なくとも有益なリストはありますか?
- 私がアセンブリを学んでいる理由の1つは、高水準コードの背後で何が起こっているのかをよりよく理解することです。そのことを念頭に置いて、C ++でプログラミングしているときは、スタックとヒープについてよく考えます。アセンブリでは、スタックが何であるかを知っています-「ヒープ」はどこにありますか?
いくつかの情報:私はIDEとしてWinAsmでmasm32を使用しており、Windows7で作業しています。c++/javaなどの高級言語でのプログラミングの経験が豊富です。
編集:いつものように非常に有益な、みんなの助けに感謝します!素晴らしいもの!最後にもう1つ、スタックポインタとベースポインタ、またはESPとEBPの違いは何でしょうか。誰かが私を助けることができますか?
編集:私は今それを手に入れていると思います...ESPは常にスタックの一番上を指します。ただし、EBPは好きな場所に向けることができます。ESPは自動的に処理されますが、EBPを使用して好きなことを行うことができます。例えば:
push 6
push 5
push 4
mov EBP, ESP
push 3
push 2
このシナリオでは、EBPは4を保持しているアドレスを指しますが、ESPは2を保持しているアドレスを指します。
実際のアプリケーションでは、6、5、および4が関数の引数である可能性がありますが、3および2はその関数内のローカル変数である可能性があります。