Программа получила сигнал SIGSEGV, Ошибка сегментации.0x56557055 в финале () - PullRequest
0 голосов
/ 29 апреля 2019

Я пишу калькулятор.Это работает нормально, если я заканчиваю процесс сразу после печати ответа, однако я получаю эту ошибку, если я хочу добавить один из подметодов (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

1 Ответ

3 голосов
/ 29 апреля 2019

Две вещи:

  1. в add, он помещает два значения в стек перед вызовом printf, но не удаляет их до ret.Поставьте «add esp, 8» после вызова printf перед повтором.

  2. Чтобы иметь возможность вернуться из add, вам нужно перейти к нему с помощью инструкции «call», а не jmp или jcc.

В качестве альтернативы вы можете просто изменить «ret» в добавлении к «jmp»».Это фактически сделает код добавления частью основной, а не отдельной функции.

...