Hallo
ich möchte ein Programm schreiben (in Linux 32 mint ASM / NASM) das mir die Letzte Zahl der Ausweis Nummer( rechts oben am perso) berechnet. Sozusagen gibt man die ersten 9 Zahlen in die Komando Zeile ein und bekommt dann als Ergebnis die 10 / letzte Prüfziffer für das Alter der Person aus. (Rückseite letzte Ziffer der selben Nummer wie vorne)
Wie man diese zahlen rausbekommt ist ganz einfach in der Theorie man multipliziert jede einzelne Zahl des Ausweises nacheinander mit 7,3,1 und summiert diese miteinander. In der Theorie ganz einfach in der Praxis ???. Ich habe jetzt mal ein Programm geschrieben jedoch habe ich denke ich Fehler in der Rechung weiß aber wirklich nicht wo ? Also der Speicherzugriffs Fehler ist weg jetzt jedoch spuckt er mir nur "(null)" aus.
Danke für eure Antworten
..............................................
ich möchte ein Programm schreiben (in Linux 32 mint ASM / NASM) das mir die Letzte Zahl der Ausweis Nummer( rechts oben am perso) berechnet. Sozusagen gibt man die ersten 9 Zahlen in die Komando Zeile ein und bekommt dann als Ergebnis die 10 / letzte Prüfziffer für das Alter der Person aus. (Rückseite letzte Ziffer der selben Nummer wie vorne)
Wie man diese zahlen rausbekommt ist ganz einfach in der Theorie man multipliziert jede einzelne Zahl des Ausweises nacheinander mit 7,3,1 und summiert diese miteinander. In der Theorie ganz einfach in der Praxis ???. Ich habe jetzt mal ein Programm geschrieben jedoch habe ich denke ich Fehler in der Rechung weiß aber wirklich nicht wo ? Also der Speicherzugriffs Fehler ist weg jetzt jedoch spuckt er mir nur "(null)" aus.
Danke für eure Antworten
..............................................
Code:
global main extern printf extern atoi section .data msg: db "Deine Ausweisnummer: %s",10,0 ; zb. LF45PK773 zufälliger string von 8 zeichen // Wo wird dieser String gespeichert in welchem register eax? ebx? ebp? end: db "deine Letzte Pruefziffer ist: %d",10,0 ; Result (9 for this example) Ausgabe der prüfziffer ;Rechenoperatoren Var1: dd 7 ; die variablen 7 3 1 um sie später zu mutliplizieren Var2: dd 3 Var3: dd 1 ;Eingabe Ziffern um sie nach der rechnug in einem speicher aufzubewahren / nötig?oder eher nicht ErsteZ: dd 0 ZweiteZ: dd 0 DritteZ: dd 0 VierteZ: dd 0 FuenfteZ: dd 0 SechsteZ: dd 0 SiebteZ: dd 0 AchteZ: dd 0 NeunteZ: dd 0 section .text main: mov ebx, [esp+0x08] ; typed string to EBX eingegebenen String in ebx moven push dword [ebx+0x04] ; push it on the stack push msg ; our string Unsere msg pusheh für die ausgabe call printf ; ausgeben der msg add esp, 4 ; stack reparieren um 4 call Subprogramm ; Unterprogramm aufrufen für die Rechnung Ausgabe: push end ; end pushen push eax ; ergebnis pushen call printf ; ausgeben add esp, 12 ret Subprogramm: ; Unterporgramm ;First Digit Erste ziffer des eingegbenen strings mov eax, [esp+4] ; take the changed string to integer from the stack mov ebx ,10 ; put in eax 10 mov edx, 0 div ebx ;eax geteilt durch ebx in edx ist meine zahl in eax ist der rest mov ebx, [Var1] mul ebx ; eax*ebx Ergebniss wird wo gespeichert? mov dword [ErsteZ], eax ;Second Digit / Zweite ziffer das selbe nochmal nur dann multipliziert mit 3 und aufbewahren???? mov eax,[esp+4] ; take the changed string to integer from the stack / rest des strings wieder vom stack nehmen mov ebx , 10 ; put in eax 10 mov edx,0 div ebx mov ebx, [Var2] mul ebx ; eax*ebx mov dword [ZweiteZ], eax ;Third Digit / dritte ziffer der zeichen folge wieder das selbe und dann multipliziert mit 1 mov eax,[esp+4] ; take the changed string to integer from the stack mov ebx , 10 ; put in eax 10 mov edx, 0 div ebx mov ebx, [Var3] mul ebx mov dword [DritteZ],eax ;Vierte Zahl mov eax,[esp+4] ; take the changed string to integer from the stack mov ebx , 10 ; put in eax 10 mov edx, 0 div ebx mov ebx, [Var1] mul ebx mov dword [VierteZ],eax ;Fünfte Zahl mov eax,[esp+4] ; take the changed string to integer from the stack mov ebx , 10 ; put in eax 10 mov edx, 0 div ebx mov ebx, [Var2] mul ebx mov dword [FuenfteZ],eax ;sechste Zahl mov eax,[esp+4] ; take the changed string to integer from the stack mov ebx , 10 ; put in eax 10 mov edx , 0 div ebx mov ebx, [Var3] mul ebx mov dword [SechsteZ],eax ;Siebte Zahl mov eax,[esp+4] ; take the changed string to integer from the stack mov ebx , 10 ; put in eax 10 mov edx, 0 div ebx mov ebx, [Var1] mul ebx mov dword [SiebteZ],eax ;AchteZahl mov eax,[esp+4] ; take the changed string to integer from the stack mov ebx , 10 ; put in eax 10 mov edx, 0 div ebx mov ebx, [Var2] mul ebx mov dword [AchteZ],eax ;Neunte Zahl mov eax,[esp+4] ; take the changed string to integer from the stack mov ebx , 10 ; put in eax 10 mov edx, 0 div ebx mov ebx, [Var3] mul ebx mov dword [NeunteZ],eax ; Evtl durch loop bessere lösung??? ;NOW add all digits together mov eax, [ErsteZ] mov ebx, [ZweiteZ] add eax, ebx mov ebx, [DritteZ] add eax, ebx mov ebx, [VierteZ] add eax, ebx mov ebx, [FuenfteZ] add eax, ebx mov ebx, [SechsteZ] add eax,ebx mov ebx, [SiebteZ] add eax, ebx mov ebx, [AchteZ] add eax,ebx mov ebx, [NeunteZ] add eax,ebx ret; ende JMP Ausgabe ;/ gehe wieder zur main ausgabe um die errechnete prüfziffer auszugeben
Comment