Подтвердить что ты не робот

Assembly 'call' vs 'jmp'

Мне сказали попробовать и использовать "jmp вместо" call ", но" jmp "мне не нравится... когда я прыгаю, он не возвращается (поэтому он никогда не завершается и не в счастливые дни), а вызывает возврат и выход как нормальный.

Я счастлив использовать 'call', но есть ли причина, по которой я должен попытаться преодолеть 'jmp'?

Этот простой код просто показывает, что когда я jmp он никогда не возвращается и не выходит.

_start:

    jmp _Print
    jmp _Exit

ret


_Exit:

    ; normal exit 

ret


_Print

    ; print something

ret

также.. Я запускаю все это в терминале Linux, если это что-то меняет.

4b9b3361

Ответ 1

Ну, во-первых, jmp просто "перескакивает" на метку, которую вы ему даете (это адрес памяти, поскольку программные инструкции хранятся в памяти), а call хранит место, где оно будет возвращено ( ниже инструкции call) в стеке, jmp на метку, а затем в команде ret, jmp назад, в какое место было сохранено (как указано выше, ниже инструкции вызова). Немного разница там, как вы можете видеть. IMHO, я считаю, что это просто просто функции call, поскольку это то, что делает компилятор С++ с функциями, но если вы должны jmp, тогда хорошо, просто убедитесь, что push место возврата или создать другое чтобы вернуться к выполнению некоторого кода.

Ниже приведен пример перехода на другую метку:

_start:



 jmp _Print;



_start_label:



 jmp _Exit;

_Exit:
 ; exit stuff goes here

 ret;     

_Print:

;print stuff goes here

jmp _start_label;

или вы можете просто использовать вызов:)