2016-03-26 15 views
1

アセンブラ(FASM)を学んでいて、gtk_main_quit()をコールしたいときはいつでも "segmentation fault"で終わります。gtk_main_quitを呼び出すと、アセンブラコードの "segmentation fault"が発生する

gtk_main_quitをコールするとセグメンテーションフォルトが発生するのはなぜですか?返すために

TEST.ASM

format ELF 

extrn gtk_init 
extrn gtk_main 
extrn gtk_main_quit 
extrn gtk_window_new 
extrn gtk_widget_show 
extrn g_signal_connect_data 

public main 

on_window_close: 
    call gtk_main_quit ; <- segmentation fault 
    ret 

main: 
    push 0 
    push 0 
    call gtk_init 
    add esp, 8 

    push 0 
    call gtk_window_new 
    add esp, 4 
    mov [window_handle], eax 

    push 0 
    push 0 
    push 0 
    push on_window_close 
    push on_close_signal 
    push [window_handle] 
    call g_signal_connect_data 
    add esp, 24 

    push [window_handle] 
    call gtk_widget_show 
    add esp, 8 

    call gtk_main 

window_handle dd 0 
on_close_signal db 'destroy', 0 

メイク

all: 
    ~/apps/fasm/fasm ./test.asm 
    gcc -o test test.o `pkg-config --cflags --libs gtk+-3.0` 
+0

、それが助けた、ありがとう:D – BPS

答えて

4

関数呼び出しを行うときは、呼び出し後必ずスタックを適切に復元するようにしてください。

push [window_handle] 
call gtk_widget_show 
add esp, 8 

あなたは正しいですが、gtk_widget_showするあなたの呼び出しの後、あなたがESPに8を追加パラメータとしてスタックに1つのDWORDを押す:あなたのコードは、これを行います。スタック上に4バイトしかプッシュしていないため、ESPが正しく復元されません。副作用は、関数mainの戻りアドレスが間違った場所になり、main関数が返ってきたときにセグメンテーション違反が生じる可能性があります。コードは次のとおりです。

push [window_handle] 
call gtk_widget_show 
add esp, 4 

これは2番目の問題を引き起こします。あなたのコードは:

call gtk_main 

window_handle dd 0 
on_close_signal db 'destroy', 0 

gtk_main戻った後、それは後にメモリ内に表示されるものは何でも命令を実行を開始します。この場合、何らかの変数やメモリ内の他のものが発生します。 Cランタイムは他の関数と同様に関数mainを呼び出すので、retを使用してCランタイムに戻り、プログラムを正常にシャットダウンする必要があります。

コードは次のようになります。笑@MichaelPetch

call gtk_main 
    ret 

window_handle dd 0 
on_close_signal db 'destroy', 0 
+1

@BPS: 'call' /' ret'の代わりに、これを 'jmp gtk_main'に最適化する必要があります –

1

gtk_main_quit原因gtk_mainに呼び出し、実行はウィンドウハンドルを実行する呼び出しの後に続けて、そしておそらくテキストは "破壊"。何が起こるかを正確に予測することは難しいでしょう。

call gtk_mainの後にretを追加します。

+0

良い点が、 "コールgtk_main" の後に "RET" を追加した後、セグメンテーションフォールトがまだ残っています。 – BPS

関連する問題