Announcement

Collapse
No announcement yet.

Linux 32 assembler Nasm speicherzugriffs fehler / loop/ modulo

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Linux 32 assembler Nasm speicherzugriffs fehler / loop/ modulo

    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

    ..............................................

    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

  • #2
    Hallo,

    aus der Beschreibung wird mir nicht ganz klar worum es geht, da mir scheint du verwechselst Zahlen und Ziffern. Eine Zahl besteht aus Ziffern und die Ziffern im Dezimalsystem sind 0-9.

    Wenn die Aufgabe keine Hausaufgabe od. sonst eine Übung ist, würde das heutzutage niemand mehr in Assembler schreiben, da sich das mit Hochsprachen (C, C++, Java, C#, ...) weitaus einfacher lösen lässt.

    Ich hab keinen 32-bit Assembler, nur 64-bit und da hier die Register anders sind wäre das wohl kaum Hilfe für dich.

    Falls du aber eine Hochsprache kannst, so schreib das Programm damit. Wenn du den Assembler-Code brauchst, so lass dir von der Hochsprache Assembler ausgeben (keine Optimierungen sind besser) und bereinige diesen Assembler-Code und gut ist es ;-)


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment

    Working...
    X