# #x86 #intel #inline-assembly
Вопрос:
Предположим, у меня есть немного кода _asm, который выглядит следующим образом:
// Unimportant calculations that end in one of the following Labels
OPTIONA : MOVE EAX, EDX
JMP END
OPTIONB : MOVE EBX, EDX
JMP END
OPTIONC : MOVE ECX, EDX
JMP END
END:
Есть ли способ выйти из части _asm кода без добавления и метки «КОНЕЦ»?
Если бы я использовал C, я бы поменял КОНЕЦ JMP на возврат
Комментарии:
1. Вы не можете «выйти», не имея возможности куда-то пойти. Вам нужно перейти к концу блока asm (что эквивалентно началу кода, сгенерированного компилятором, который следует за ним), и как вы куда-то прыгаете, не имея метки? Почему вы хотите избежать этого? Кроме того, какой компилятор/ассемблер вы используете?
2. Я использую _asm в visual studio. Мне показалось странным, что нужно прыгать в конец сборочного блока, я подумал, что мог бы быть лучший способ сделать это
3. Нет, я так не думаю. Компилятор ожидает, что управление вернется к первой инструкции, следующей за asm, так что именно туда вам нужно перейти. Он не помещает это в стек в качестве обратного адреса или чего-то подобного, так
ret
что это не вариант.4. Кстати, во многих компиляторах
return;
оператор на языке Си компилируется точно в эпилогjmp
функции a — очень похоже на то, что вы пишете здесь от руки.5. @NateEldredge: Ядро Linux использует GNU C asm goto для перехода в какое-либо полезное место во всей функции, а не только внутри оператора asm. например
asm goto("lock cmpxchg %2,%0 / jne %3" : " m"(*ptr), " a"(expected) : "r"(desired) : fail_jmp_target)
, с меткой C gotofail_goto_target:
где-то еще в функции. (Конечно, в этом примере cmpxchg лучше всего просто использовать операнд вывода кода условия GCC6, чтобы оставить условие во ФЛАГАХ и позволить компилятору выбрать переход или setcc или что-то еще.)