调用gtk_main_quit会导致汇编代码中出现“分段错误”

BPS

我正在学习汇编器(FASM),但我遇到奇怪的问题,每当我想调用gtk_main_quit()时,它总是以“分段错误”结尾。

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

测试程序

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`
迈克尔·佩奇

进行函数调用时,请始终确保在调用后正确还原堆栈。您的代码执行此操作:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

nasm汇编中的调用函数时出现分段错误

为什么我在以下代码中出现分段错误?

调用sf :: Window :: close之后,SFML中出现分段错误

什么会导致 GOTO 指令出现分段错误?

使用BigDecimal会导致计算中出现轻微错误

在 for 循环中添加 if 语句会导致“在“}”中出现“意外的 '}””错误

为什么此代码会导致分段错误

从被调用函数访问 malloc 的结构数组会导致分段错误

FFmpeg分段会导致输出中出现可听见的声音

是什么导致此代码中出现 int not subscriptable 错误?

是什么导致我的代码中出现这个未知错误?

将代码移出main()之外时出现分段错误

从C代码调用Cython函数会引发分段错误

获取导致信号处理程序中出现分段错误的寄存器

Codility代码导致分段错误

调用isalpha导致分段错误

在我的特里实现中出现分段错误

在PrintArray()函数中出现分段错误

“程序中出现访问冲突(分段错误)。”

从C程序调用x86汇编函数时出现分段错误

为什么我的汇编代码中出现这些错误(选项案例图:无)?

将 constexpr 更改为 consteval 会导致 MSVC 中出现难以理解的错误消息。编译器错误或有问题的代码?

谁能告诉我为什么我在此C代码中出现分段错误?

难以理解为什么我的代码中出现分段错误(核心已转储)

ubuntu 12.04 yylex()调用中出现分段错误(核心已转储)

此代码会导致套接字io中出现竞争情况吗?

在main()外部访问二维数组会导致运行时分段错误?

为什么我的内联汇编代码会导致三重错误?

退出pthread会导致分段错误