我想在32位x86 AT & T彙編中編寫一個簡單的類蛇遊戲,並且我遇到了一個奇怪的問題。我有一些C函數用於某些任務,例如使用ncurses打印到屏幕上。這種特殊的功能,snake_print
,看起來是這樣的:使用32位x86 AT&T彙編調用C函數的問題
snake_print(int x, int y, int ch){
mvprintw(y,x,"%c",ch);
wrefresh(screen);
}
其中put_char
投放在屏幕上的字符ch
和refresh_scr
刷新它。變量screen
是全球性的。
所以,調用這個我把一些值在棧中,像這樣的:
subl $12,%esp
pushl $'o'
pushl $15
pushl $15
call snake_print
addl $12,%esp
當我看從snake_print
函數的棧GDB,它看起來它應該。它向下移動到應該從具有正確堆棧內容的函數返回的地方,然後發生某些事情;當GDB工作人員}
的snake_print
作爲代碼運行時,值0x804d190
被放在堆棧上,同時調用snake_print(0x804d190,15,111)
。執行的下一行代碼是refresh_scr(scr)
,然後出現分段錯誤。
我用0123檢查0x804d190
與GDB,並看到它包含值0x10000f
。因爲在新的呼叫snake_print
,15我以前的x值的0x804d190交換,它似乎有事情發生到被存儲的X值的內存地址,因爲15 = 0xf和我們「只一個「,可以這麼說。
我不知道爲什麼發生這種情況,所以我想知道是否有人可以幫忙弄清楚什麼是錯的?
這有助於很多,謝謝! – Psyberion