Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: matthieuriolo am 12. April 2005, 15:49

Titel: Assembler als methode?
Beitrag von: matthieuriolo 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.)
Titel: Assembler als methode?
Beitrag von: hannibal 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
Titel: Assembler als methode?
Beitrag von: matthieuriolo am 12. April 2005, 16:14
hm aha ... so einfach :D na werd ich mal ausprobieren.
Titel: Assembler als methode?
Beitrag von: Roshl 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
Titel: Assembler als methode?
Beitrag von: elfish_rider 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
Titel: Assembler als methode?
Beitrag von: Roshl am 12. April 2005, 16:44
Natürlich war nur ein Tippfehler, sowas passiert selbst Genies wie mir^^
Titel: Assembler als methode?
Beitrag von: matthieuriolo 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?
Titel: Assembler als methode?
Beitrag von: DarkThing 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.
Titel: Assembler als methode?
Beitrag von: Svenska 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
Titel: Assembler als methode?
Beitrag von: matthieuriolo 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...
Titel: Assembler als methode?
Beitrag von: DarkThing 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.
Titel: Assembler als methode?
Beitrag von: Svenska am 13. April 2005, 14:05
Kann man in C eigentlich einfach Pushen und
dann im Inline-ASM einfach Popen?
Titel: Assembler als methode?
Beitrag von: DarkThing 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.
Titel: Assembler als methode?
Beitrag von: Svenska 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:
Titel: Assembler als methode?
Beitrag von: DarkThing 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
Titel: Assembler als methode?
Beitrag von: Roshl 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^^
Titel: Assembler als methode?
Beitrag von: DarkThing 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).
Titel: Assembler als methode?
Beitrag von: Roshl 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.