Wątek przeniesiony 2014-11-16 19:09 z Kosz przez msm.

Pętla wykonuje się nieskończenie wiele razy.

0

Witam, mam problem z pętlą w asemblerze. Jak to zmienić :

segment .text
    global _start

    _start:
    xor esi,esi

    mov>eax,3
    mov>ebx,0
    mov>ecx,zm
    mov>edx,3
    int 80h
    mov al,[zm]
    sub al,48
    mov [a],al



     looped:

    cmp esi,[zm]
    jg end

<------>mov eax, 4
<------>mov ebx, 1
<------>mov ecx,msg
<------>mov edx,14
<------>int 80h
<------>
<------>mov eax, 1
<------>add esi,1
<------>jmp looped
<------>end:
<------>int 80h
<------>
segment .data
zm dd 0
a db 0
msg db "Hello World!",0Ah
0

(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.

0

W jaki sposób mógłbym wczytać zmienną jako liczbę lub zamienić ten tekst na liczbę?

0

Jaki to jest system?
Jaki asembler, jaki linker... takie rzeczy zawsze podajemy jeśli pytanie dotyczy asemblera.

0
Azarien napisał(a):

Jaki to jest system?
Jaki asembler, jaki linker... takie rzeczy zawsze podajemy jeśli pytanie dotyczy asemblera.

NASM, programy pod Linuxem

1 użytkowników online, w tym zalogowanych: 0, gości: 1