@bond_1013
Начинающий веб-разработчик

Почему выполняются все метки?

Здравствуйте, почему у меня срабатывают все метки и в переменной ans находится результат всех действий а не только определенного, заранее спасибо!
int v, ans, aR1,aR2,aR3;
_asm 
{

    mov eax, 1
    mov ebx, 10

    cmp eax, 1
    jz m1
    cmp eax, 2
    jz m2
    cmp eax, 3
    jz m3
    cmp eax, 4
    jz m4
    jmp m5
    m1:
        imul ebx, 1000
        mov ans, ebx
    m2:
        mov ans, ebx
    m3:
        imul ebx, 10
        mov ans, ebx
    m4:
        imul ebx, 100
        mov ans, ebx
    m5:
        xor eax, eax

}
cout << "SWITCH";
cout << ans;
  • Вопрос задан
  • 94 просмотра
Решения вопроса 2
Adamos
@Adamos
Это же не высокоуровневый язык с case, это асм.
Здесь метки - это именно метки, они просто сообщают ассемблеру адрес следующей строчки для внесения его в бинарный код команды jmp, не добавляя никакой логики выхода наружу на следующей метке.
Вам надо добавить m6: в конце и jmp m6 после каждого из вариантов, кроме последнего.
Ответ написан
@semibiotic
Данная конструкция работает в точности так же (так же неправильно) как switch в Си, в котором в case-ах ошибочно отсутствуют директивы break - выполнение идет через все кейсы, расположенные ниже.

Как сделать аналог break в данном случае, уже сказано (jmp на новую метку в самом конце).

Программа на языке ассемблера выполняется буквально сверху вниз, без каких-либо отклонений. Любое ветвление (в данном случае - обход ненужного кода) должно быть заданно явно инструкциями управления выполнением (jmp, jxx, call. ret, int).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А почему они не должны "срабатывать"? Что может этому помешать?
Просто представьте, что в AX записана единица и выполните всю программу в уме по шагам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы