[ASM] Program obliczający silnię

Odpowiedz Nowy wątek
2015-01-05 17:18
0
section .text
global _start

_start:
    mov eax,4
    mov ebx,1
    mov ecx,ARG
middle: 
    cmp ecx,1
    jle end ;; skok, jeśli mniejsze lub równe
    imul    ebx,ecx
    dec ecx
    jmp middle

end:
    mov eax,1
    int 80h

section .data

ARG equ 4

Prosiłbym o pomoc w zdiagnozowaniu, dlaczego program nie wyświetla wyniku (24) na konsoli. Makefile napisany, nie wyświetla żadnych komunikatów, kompilacja przebiega prawidłowo, natomiast wyniku jak nie było, tak i nie ma.

edytowany 1x, ostatnio: Ceplusplus, 2015-01-05 17:19

Pozostało 580 znaków

2015-01-05 17:23
1

Nie rozumiem pytania. Przecież ty tu NIC nie wyświetlasz. Ty tylko robisz exit z wartością kodu błędu 24. Możesz powiedzieć czego sie spodziewałeś?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2015-01-05 17:23

Pozostało 580 znaków

2015-01-05 17:25
1

Nie wywołujesz przerwania więc nic sie nie wypisuje.
Zrób jakaś procedure która będzie wypisywać dane z jakiegoś rejestru i wywołuj ją przy każdej iteracji middle.

edytowany 1x, ostatnio: _borisov8, 2015-01-05 17:26

Pozostało 580 znaków

2015-01-05 20:14
0

Okej, już rozumiem. Zmodyfikowałem kod (wzorując się na innych programach) na tyle, że powinien wszystko wyświetlić (na górze argument, przez który mnożymy, na dole liczbę, która nam wyszła, czyli na górze 3 oraz 6 na dole - które uzyskujemy przez przerabianie zmiennej ARG. Tak to przynajmniej widzę).
Niestety nie wykonują się ani operacje mnożenia, ani dekrementacji (linijka 16 i 17), tak pisze kompilator. Prosiłbym o pomoc. Aktualnie stan pracy jest taki:

section .text
global _start

_start:
    mov eax,4
    mov ebx,1
    mov ecx,ARG
    mov edx,[length]
    int 80h

    mov sil,1

middle: 
    cmp [ARG],sil
    jle end ;; skok, jeśli mniejsze lub równe
    imul    sil,[ARG]
    dec [ARG]
    jmp middle

end:
    mov [ARG],sil
    add [ARG],49

    mov eax,4
    mov ebx,1
    mov ecx,ARG
    mov edx,[length]
    int 80h

    mov eax,1
    int 80h

section .data

ARG db  3, 0ah
length  dd  $-ARG

Prosiłbym o wyrozumiałość - wiem, że mogę jakieś trywialne błędy w tym momencie popełniać.

edytowany 3x, ostatnio: Ceplusplus, 2015-01-05 20:53

Pozostało 580 znaków

2015-01-05 20:31
0

Serio?
cmp sil,[ARG] sil wynosi 1 a ARG 4. Czy sil <= ARG? Jak dla mnie jest, to skaczemy...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-05 20:33
0

Poprawione.

Pozostało 580 znaków

2015-01-05 20:37
0

Poza tym chyba nie do końca rozumiesz jak działa wypisywanie na ekran. Bo wydaje mi się (nie chce mi się szukać specyfikacji do int80h) że wypisujesz stringa. A to znaczy że on oczekuje na ZNAKI w tablicy a nie na LICZBY. Żeby wypisać na ekran 123 nie wystarczy mieć gdzieś liczby 123. Trzeba mieć 3 znaki, 1, 2, 3. Czyli 3 liczby, zgodnie z ASCII -> 49, 50, 51


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-05 20:43
0

W porządku, zmodyfikowałem program powyżej. Wprawdzie nadal program odczytuje liczby jako znaki w ASCII, ale powinien dawać jakieś logiczne rozwiązanie (przynajmniej na namniejszych silniach, od jeden do trzy). Póki co na zajęciach działamy dokładnie w taki sposób.

edytowany 2x, ostatnio: Ceplusplus, 2015-01-05 20:43

Pozostało 580 znaków

2015-01-05 20:48
1

Aaaaa ale teraz to w ogóle robisz źle. Miałes zrobić odwrotnie! Pracować na LICZBACH a na koniec, przed wypisaniem dodać '0' do każdej cyfry. Teraz to robisz jakieś cuda na kiju.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2015-01-05 20:49

Pozostało 580 znaków

2015-01-05 20:53
0
section .text
global _start

_start:
    mov eax,4
    mov ebx,1
    mov ecx,ARG
    mov edx,[length]
    int 80h

    mov sil,1

middle: 
    cmp [ARG],sil
    jle end ;; skok, jeśli mniejsze lub równe
    imul    sil,[ARG]
    dec [ARG]
    jmp middle

end:
    mov [ARG],sil
    add [ARG],49

    mov eax,4
    mov ebx,1
    mov ecx,ARG
    mov edx,[length]
    int 80h

    mov eax,1
    int 80h

section .data

ARG db  3, 0ah
length  dd  $-ARG

Czy w taki sposób?

Pozostało 580 znaków

2015-01-05 21:05
1

Mniej więcej, chociaż za użycie 49 zamiast '0' powinni rwać z ciebie pasy skóry...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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