Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 致电gtk“您的主要退出原因”;分段故障“;在汇编代码中_Assembly_X86_Segmentation Fault_Gtk_Gtk3 - Fatal编程技术网

Assembly 致电gtk“您的主要退出原因”;分段故障“;在汇编代码中

Assembly 致电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

我正在学习汇编程序(FASM),我有一个奇怪的问题,每当我想调用gtk_main_quit()时,它总是以“分段错误”结尾

为什么调用gtk_main_quit会导致分段错误

test.asm
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