Po pierwsze nie jmp tylko najprawdopodobniej rjmp. To już sobie kompilator sam dobierze w zależności od długości procedury Flaga_z_1. Po drugie nie możesz używać brne jako skoku na koniec jakiegoś podprogramu, bo nie wiesz w jakim stanie będzie flaga Z, ani też nie wiesz jak długa będzie funkcja Flaga_z_1 (brne to skok relatywny, tak samo jak rjmp). Po trzecie Twój program działa źle, bo w przypadku zmiennej o wartości 0b10000000 wykona tylko jedną pętlę i wszystkie warunki Flaga_z_0 dla pozostałych bitów zostaną pominięte. Po czwarte jeśli robisz AND zmiennej z 0b10000000, to musisz przesuwać zmienną w lewo, a nie w prawo, jeśli chcesz przetestować pozostałe bity. Inaczej, cała ta pętla jest bez sensu, bo zwróci wartość tylko najstarszego bitu a dla pozostałych zawsze pokaże 0. Dziwię sie, że jeszcze tego nie zauważyłeś.
Swoją drogą dla higieny zmieniłbym jeszcze swój program w taki sposób:
Zaloguj się, aby zobaczyć kod
Jeszcze jedno. Funkcje Flaga_z_1 i Flaga_z_0 u mnie powinny mieć nazwę Bit_1 i Bit_0 odpowiednio, co widać po komentarzu w tych funkcjach.