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
// эта строка игнорируется
такая запись бессмысленна, поскольку никогда не будет выполнен.
К примеру, есть необходимость при выполнении условия игнорировать :
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.