# [Assembler] Einfaches Programm



## smile4free (3. Juni 2009)

Hallo, 
ich habe zwar schon mal in Assembler etwas programmiert, aber jetzt stehe ich scheinbar gerade auf dem Schlauch.

Ich verwende NASM und habe ein Assemblerfile, das folgende Funktion enthält:


```
_swap:
	push eax			;
	push ebx			;
	push ecx			;
	mov ecx, esp			;

	mov eax, [ecx+8]		;	Argument 1 nach eax holen
	mov ebx, [ecx+12]	;	Argument 2 (ein Zeiger auf eine Variable) nach ebx holen
	mov [ebx], eax		;	Argument 1 dahin schreiben, wo Argument 2 hinzeigt
	pop ecx				;
	pop ebx				;
	pop eax				;
	
	ret					;
```

Die Signatur sieht in C wie folgt aus:

```
extern void swap (int a, int* b)
```

Mein Ziel ist, dass ich den Inhalt der Variable a and die Speicherstelle kopiere, an der sich b befindet. Allerdings scheint obiger Code das nicht zu leisten.

Ich kann alles wunderbar kompilieren und die Funktion aus C heraus aufrufen. Wenn ich das Programm aber starte, erhalte ich die Windows-Meldung "swap.exe funktioniert nicht mehr" (-> Programm schließen).

Weiß jemand, wo der Fehler liegt?


----------



## deepthroat (4. Juni 2009)

Hi.

Deine Offset Berechnung der Argumente ist falsch.

Wenn du 3 Werte auf den Stack pushst, dann verminderst du ESP um 3 * 4 Byte.

Um an die Argumente der Funktion zu kommen mußt du dann ESP + 16 und ESP + 20 rechnen.

Gruß


----------



## smile4free (4. Juni 2009)

Peinlich peinlich. Danke für die Hilfe.


----------

