(Powód przeniesienia - już odpisałem i wysyłałem, szkoda mi było wyrzucać napisanego posta. W sumie chyba nie powinienem bo pytanie faktycznie słabe)
Kończy się jak najbardziej, ale nie robi tego co prawdopodobnie spodziewasz się że robi.
segment .text
global _start
_start:
xor esi,esi
mov eax,3
mov ebx,0
mov ecx,zm
mov edx,3
int 80h ; wczytuje do zm liczbę (zgaduję że tak miało być) - jako tekst
mov al,[zm]
sub al,48
mov [a],al
looped:
cmp esi,[zm] ; porównuje liczbę (w esi) z tekstem
jg end
(...)
Najlepszym rozwiązaniem w takich sytuacjach jest debugger. Gdb nie jest specjalnie dobrym debuggerem do asemblera, ale jak nie ma nic innego...:
(tu miała być cała [krótka] sesja gdb, ale to sie chyba i tak nie nadaje do czytania więc nie ma sensu -> jeśli ktoś jest zainteresowany to http://4programmers.net/Pastebin/3539)
; przed wczytaniem 'liczby'
(gdb) x/4b 0x80490d0 ; w zmiennej zm są same zera (to dword, więc wypisujemy 4 bajty)
0x80490d0: 0x00 0x00 0x00 0x00
(gdb) ni ; wykonujemy syscall
12 ; to wpisałem ręcznie - liczba 12
0x08048098 in ?? ()
1: x/i $pc
=> 0x8048098: mov al,ds:0x80490d0
(gdb) x/4b 0x80490d0 ; teraz sprawdzamy co jest w tej zmiennej
0x80490d0: 0x31 0x32 0x0a 0x00 ; te bajty odpowiadają '1', '2', '\0' w ASCII
(gdb) x/w 0x80490d0
0x80490d0: 668209 ; a taką liczbę widzi komputer, jeśli potraktować je jako liczbę.
Tl;dr - musisz zamienić ten tekst na liczbę zanim będziesz go porównywać z licznikiem.