Почему выполняются все метки?
Это же не высокоуровневый язык с case, это асм. 
Здесь метки - это именно метки, они просто сообщают ассемблеру адрес следующей строчки для внесения его в бинарный код команды jmp, не добавляя никакой логики выхода наружу на следующей метке. 
Вам надо добавить m6: в конце и jmp m6 после каждого из вариантов, кроме последнего.
Данная конструкция работает в точности так же (так же неправильно) как switch в Си, в котором в case-ах ошибочно отсутствуют директивы break - выполнение идет через все кейсы, расположенные ниже.

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

Программа на языке ассемблера выполняется буквально сверху вниз, без каких-либо отклонений. Любое ветвление (в данном случае - обход ненужного кода) должно быть заданно явно инструкциями управления выполнением (jmp, jxx, call. ret, int).