【问题标题】:Program received signal SIGSEGV, Segmentation fault. 0x56557055 in final ()程序收到信号 SIGSEGV,分段错误。 0x56557055 in final()
【发布时间】:2019-04-28 22:09:37
【问题描述】:

我正在写一个计算器。如果我在打印答案后立即结束进程,它工作正常,但是如果我想添加一个子方法(add、sub、mult、div)以返回主方法,我会收到此错误。

在数据部分我有这个来代表答案

final: db "Answer=%d", 10, 0 ;setup for final printed string (printf)

这是抛出段错误的一个实例

add:

add eax,ebx ;add eax and ebx
push eax ;push final eax value to stack
push dword final ;pushes final string using eax as param
call printf ;call printf using final as param
ret ;return

这里调用add方法

cmp ecx, 1 ;compare method value and 1 (if ecx - 1 == 0)
je add ;jumps to add function

【问题讨论】:

    标签: assembly segmentation-fault nasm


    【解决方案1】:

    两件事:

    1. 在 add 中,它会在调用 printf 之前将两个值压入堆栈,但不会在 ret 之前删除它们。在调用 printf 之后,在 ret 之前加上“add esp, 8”。

    2. 为了能够从 add 返回,您需要使用“call”指令跳转到它,而不是 jmp 或 jcc。

    或者,您可以将添加的“ret”更改为“jmp ”。这将有效地使 add 代码成为 main 的一部分,而不是单独的函数。

    【讨论】:

      猜你喜欢
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多