程序收到信号SIGSEGV,分段故障。最终()为0x56557055

时间:2019-04-28 22:09:38

标签: assembly segmentation-fault nasm

我正在写一个计算器。如果我在打印答案后立即结束过程,就可以很好地工作,但是如果我想添加一个subMethods(add,sub,mult,div)以返回主方法,则会收到此错误。

在数据部分,我用它来表示答案

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

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

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

1 个答案:

答案 0 :(得分:3)

两件事:

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

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

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