Assembly 致电gtk“您的主要退出原因”;分段故障“;在汇编代码中
我正在学习汇编程序(FASM),我有一个奇怪的问题,每当我想调用gtk_main_quit()时,它总是以“分段错误”结尾 为什么调用gtk_main_quit会导致分段错误 test.asmAssembly 致电gtk“您的主要退出原因”;分段故障“;在汇编代码中,assembly,x86,segmentation-fault,gtk,gtk3,Assembly,X86,Segmentation Fault,Gtk,Gtk3,我正在学习汇编程序(FASM),我有一个奇怪的问题,每当我想调用gtk_main_quit()时,它总是以“分段错误”结尾 为什么调用gtk_main_quit会导致分段错误 test.asm 对gtk_main_quit的调用导致gtk_main返回,在调用执行窗口句柄后继续执行,可能还有文本“destroy”。很难准确预测会发生什么 添加ret在call gtk_main之后,调用gtk_main_quit会导致gtk_main返回,在调用执行窗口句柄后,执行继续,可能还会出现文本“dest
对
gtk_main_quit
的调用导致gtk_main
返回,在调用执行窗口句柄后继续执行,可能还有文本“destroy”。很难准确预测会发生什么
添加
ret
在call gtk_main
之后,调用gtk_main_quit
会导致gtk_main
返回,在调用执行窗口句柄后,执行继续,可能还会出现文本“destroy”。很难准确预测会发生什么
进行函数调用时,在调用gtk_main后添加
ret
,,始终确保调用后正确恢复堆栈。您的代码执行以下操作:
push [window_handle]
call gtk_widget_show
add esp, 8
您将一个DWORD作为正确的参数推送到堆栈上,但在调用gtk_widget_show
后,您将8添加到ESP。由于您只在堆栈上推送了4个字节,这将不正确地恢复ESP。一个副作用是,函数main
的返回地址现在将位于错误的位置,这可能会在main
函数返回时产生分段错误。守则应该是:
push [window_handle]
call gtk_widget_show
add esp, 4
这就引出了第二个问题。您的代码:
call gtk_main
window_handle dd 0
on_close_signal db 'destroy', 0
在gtk_main
返回后,它将开始执行之后出现在内存中的任何指令。在这种情况下,它恰好是一些变量和内存中的其他任何变量。由于C运行时像调用任何其他函数一样调用了函数main
,因此应该使用ret
返回C运行时,让它干净地关闭程序
代码如下所示:
call gtk_main
ret
window_handle dd 0
on_close_signal db 'destroy', 0
进行函数调用时,始终确保在调用后正确恢复堆栈。您的代码执行以下操作:
push [window_handle]
call gtk_widget_show
add esp, 8
您将一个DWORD作为正确的参数推送到堆栈上,但在调用gtk_widget_show
后,您将8添加到ESP。由于您只在堆栈上推送了4个字节,这将不正确地恢复ESP。一个副作用是,函数main
的返回地址现在将位于错误的位置,这可能会在main
函数返回时产生分段错误。守则应该是:
push [window_handle]
call gtk_widget_show
add esp, 4
这就引出了第二个问题。您的代码:
call gtk_main
window_handle dd 0
on_close_signal db 'destroy', 0
在gtk_main
返回后,它将开始执行之后出现在内存中的任何指令。在这种情况下,它恰好是一些变量和内存中的其他任何变量。由于C运行时像调用任何其他函数一样调用了函数main
,因此应该使用ret
返回C运行时,让它干净地关闭程序
代码如下所示:
call gtk_main
ret
window_handle dd 0
on_close_signal db 'destroy', 0
说得好,但在“call gtk_main”之后添加“ret”后,分段错误仍然存在。说得好,但在“call gtk_main”之后添加“ret”后,分段错误仍然存在。@MichaelPetch lol,这很有帮助,谢谢:D@MichaelPetch哈哈,这很有帮助,谢谢:D@BPS:而不是调用
/ret
,您应该将其优化为jmp gtk_main
@BPS:而不是call
/ret
,您应该将其优化为jmp gtk_main