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

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

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

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

Ответы [ 2 ]

9 голосов
/ 24 марта 2012

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

0 голосов
/ 24 марта 2012

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

Я полагаю, что вы задаете вопрос:

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

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

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

...