assembler obliczanie silni

2

Hej :)
Pierwszy raz piszę coś w assemblerze i nie do końca jeszcze rozumiem jak to właściwie działa (a konkretniej to wydaje mi się, że rozumiem, ale niestety nie działa, więc chyba jednak...). W każdym razie program ma policzyć mi silnię liczby wczytanej z klawiatury. Skomentowałam kod jak najdokładniej, by wyjaśnić też jak przebiega mój proces myślowy... Bardzo będę wdzięczna za informację czemu to nie działa, gdzie popełniam błędy logiczne itd. - ogólnie rzecz biorąc będę wdzięczna za wszelkiego rodzaju wskazówki, bo muszę (i chcę) się tego nauczyć, a póki co wygląda kosmicznie...

section .data
bufor times 60 db 0
wynik times 5 db 0

section .text
global main
main:

wczytaj:
mov eax, 03h      ;funkcja wczytywania liczby z klawiatury
mov ebx, 0        ;standardowe wejście
mov ecx, bufor    ;bufor - miejsce zapisu znaków
mov edx, 1        ;odczytuję jeden bajt
int 80h           ;przerwanie
mov eax, [bufor]  ;kopiuję odczytany znak do eax by móc wykonać porównanie
cmp eax, 20h      ;sprawdzam czy spacja
jne wczytaj       ;jeśli nie spacja odczytuje kolejny znak, tak dlugo az 
                  ;uzyskam liczbe

;zaczynamy liczyc silnie
xor eax, eax        ;czyszcze wszystkie rejestry
xor ebx, ebx
xor ecx, ecx
xor edx, edx

mov ecx, [bufor]     ;kopiuje bufor do ecx
mov al, [bufor]      ;kopiuje bufor do al
dec al               ;zmniejszam al o 1
mul ecx              ;mnoze; al*ecx - zapisuje automatycznie w ax
silnia:
dec al               ;znowu zmniejszam al
mul ax               ;al*ax zapisane w ax
cmp al, 0            ;sprawdzam czy nie osiagnelam 0
jne silnia           ;jesli nie, petla

push ax              ;odkladam sobie wynik na stos

mov eax, 04h         ;funkcja wypisywania
pop ax               ;pobieram ze stosu wynik, zapisujac go w ax
mov [wynik], ax      ;do wynik kopiuje ax
mov ecx, wynik       ;oznaczam miejsce w ktorym znajduje sie wynik
int 80h              ;przerwanie na wypisanie

mov eax, 01h         ;funkcja konczaca
mov ebx, 0
int 80h 
0

W tej chwili jestem w takiej sytuacji, że dosłownie wszystko mnie zadowoli... Czy pomoże to już inna sprawa ;)

0

Skomentowałam kod jak najdokładniej, by wyjaśnić też jak przebiega mój proces myślowy

mov ecx, [bufor] ;kopiuje bufor do ecx
mov al, [bufor] ;kopiuje bufor do al
dec al ;zmniejszam al o 1

O rly?
A jak zrobię tak to to jest dobry komentarz?

uth3:=uth3+utj2; //Dodajemy utj2 do uth3

Tak się kodu NIE komentuje. Komentarz to miejsce na 'przemyślenia' których nie widać na pierwszy rzut oka, coś co jest ukryte między wierszami, a nie tłumaczenie kodu na polski.

nie działa

Tego się domyślamy, jakbyś powiedziała dlaczego nie działa, to to by się przydało.

Zadowoli Cię podpowiedź w postaci kodu (+komentarze), dla DOS (składnia NASM) z założeniem

A wiesz że gotowce nic nie uczą?

0

Nie można mnożyć al przez ecx. Mnożone są rejestry o tych samych wielkościach ;)

Jak zrobić obliczanie silni:
ax - liczba

przerzucamy ax do cx (licznika)
zmniejszamy cx o 1

pętla:
ax*cx
zmniejsz cx
jeśli cx<=0 dalej
jeśli nie pętla

w eax wynik.

Pisane na szybko i jako wskazówka.

0

-123, wiem jak się komentuje poprawnie kod, jednak w tej chwili zależało mi nie na poprawności komentarzy, a największej szczegółowości. Mam mało czasu, uczę się tego języka, nie widzi mi się sytuacja, w której miałabym potem tłumaczyć na forum komuś "co dana rzecz robi" dlatego, bo dla mnie to by jednak okazało się oczywiste. Wybacz moją nadgorliwość.
Co do tego: dlaczego nie działa - cóż, gdybym wiedziała, dlaczego nie działa, to zapewne bym sama błąd poprawiła. Ale fakt, może powinnam opisać trochę precyzyjniej: program się w pełni kompiluje i uruchamia, pobiera liczbę z klawiatury... I kończy. Tyle.
Hmm, Grizz, dzięki, zaraz to sobie przeanalizuję, jednak wydaje się dość oczywiste... Obawiam się natomiast, że mój problem leży albo w złym wczytywaniu liczby albo w tym, że źle sobie wyobrażam to jak jest ona interpretowana w komputerze... Chyba. Nie wiem. Obstawiam, że to główne problemy.

0

A mnie się wydaje że do bufora trafia ciąg 'char' a nie liczba. I tu leży problem.

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