### Demo-Programm für MIPS für die Vorlesung ###
###        "Grundlagen der Informatik"       ###
###               Jörg Roth                  ###
###
### asciitoint: Umwandeln einer Zeichenkette in die entsprechende ganze Zahl
### - Es findet keine Überprüfung statt, ob die Zahl nur aus Ziffern besteht.
### - Es wird angenommen, dass die Zeichenkette mit 0x00 oder 0x0A beendet wird. Bei jedem Zeichen <0x30 ('0') wird die Umrechnung beendet.
###
### [str]: Speicherbereich für die Zeichenkette
### $s0:   Ergebnis
### $s1:   Zeiger auf das nächste Zeichen der Zeichenkette
### $s2:   Konstante 10 zur Multiplikation
### $s3:   Konstante 48 zur Umrechnung der ASCII-Ziffern in Ganzzahl-Werte
### $s4:   hält das aktuelle Zeichen der Zeichenkette

        .data
str:    .space 100
	.text
main:
     li $v0, 8              # Eingabe einlesen
     la $a0,str
     li $a1, 100    
     syscall                # in str steht der 0-terminierte String

### Hier beginnt die Berechnung ###

     addi $s0,$zero,0       # $s0 := 0; hier wird das Ergebnis aufsummiert
     la $s1,str             # $s1 := &str; hier wird der Zeiger auf das nächste Zeichen gehalten
     addi $s2,$zero,10      # $s2 := 10; hier steht konstant die 10 zur Multiplikation
     addi $s3,$zero,48      # $s3 := 48; hier steht konstant die 48, um die ASCII '0' in den Wert 0 umzuwandeln

loop:
     lb $s4,($s1)           # Lade nächstes Zeichen des
     sub $s4,$s4,$s3        # Bilde ASCII-Ziffer auf Integer-Wert [0..9] ab
     bltz $s4,terminate     # Wenn Zeichen <'0', also insb. wenn 0x0A (Return) oder 0x00 (Stringende)
     mult $s0, $s2          # 
     mflo $s0               # $s0 := $s0 * 10;
     add $s0,$s0,$s4        # $s0 := $s0 + Ziffernwert;
     addi $s1,$s1,1         # $s1 := $s1 +1; also auf nächstes Zeichen im String setzen
     j loop
terminate:

### Hier endet die Berechnung ###

     li $v0, 1              # Resultat ausgeben
     or $a0, $zero, $s0     # in $s0 stand das Ergebnis
     syscall

