Как мне выйти из встроенного ассемблера?

# #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 goto fail_goto_target: где-то еще в функции. (Конечно, в этом примере cmpxchg лучше всего просто использовать операнд вывода кода условия GCC6, чтобы оставить условие во ФЛАГАХ и позволить компилятору выбрать переход или setcc или что-то еще.)