Inkrementacja liczby

0

W jaki sposób zwiększyć wczytaną liczbę o 1 i wyświetlić na konsole w assemblerze?

Po wczytaniu:

; read from stdin
mov eax, sys_read
mov ebx, stdin 
mov ecx, time   
mov edx, max_number
int 0x80

w time mam powiedzmy wartość 200

teraz próbuje inkrementować wartość time o 1 i wyświetlić tak:

; increment ( n + 1 ) and display
mov eax, [time]
inc eax
mov [time], eax

; display user input
mov eax, sys_write 
mov ebx, stdout
mov ecx, time
mov edx, max_number
int 0x80

ale dostaję na konsoli krzaki. Domyślam się że to dlatego że w zmiennej 'time' mam tekst i nie mogę go tak sobie po prostu inkrementować.
W takim razie pytanie jak to zrobić poprawnie? zamiata tekstu na liczbe - inkrementacja - i odwrotnie z liczby na tekst i dopiero wtedy wyświetlić? jak wygląda taka zamiana?

0

Za mało informacji. Czym jest "time" u ciebie? Jaką ma wartość po wczytaniu danych?

0

Deklaracja zmiennej time

section .bss
    time      resb 4

Na wejściu podaje 200 i tą wartość mogę wyświetlić bez problemu, teraz jak chcę to inkrementować to muszę zamienić pewnie tekst który mam w zmiennej time na liczbę inkrementować dalej odwrotnie z liczby na tekst i wyświetlić za pomocą sys_write. Tak mi się wydaje ale nie bardzo wiem jak przeprowadzić tą zamiane.

0

Ok zgaduje że faktycznie następuje tu wczytanie danych jako stringa, wiec twoje 200 będzie wczytane jako bajty 0x32 0x30 0x30. Inkrementacja o 1 jest dość prosta bo musisz zmienić to drugie zero (0x30) na jedynkę (0x31) więc wystarczy że inkrementujesz wartość bajtu pod [time+2]. Ale oczywiście nie ładuj tego do eax (bo weźmie 32 bajty!) tylko do al albo ah bo chcesz modyfikować tylko 1 bajt.

0

Możesz sobie inkrementować po jednym bajcie wtedy będą się wyświetlały kolejne znaki ascii, ale w znakach ascii możesz max w 4 bajtach przechować liczbę 9999, a w 4 bajtach może być liczba do max 2^32-1, więc wymagana jest konwersja z dziesiętnego na binarny, chyba umiesz zamienić?

0

Problem w tym że nie wiem co wpisze użytkownik, może to być 5 i wtedy chce wyświetlić 6 a może wpisać 7321. Zawsze chce mu podać wartość o jeden większą niż wpisał.

No i zamiana miedzy jednostkami w assemblerze to nie taka prosta sprawa xd

0

Nikt ci nie zabrania użyć externa i wziąć sobie jakąś funkcję z c atoi np.

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