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
- linuxglobal _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.