程序接收信号SIGSEGV,分段故障。最后的0x56557055()

问题描述 投票:0回答:1

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

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

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
assembly segmentation-fault nasm
1个回答
3
投票

两件事情:

  1. 另外,它在调用printf之前在堆栈上推送两个值,但是在ret之前它不会删除它们。在ret之前调用printf之后输入“添加esp,8”。
  2. 为了能够从add返回,你需要使用“call”指令跳转到它,而不是jmp或jcc。

或者你可以改为添加“jmp <some-label-in-main>”中的“ret”。这将有效地使添加代码成为main的一部分而不是单独的函数。

© www.soinside.com 2019 - 2024. All rights reserved.