Autor Thema: Assembler als methode?  (Gelesen 5957 mal)

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« am: 12. April 2005, 15:49 »
Hey Zusammen
Ist es möglich in C++ nen assembler code auszuführen? Sprich man kann sie benutzen wie eine funktion, einfach ohne rückgabe wert ;) Wäre vielleicht für einiges noch so intressant... ->Treiber

Wenns es gäbe wäre ein beispiel sicher nicht schlecht  :twisted: (nur was kleines ... bsp das der assembler code rebootet.)

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #1 am: 12. April 2005, 16:00 »
haengt vom compiler ab, gcc verwendet glaub ich


asm {
; asm-code hier (gnu-asm-syntax afaik?!)
}


...ich weiss aber nicht genau ob das statement stimmt..kann auch sein, dass es __asm o.ä. ist..musst du manuals waelzen ;)

lg, hannibal
\\o
o//
\o/

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. April 2005, 16:14 »
hm aha ... so einfach :D na werd ich mal ausprobieren.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #3 am: 12. April 2005, 16:28 »
in gcc musst du sowas machen:
asm("statements");
syntax ist AT&T also kein Intel, z.b. sind dort Source und Quelle vertauscht, oder man muss die operandengrösse im mnemonic angeben. Dann noch diverse andere sachen^^ wenns dann um extended inline asm geht wirds noch schwieriger, ich rate jedenfalls davon ab, es verwirrt eigentlich nur.
z.b:
Intel:
mov eax,ebx
=AT&T
movl %ebx,%ebx
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 12. April 2005, 16:40 »
Zitat von: Roshl

mov eax,ebx
=AT&T
movl %ebx,%ebx

Ich möchte korrigieren:
mov eax,ebx
=AT&T
movl %ebx,%eax

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #5 am: 12. April 2005, 16:44 »
Natürlich war nur ein Tippfehler, sowas passiert selbst Genies wie mir^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 12. April 2005, 17:27 »
nun ... in meine letzten thread wurde mir gesagt das C++ grösser und schwerfälliger wird ... was is nun hier? Es is zwar ein C++ Source aber mit assembler drin ... gleicht sich das aus oder hat das keinen einfluss?

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 12. April 2005, 17:33 »
Der C Compiler macht aus dem Source ein ASM Listing. Wenn er dabei auf Assembler Code stößt (das heißt dann Inline Assember) wird der Assebler Code fast 1 zu 1 kopiert. Das heißt das man einen Teil in Inline Assembler schreiben kann um den zu beschleunigen aber meistens wird man es verwenden um Aktionen durchzuführen die in C nicht gehen.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 12. April 2005, 18:31 »
...oder zu optimieren.
Eine Hochsprache kann nie so effizient sein, wie von Hand geschriebener und auf den Prozessor abgepasster Maschinencode (ASM ist ja fast Maschinencode).
Aber Assembler alleine heisst noch lange nicht optimiert; ein unoptimiertes Assemblerlisting kann langsamer sein als ein optimiertes Basiclisting (und Basic gehört zu den langsamsten noch benutzen Sprachen ueberhaupt).

Svenska

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 13. April 2005, 13:03 »
Und wie macht man das wenn man variablen rübernehmen will? Da muss man doch auch auf die bytes achten...

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 13. April 2005, 14:00 »
Dafür braucht man eine erweiterte Form vom Inline Assembler (bei DJGPP ist das jedenfalls so, bei manchen Compilern kann man Vars ganz normal verwenden). Diese erweiterte Form ist in ner gewissen Art schrecklich und man braucht viel eingewöhnungszeit. Auf www.osdever.net müsste es ein Tutorial darüber geben.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 13. April 2005, 14:05 »
Kann man in C eigentlich einfach Pushen und
dann im Inline-ASM einfach Popen?

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 13. April 2005, 14:09 »
Pushen geht AFAIK nur per Inline Assembler, was ja in dem Fall nicht sinnvoll ist... Man könnte sich ne funktion dafür schreiben! Irgendwie so: void Push(char dat);
Wenn man in C eine Funktion aufruft werden die Parameter über den Stack übergeben.  Das heißt das eine externe dazu gelinkte Assembler Datei eine Funktion exportieren kann in der die Parameter am Anfang vom Stack geholt werden.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 14. April 2005, 11:06 »
Wenn man Push und Pop vom C aufrufen könnte, wäre das Problem
mit der Variablenuebergabe nämlich gelöst gewesen... schade.
Eben doch alles Asm proggen, hat man nicht das Problem, zwei Sprachen
mischen zu muessen. Aber da den meisten C besser gefällt und ich es
vor allem nicht kann :lol:

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 14. April 2005, 13:28 »
Beispiel fürs Mischen von ASM und C
Ich kann nicht garantieren das das geht aber der Ansatz stimmt.

xyz.asm

[section .text]
[BITS 32]

global _AddToAX ; Funktion exportieren

; Die Funktion selber
; Fängt mit _ an weil der C Compiler allen Funktionen
; dieses Zeichen voranstellt
_AddToAX:
POP BX ; 1. Parameter vom Stack holen -> In BX schreiben
ADD AX, BX ; BX zu AX addieren
; Zurück
ret


xyz.c

extern void AddToAX(char x); /* Funktion importieren (ohne _!!!) */

void main()
{
    AddToAX(100);
}


Compilieren & Linken:
nasmw.exe -f coff -o x_asm.o x.asm
gcc.exe -c -ffreestanding -fwritable-strings -nostdinc -Wall *.c
ld.exe -Ttext 0x100000 --oformat binary -nostdlib -o KERNEL.BIN *.o

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #15 am: 14. April 2005, 17:12 »
Der vom Compiler generierte asm code kann auch besser sein als handgeschriebener, wenn der asmcoder nix kann nützt ihm das nix^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 14. April 2005, 18:28 »
Ok. Das ist die Vorraussetzung dafür. Aber wer kein Asm kann wird im Leben kein Inline Assembler verwenden. Und man muss nochmal sagen das manches in C nicht möglich ist (Port-Zugriffe ist doch ein gutes Beispiel).

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #17 am: 15. April 2005, 14:56 »
C ist ja auch dazu da um von der Hardware zu abstrahieren und auf verschiedenen Architekturen zu laufen. Und nicht alle haben wohl soetwas wie Ports, sonder da gibts dann halt direkt Befehle für Grafik ansprechen oder so. Also macht es ja auch keinen Sinn das in C zu integrieren.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen