stack, funktion, irgentwie sowas ;-) Auf jedenfall, hab ich ein Problem! ^^



  • Ich versuche gerade, mich weiter in Assembler einzuarbeiten.
    Dafür versuche ich gebräuchliche Funktionen wie strlen, strcmp, strcpy usw. zu implentieren. So nun habe ich ein Problem, aber das wirst ihr ja schon, sonst wäre ich nicht hier, so genug small talk...

    Also, hier der Source, die Stelle an der ich nicht weiter weiß ist kommentiert.
    Ich bedank mich schon mal für evtl. Hilfen 😃

    - nasm
    - linux

    global _start
    
       section .data
    satz1 db 'Hallo!',0x0A,0x00
    satz2 db 'Tschuess!',0x0A,0x00
    satz1_len equ $ - satz1
    satz2_len equ $ - satz2
    
       section .bss
          ;empty
    
       section .text
    _start:
       push  satz2
       push  satz1
       call  strcmp
    
       mov   ebx, ecx
       xor   eax, eax
       inc   eax
       int   0x80
    
    strcmp:                    ; result in EAX
       push  ebp
       mov   ebp, esp
       sub   esp, 8
       mov   esi, [ebp+8]
       mov   edi, [ebp+12]
    
    ;********
    ; Immer wenn ich dieses push machen gibt es einen Speicherzugriffsfehler.
    ; Liegt das damit zusammen dass ich ebp & esp evtl. falsch verwendet habe?
    ; Ich habe doch 8 (Byte/Bit, was genau?) frei gegeben, werden die dann nicht
    ; bei einem push verwendet, oder muss ich das immer so machen wie ich es 
    ; 5 Zeilen tiefer gemacht habe, weil das nämlich ohne zu meckern geht. 
       xor   eax, eax
       push  eax
    ;********
    ; Oder immer so?
       mov   eax, 0x10
       mov   [esp+8], eax
    ;********
    
       add   esp, 8
       pop   ebp
       ret   12
    
    ;******************************************************************************
    ; int strlen( const char *str );
    ;******************************************************************************
    strlen:                    ; result in ECX
       push  ebp
       mov   ebp, esp
       xor   ecx, ecx
       mov   esi, [ebp+8]
    .L1:
       lodsb
       or    al, al
       jz    .L2
       inc   ecx
       jmp   .L1
    .L2:
       pop   ebp
       ret   8
    

    Mit freundlichen Grüßen
    Christian Ries



  • Wenn du nu push benutzt brauchst du nicht per sub esp, 8 Platz machen, das ist nur für lokale Variablen. Und du pushst eax, popst es aber nicht weider runter. Das könnte schon Grund genug sein. Da es aber ja EAX ist,. brauchst du den Wer garnicht sichern, das ist ja der Rückgabewert.



  • Tatsache, ich habe nun wieder gepoppt (nicht auf die zweideutigkeit achten 😉 ) und es geht ohne Probleme!
    Danke!

    Aber wieso ist das so?

    Könnte ich das auch so machen, das ich dann einfach esp oder ebp neu setze?
    Das muss ja irgentwie mit dennen zusammen hängen, oder nicht?

    Bevor ich nun stundenlang danach suche, frag ich lieber hier und hoffe jemand weiß es.

    mfg
    Christian Ries



  • ciever2k schrieb:

    Tatsache, ich habe nun wieder gepoppt (nicht auf die zweideutigkeit achten 😉 ) und es geht ohne Probleme!
    Danke!

    Aber wieso ist das so?

    Du holst den alten ebp vom Stack und auch aufm Stack liegt die Rückkehradresse. Wenn der Stack nun verschoben ist, weil du vergessen hast, einen Wert wieder abzuholen, dann rufst du um einen vorschobene Werte vom Stack, u.a. auch EBP und die Rückkehradresse und das Programm läuft sonstwohin.

    Könnte ich das auch so machen, das ich dann einfach esp oder ebp neu setze?
    Das muss ja irgentwie mit dennen zusammen hängen, oder nicht?

    Ja, könntest du, sofern du esp udn ebp unabhängig irgendwo speicherst. Macht man aber nicht, weils nicht sehr tauglich ist für z.B. Rekursionen. Üblich ists halt mit push ebp, mov ebp, esp und mit pop ebp und ret zu arbeiten. Man muss halt nur gucken, dass der Stakc so wie er am Anfang manipuliert wurde auch am Ende wieder zurückgestellt wird.


Anmelden zum Antworten