1

単純なヘビのようなゲームを 32 ビット x86 AT&T アセンブリで作成しようとしていますが、奇妙な問題が発生しました。ncurses を使用して画面に出力するなど、いくつかのタスクに使用する C 関数がいくつかあります。この特定の関数 はsnake_print、次のようになります。

snake_print(int x, int y, int ch){
    mvprintw(y,x,"%c",ch);
    wrefresh(screen);
}

画面上put_charの文字をどこに置き、それを更新します。変数はグローバルです。chrefresh_scrscreen

したがって、これを呼び出すには、次のようにいくつかの値をスタックに置きます。

subl  $12,%esp
pushl $'o'
pushl $15
pushl $15
call snake_print
addl  $12,%esp

snake_print関数から GDB を使用してスタックを見ると、本来のように見えます。正しいスタック コンテンツで関数から戻るはずの場所に移動すると、何かが発生します。GDBが実行中のコードとしてマークインすると、値}がへの呼び出しとともにスタックに置かれます。実行されるコードの次の行は、再び、セグメンテーション エラーが発生します。snake_print0x804d190snake_print(0x804d190,15,111)refresh_scr(scr)

0x804d190GDB で調べたところ、値が含まれていることがわかりました0x10000f。への新しい呼び出しでsnake_printは、以前の x 値 15 が 0x804d190 に交換されているため、x 値が格納されていたメモリ アドレスに何かが起こったように見えます。オフ」、いわば。

なぜこれが起こるのかまったくわからないので、誰かが何が悪いのかを理解するのを手伝ってくれるのだろうかと思っていましたか?

4

1 に答える 1