Сборка: почему переход к метке, возвращаемой через ret, вызывает ошибку сегментации?

В руководстве по сборке Linux говорится:

Следует помнить одну очень важную вещь: если вы планируете вернуться из процедуры (с помощью инструкции RET), не переходите к ней! Как в "никогда!" Это приведет к ошибке сегментации в Linux (которая в порядке - все, что делает ваша программа - завершается), но в DOS это может взорвать вас в лицо с различной степенью ужасности.

Но я не могу понять, почему это вызывает ошибку сегментации. это звучит так же, как возвращение из функции.

У меня есть ситуация, когда мне нужно реализовать логику "Если X случится, вызовите процедуру A. В противном случае вызовите процедуру B." Есть ли другой способ, кроме как прыгать как спагетти-код кенгуру?

2 ответа

Решение

Так как CALL помещает текущий адрес инструкции в стек и RET тянет его, чтобы вернуться на сайт вызова. JMP (и соответствующие инструкции) ничего не кладите в стек.

Я думаю, что этот совет может иметь отношение к трубопроводу, но я не уверен.

Я считаю, что вопрос, который вы задаете:

... subroutine entrypoint ...
... various instructions in a routine ...
jmp label
... move instructions in a routine...
label:
ret

В чем проблема, если таковая имеется, с этим? Во-первых, я не уверен, что это вообще проблема. Но если это так, это трубопровод. На некоторых процессорах одна или несколько инструкций после jmp будут выполнены до того, как управление переместится на метку.

В основном я боюсь, что вы неправильно поняли то, что прочитали, или я неправильно поняла то, что вы написали. Переход от одной точки в подпрограмме к инструкции ret должен быть в порядке. jmp-ing вместо выполнения ret - это, как говорили другие люди, глупая идея.

Другие вопросы по тегам