ADD ESP, n und der StackFrame

02/12/2009 - 18:50 von Jens Kallup | Report spam
Hallo,

mal angenommen wir haben eine Sprace L, und Parameter P.
Wie kann ich aus L ein AssemblerCode erstellen,
wenn gilt:

Funktion F1 As String (char*)
Funktion F2 As String P1 = F1


irgendwie hab ich jetzt nen Brett vorm Kopf :/
Hat einer ne idee wenn man nun:

? F + " " + F

schreiben will - also in Assembler.
irgendwo habe ich glaube ich gelesen zu haben,
das man ein EAX pushen muss????

Gruß
Jens
 

Lesen sie die antworten

#1 Markus Wichmann
02/12/2009 - 21:03 | Warnen spam
Jens Kallup () schrieb:
Hallo,

mal angenommen wir haben eine Sprace L, und Parameter P.
Wie kann ich aus L ein AssemblerCode erstellen,
wenn gilt:

Funktion F1 As String (char*)
Funktion F2 As String P1 = F1


irgendwie hab ich jetzt nen Brett vorm Kopf :/
Hat einer ne idee wenn man nun:

? F + " " + F

schreiben will - also in Assembler.
irgendwo habe ich glaube ich gelesen zu haben,
das man ein EAX pushen muss????

Gruß
Jens



Ich meine, mich zu erinnern, dass dein '?' eine Ausgabe ist. Ein
parse-tree der Zeile sieht also so aus:

#v+
call
/ \
? +
/ \
F +
/ \
" " F
#v-
So, nun kommt der kontextsensitive Teil: Was ist F? Ich nehme mal an,
eine Funktion vom Typ String. Außerdem nehme ich an, dass dein + kein
arithmetisches, sondern kontextsensitives, und in diesem Falle
Konkatenierungsoperator ist.

Dann passiert mit dem Parse Tree folgendes:

section .data
LC1: db ' ',0

section .text
;1. F ermitteln
call F
;2. " " und F konkatenieren
push LC1
push F
call concat
add esp, 8

;3. F und das Ergebnis der letzten concat verketten.
;3a. eax sichern
mov ebx, eax
call F
push eax
push ebx
call concat
push eax
call print

So, jetzt brauchst du nur noch die referenzierten Funktionen.

#include <string.h>
#include <stdlib.h>

typedef struct _node {
char* p;
_node* next;
} node_t;

static node_t* head;

void freecats()
{
node_t *p = head;
while (p)
{
node_t *p2 = p->next;
free(p->p);
free(p);
p = p2;
}
head = NULL;
}

char* concat(char* s1, char* s2)
{
node_t* p = head;
if (!head)
{
head = malloc(sizeof *head);
} else {
for(; p->next; p = p->next);
p->next = malloc(sizeof *p);
p = p->next;
}

p->next = NULL;
p->p = malloc(strlen(s1) + strlen(s2) + 1);
strcpy(p->p, s1);
strcat(p->p, s2);
}

Jetzt musst du nur noch sicherstellen, dass die Funktion "freecats"
immer dann aufgerufen wird, wenn ein String, der aus concat kam,
verworfen wird. Das ist durchaus eine nichttriviale Aufgabe, deswegen
ist freecats auch zu atexit kompatibel geschrieben.

HTH,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.

Ähnliche fragen