gpt4 book ai didi

linux - 非法指令 gcc 汇编程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:10 27 4
gpt4 key购买 nike

在汇编器中:

.globl _test

_test:

pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax

pushl %eax
call printf

popl %ebp
ret

从c调用

main()
{
_test("Hello");
}

编译:

gcc -m32 -o test test.c test.s

这段代码有时给我非法指令,有时给我段错误。在 gdc 中,我总是得到非法指令,这只是一个简单的测试,我有一个更大的程序正在运行,但在没有适当的原因后突然停止工作,现在即使我像上面那样从头开始,我总是会遇到这个错误。

我已经将它缩小到 pushl %eax 并调用 printf,如果我注释掉这些行代码运行正常。

有什么想法吗?(我在我的大学 linux 集群上运行该程序,所以我没有更改任何设置..)

最佳答案

你的最后两条指令破坏了堆栈基址指针。任何依赖 ebp(基指针)指向实际堆栈空间的代码都将失败。通常期望 ebp 指向堆栈空间是一个安全的假设,并且在与 C 代码交互时不应使该假设无效。

您正在执行 pushl %eax(或任何其他寄存器)然后执行 popl %ebp。这两个一起与执行 movl %eax, %ebp 具有相同的效果。

我假设您正在尝试返回存储在 eax 中的值。在 C 调用约定中,eax 用于返回值,因此无需推送它或对它做任何事情,只需将值留在其中,其他代码将获取它。如果这不是您想要做的,那么我很困惑您为什么要在此函数末尾推送 %eax。

关于linux - 非法指令 gcc 汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845040/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com