Вернуться с прыжка на главную - PullRequest
0 голосов
/ 10 мая 2019
_main:
    .
    ..
    ...
    call label_1 
    operation_a
    ...
    ..
    .

"call" помещает адрес label_1 в стек и выполняет его код. Чтобы продолжить выполнение «operation_a» и т. Д., «Label_1» должен содержать «ret», который выскакивает адрес label_1 и продолжается с «operation_a» и т. Д.

В моей проблеме у меня есть

_main:
    .
    ..
    ...
    je label_1 
    operation_a
    ...
    ..
    .

В этом случае «je» выполняет переход к label_1, поэтому я не могу добавить «ret» к набору инструкций в «label_1», тогда ...

Как я могу вернуться с этого перехода к основному коду? есть ли условный переход, который «вызывает» метку?

Друг упомянул, что я могу добавить «jmp aux_label» в конце label_1 и добавить «aux_label» в основную функцию, но если мне случится сделать много «je», я в итоге создам много меток .

1 Ответ

0 голосов
/ 10 мая 2019

Нет такой вещи как условный вызов.Но вы можете объединить вызов с условным переходом:

  ...
  jne no_call
  call label_1 
no_call:
  operation_a
  ...

Таким образом, если условие равенства не выполняется, вы перепрыгиваете команду call и вызов не происходит.Если условие равенства выполнено, JNE ничего не делает, вы делаете call, а затем ret из него до operation_a.

no_call - это не операция, это метка.Таким образом, адрес no_call и адрес operation_a - это одно и то же, в случае, если это было неясно.

Фокус «JNE для метки на несколько строк ниже» настолько близок, насколько это возможно.оператор if() в сборке.

Создание большого количества меток является прискорбным фактом при кодировании в сборке.:)

...