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