Помогите с опкодом

  • Автор темы Удалённый пользователь 130661
  • Дата начала
Статус
В этой теме нельзя размещать новые ответы.
У

Удалённый пользователь 130661

Гость
Автор темы
За что отвечает опкод 0050: gosub @TeMp
 

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,319
За что отвечает опкод 0050: gosub @TeMp
Существует три варианта переходов:

1. условные - 004d: jump_if_false @label
2. безусловный - jump @label
3. переход с возвратом (вызов процедуры) - gosub @Label

Условные переходы применяются в проверках, например:

if
< -- условие -->
004d: jump_if_false @label
<-- код -->

:label
Принцип работы таков: если условие данной проверки не выполнено, то переходим на метку :label.
Код (<-- код -->), который находится ниже 004d: jump_if_false @label, не выполняется.

Безусловный переход - jump @label, в отличии от условного перехода он выполняется в любом случае.

<-- код -->
jump @label
<-- код1 --> // эта строка игнорируется
такая запись бессмысленна, поскольку <-- код1 --> никогда не будет выполнен.

К примеру, есть необходимость при выполнении условия игнорировать <--код провала-->:

if
< -- условие -->
004d: jump_if_false @label
<-- код -->
jump @label_1

:label
<-- код провала-->
jump @label_3 //выход

:label_1
В случае выполнения условия переходим на метку :label_1, то есть <-- код провала--> (метка :label) не выполняется.

Переход с возвратом (вызов процедуры) - gosub @Label.

gosub – это переход с возвратом на следующую после gosub @Метка строку.
gosub всегда работает в паре с return.

:Lable
gosub @Label_1 // переход на метку Label_1
< -- код -->
// этот код будет выполнен только после того,
// как отработает пара gosub @Label_1 - return
jump @Label_2 // Безусловный переход на метку :Label_2

:Label_1
< -- код 1-->
return //– возврат на следующую после gosub @Label_1 строку

:Label_2

В San Andreas поддерживается до 8 вложенных gosub.

Принцип работы:
:Lable
gosub @Label_1 // (1) – переход на метку Label_1
< -- код --> // последним будет выполнен этот код
jump @Label_4

:Label_1
gosub @Label_2 // (2) – переход на метку Label_2
< -- код -->
return // (1) – возврат на следующую после gosub (1) строку

:Label_2
gosub @Label_3 // (3) – переход на метку Label_3
< -- код -->
return // (2) - возврат на следующую после gosub (2) строку

:Label_3
< -- код -->
return // (3) - возврат на следующую после gosub (3) строку
В примере показана работа трех вложенных gosub. Команда return будет отрабатывать в обратном порятке, то есть сначала отработает пара gosub @Label_3 - return // (3), затем пара gosub @Label_2 - return // (2) и только после этого отработает пара gosub @Label_1 - return // (1)

Говоря проще каждому gosub соответствует свой return.
 
Статус
В этой теме нельзя размещать новые ответы.