2011-12-09 11 views
0

私は、コードのこの部分を持っている:のx86アセンブラ、追加の奇妙な行動とサブ

openFileToRead: 
sub sp,4 
add sp,4 
ret 

その後、私は自分のコード

call openFileToRead 

で持っているそして今、我々は問題があります。この追加する前に、サブあり、すべての作品を、私はここのように追加してサブを変更する場合:

openFileToRead: 
add sp,4 
sub sp,4 
ret 

すべての地獄の休憩緩いです。レットでは、彼はいくつかの奇妙な場所と記憶に飛び乗る。これらの2つのラベルには違いはありませんが、そこにはあります。何故ですか?

Intel CPUを搭載したWindows XPでmasmを使用してコンパイルすると、16ビットのリンカが使用されます。

+0

あなたがそれに追加するときに 'sp'はオーバーフローしていませんか? –

+0

デバッガを使ってプログラムを実行し、 'sp'の値を確認してください。それが最高の価値を持っているなら、4を追加するとオーバーフローします。 – AusCBloke

+0

いいえ、これは私の小さなスタックではできません。わずか200ワードです。私はデバッグ中の動作を見ていました。spの動きは期待通りです。スタック上の値に問題があります。追加し、次にサブです。 – Andna

答えて

3

あなたは今まであなたが今までpushpopを持つべきではないのと同じ方法で、sub前にスタックポインタにaddを持つべきではありません。

スタックにaddと書かれている場合、基本的には、スタックポインタが指すアドレスより小さいものは、使用する空きメモリです。スタックからのsubが本質的にメモリを割り当てているときです。スタックポインタは高メモリから開始し、物がスタックにプッシュされると低メモリに向かって移動します。

上記のコメントでは、ハンスは割り込みのポイントを持っています。 addの後に何かが支配し、がスタックを使用すると、戻り先アドレスが上書きされます。スタックポインタに追加することで、基本的に "割り当てを解除"しているからです。

3

追加のspの直後に割り込み(例えばクロック・ティック)が返される可能性があります。その正確な時刻にスタック・ポインタの下の(スタック・ポインタの下の) )。

1

私はそれがスレッド/割り込みの問題であると推測します。スタックの変更、スレッドの発生、戻ってブーム。あなたがそのようなあなたのスタックポインタを再生するための書き込み機能します:)

+0

しかし、例えば、私は関数にいくつかの値を渡したいときは、スタックを使うのが良い方法だと思います。関数や他の場所でspを前の場所に移動してそれらの値をポップすると、 spがretの前に正しい位置にあることを確認するだけです。 – Andna

+0

@ user1044110: 'push'の前に' pop'を置かず、減算する前にスタックポインタに決して追加しないでください。 – AusCBloke