• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[c][Code::Blocks]Assembler Syntax

Status
Für weitere Antworten geschlossen.

gollum1990

Neues Mitglied
Hallo liebes Forum,

ich habe ein Problem mit der Assembler Syntax in Code::Blocks, ich weiß dass dort keine Intel-Syntax erlaubt ist, wobei ich gerade mit dieser Syntax halbwegs Assembler bei bringe. Nun hat sich herausgestellt dass Code::Blocks die AT&T Syntax nutzt, mit dieser komm ich überhaupt nicht klar.

Gibt es irgendwo da, eine Option dass er Intel Syntax animmt?

Beispiel dieses Programm soll 2 Zahlen addieren und das Ergebnis in die dritte Variable speichern:
PHP:
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int v1 = 5, v2 = 5, v3;
	asm("movl %0, %%esi"::"r"(v1));
	asm("movl %0, %%esp"::"r"(v2));
	asm("add %esi, %esp");
	asm("movl %0, %%esi"::"r"(v3));

	printf(v3);

	return 0;
}

Das Programm lässt sich fehlerfrei kompilen, aber das schmiert kurz nachdem starten ab.


MFG gollum1990
 
Zuletzt bearbeitet:
Werbung:
Hallo,

dass hängt weniger mit Code:Blocks als mit dem verwendeten Assembler zusammen. Der nasm unterstützt Intel Syntax. Du kannst dir unter Settings->Compiler und Debugger einen Comiler hinzufügen. Erst Copy und dann unter Toolchain die Programme ändern. Musst ein bischen mit rumspielen.


Edit: Ich kann mal eine Seite raussuchen, wo die Unterschiede stehen. Aber wenn du es sowieso gerade erst lernst kannste ja gleich den AT&T Style lernen.

Afaik gibt es eine Compiler Option um das zu ändern. Aber die dreht meines Wissens nach nur die Reihenfolge der Operatoren um, was nicht wirklich viel bringt.

Edit2: Du änderst das esp-Register. In dem liegt der Stack-Pointer. Und auf dem Stack liegen deine Variablen. Du änderst also den Ort deiner Variablen (Der steht noch in ebp) und den Ort für die Rückspurngadressen. Nehm statt esp lieber eax. Und esi ist eigentlich für String Operationen gedacht. Verwende lieber eax .. edx. Denk aber daran die Register zu sichern, der gcc nimmt an die seien unverändert!


N43
 
Zuletzt bearbeitet:
Ähm, ich hab gemacht was du gesagt hast, es hat teilweise geklappt, er schmiert nicht ab, funktioniert problemlos nur an der Ausgabe harperst. (Ausgabe == NICHTS)

Code:
PHP:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int v1 = 5, v2 = 5, v3;
    asm("push %eax");
    asm("push %ebx");
    asm("movl %0, %%eax"::"r"(v1));
    asm("movl %0, %%ebx"::"r"(v2));
    asm("add %eax, %ebx");
    asm("movl %0, %%eax"::"r"(v3));

    printf(v3);

    return 0;
}
 
Werbung:
Hallo,

du musst printf schon mitteilen, was er mit v3 machen soll. Also
Code:
printf("%i", v3);
Normalerweise hätte der Compiler bei deiner Variante die Meldung "Warning: Casting int to char*" oder so bringen müssen (zumindest der gcc).


N43
 
5+5= 2293640 kommt raus

Ich glaube 5+5=10 oder?
Im Assembler Code waren noch ein paar Fehler:
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int v1 = 5, v2 = 5, v3;
             
    asm("movl %0, %%ecx"::"r"(v1));
    asm("movl %0, %%edx"::"r"(v2));
    asm("add %edx, %ecx");
    asm("movl %%ecx, %0":"=r"(v3):);    //Ausgabe Register hat gefehlt
                                                    //und Reihenfolge war falsch
                                                    
    //besser:
    asm ("movl %0, %%eax;"        // eax = v1
            "movl %1, %%ebx;"        // ebx = v2
            "add %%ebx, %%eax;"    // eax = eax + ebx
            "movl %%eax, %2;"        // v3 = eax
            :"=r"(v3)                // Ausgabe Register %2
            :"r"(v1),"r"(v2)        // Ausgabe Register %0, %1
            : "%eax","%ebx"        // Register sichern
            );
    

    printf("%i\n",v3);

    return 0;
}
so geht's.

Schau dir mal GCC inline assembly an, da ist das recht gut erklärt.


N43
 
Werbung:
Ich sag ja AT&T Syntax ist ziemlich schrott... wie war das mit nasm?
nasm verwendet die Intel-Syntax, aber wenn du asm mit C mischen willst musste wohl oder übel beim gcc bleiben. Einzige Möglichkeit die noch bleibt wäre Funktionen in ASM zu schreiben und dann über den Linker einzubinden.

Aber so übel ist die AT&T Syntax doch garnet, was beim gcc halt noch dazu kommt ist Register sichern, Variablen in Register laden und zurückschreiben.

N43
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben