Was tut dieser Assembly Code? (Anfängerfrage)
-
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
, x86_64 erlaubt glaube ich keine float Konstanten.
Das hat nichts mit der Architektur zu tun, sondern mit dem Assembler (das Programm)
Kann man denn sagen, die Assembler-Syntax ist immer von der konkreten Architektur des Prozessors abhängig?
Ja. Und vom verwendeten Assembler (Programm).
Und was war zuerst da, Asm oder C?
Seit wann gibt es Computer?
Die allerersten hatten sicher kein AssemblerSeit wann gibt es C?
Vor C gab es schon Fortran.
-
Zitat Wikipedia:
C ist eine imperative und prozedurale Programmiersprache, die der Informatiker Dennis Ritchie in den frühen 1970er Jahren an den Bell Laboratories entwickelte. Seitdem ist sie eine der am weitesten verbreiteten Programmiersprachen.
Der erste Assembler wurde zwischen 1948 und 1950 von Nathaniel Rochester für eine IBM 701 geschrieben.
-
Hier ist
getpi
in einer für mich etwas besser lesbaren Form,.globl getpi .def getpi; .scl 2; .type 32; .endef .seh_proc getpi getpi: pushq %rbp movq %rsp, %rbp pushq %r12 pushq %r13 pushq %r14 subq $32, %rsp movq $0, %r12 movq $1, %r14 cvtsi2sd %r14, %xmm3 jmp .L2 .L5: movq %r12, %r13 andq $1, %r13 testq %r13, %r13 jne .L3 movq %r12, %r13 addq %r13, %r13 addq $3, %r13 cvtsi2sd %r13, %xmm0 movq $1, %r14 cvtsi2sd %r14, %xmm1 divsd %xmm0, %xmm1 subsd %xmm1, %xmm3 jmp .L4 .L3: movq %r12, %r13 addq %r13, %r13 addq $3, %r13 cvtsi2sd %r13, %xmm0 movq $1, %r14 cvtsi2sd %r14, %xmm1 divsd %xmm0, %xmm1 addsd %xmm1, %xmm3 .L4: addq $1, %r12 .L2: cmpq $100000, %r12 jle .L5 movq $45, %r14 cvtsi2sd %r14, %xmm1 divsd %xmm1, %xmm3 movsd %xmm3, %xmm0 addq $32, %rsp popq %r14 popq %r13 popq %r12 popq %rbp ret .seh_endproc
aber was bezweckt das allozieren mit
subq $32, %rsp
?
Und was gab es vor Assembler?
-
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
Und was gab es vor Assembler?
Da hat man halt direkt in der Maschinensprache geschrieben, also dem Binary das jetzt raus kommt, wenn du dein Assemblerprogramm übersetzt.
https://en.wikipedia.org/wiki/First-generation_programming_language
-
assemblersprache ist ja grob gesagt auch nur die ersetzung der zahlenwerte der opcodes durch buchstabenkombinationen, die man sich besser merken kann.
-
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
aber was bezweckt das allozieren mit subq $32, %rsp?
Es macht Platz für 32 Bytes auf dem Stack. Das ist genau das was ich die ganze Zeit meine, beschäftige Dich lieber erst mit den Basics.
-
@Wade1234 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
assemblersprache ist ja grob gesagt auch nur die ersetzung der zahlenwerte der opcodes durch buchstabenkombinationen, die man sich besser merken kann.
Die ganze Adressberechnung für Sprungziele, Konstanten use. werden auch gemacht.
-
@Swordfish sagte in Was tut dieser Assembly Code? (Anfängerfrage):
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
aber was bezweckt das allozieren mit subq $32, %rsp?
Es macht Platz für 32 Bytes auf dem Stack. Das ist genau das was ich die ganze Zeit meine, Beschäftige dich lieber erst mit den Basics.
Das ist genau das was ich die ganze Zeit mache. Aber Danke dennoch für den hilfreichen Kommentar.
-
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
Das ist genau das was ich die ganze Zeit mache.
Na dann.
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
Aber Danke dennoch für den hilfreichen Kommentar.
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
aber was bezweckt das allozieren mit
subq $32, %rsp
?Ach so, Du willst wissen warum?
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
pushq %rbp movq %rsp, %rbp pushq %r12 pushq %r13 pushq %r14
Wie viele Bytes werden hier gepusht? (Es sind 4 QWORDs ...)
// edit:
WORD = 16 bit (2 bytes)
DWORD = 32 bit (4 bytes)
QWORD = 64 bit (8 bytes)auf heutzutage gängigen desktop-archtekturen. Und das letzte mal als ich nachgesehen habe war 8 x 4 = 32.
-
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
@Swordfish sagte in Was tut dieser Assembly Code? (Anfängerfrage):
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
aber was bezweckt das allozieren mit subq $32, %rsp?
Es macht Platz für 32 Bytes auf dem Stack. Das ist genau das was ich die ganze Zeit meine, Beschäftige dich lieber erst mit den Basics.
Das ist genau das was ich die ganze Zeit mache. Aber Danke dennoch für den hilfreichen Kommentar.
Es ist halt schon irgendwie ein bisschen komisch, wie du die Sache angehst. Normalerweise würde man Assembler nicht anders lernen als jede andere Programmiersprache auch. Hello World, einfache Kontrollstrukturen, grundlegende Programmiermuster, und so weiter. Was ja allem Anschein nach auch das Ziel deiner Lehrveranstaltung ist. Du hingegen fängst hier mitten drin an mit Dingen, die du gar nicht verstehst. Nicht nur, dass du Spanisch lernst, wenn es um Französisch geht, du fängst zusätzlich auch noch mit dem Verstehen von Straßenslang an, anstatt mit "Hola, yo soy EinNutzer0".
-
@DirkB sagte in Was tut dieser Assembly Code? (Anfängerfrage):
@Wade1234 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
assemblersprache ist ja grob gesagt auch nur die ersetzung der zahlenwerte der opcodes durch buchstabenkombinationen, die man sich besser merken kann.
Die ganze Adressberechnung für Sprungziele, Konstanten use. werden auch gemacht.
ja gut, aber prinzipiell kann man ja auch einfach code bzw. funktionen an adresse xy schreiben und bei konstanten auf adresse yz verweisen.
also eigentlich braucht man nur noch in sehr speziellen fällen inline assembler, und visual c++ sperrt sowas bei x64 sogar ganz und verweist auf intrin.h. angeblich kann der compiler das dann auch ganz toll optimieren.
mikrocontroller kannst du ja auch mit C programmieren und wenn du in den speicher schreiben willst, machst du halt sowas:
char *meinaddresszeiger = 0x0815; *meinadresszeiger = 4711;
also evtl. deklarierst du den zeiger noch als volatile, wenn du auslesen willst.
-
@Wade1234 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
und visual c++ sperrt sowas bei x64 sogar ganz und verweist auf intrin.h
Der "sperrt" sowas nicht,
cl
ist schlicht unfähig. Sowohl für AMD64 als auch für ARM. Plan B:ml64
.
-
@Swordfish dann ist mein wissen wohl falsch oder veraltet. also mir hat man das damals als "erhöhung von sicherheit" verkauft. aber warum sollte man inline assembler verwenden, wenn es auch c-funktionen gibt, die dann optimiert werden? also C ist doch "genauso wie assembler".
-
@Wade1234 es ist für x64 in
cl
schlichtweg nicht implementiert.
-
@Swordfish ja aber warum sollte man sich dann die mühe machen, alle prozessor-spezifischen funktionen in C zu implementieren? also intrin.h ist da irgendwie schon sehr umfangreich......
-
@Wade1234 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
@DirkB sagte in Was tut dieser Assembly Code? (Anfängerfrage):
@Wade1234 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
assemblersprache ist ja grob gesagt auch nur die ersetzung der zahlenwerte der opcodes durch buchstabenkombinationen, die man sich besser merken kann.
Die ganze Adressberechnung für Sprungziele, Konstanten use. werden auch gemacht.
ja gut, aber prinzipiell kann man ja auch einfach code bzw. funktionen an adresse xy schreiben und bei konstanten auf adresse yz verweisen.
also eigentlich braucht man nur noch in sehr speziellen fällen inline assembler, und visual c++ sperrt sowas bei x64 sogar ganz und verweist auf intrin.h. angeblich kann der compiler das dann auch ganz toll optimieren.
mikrocontroller kannst du ja auch mit C programmieren und wenn du in den speicher schreiben willst, machst du halt sowas:
char *meinaddresszeiger = 0x0815; *meinadresszeiger = 4711;
also evtl. deklarierst du den zeiger noch als volatile, wenn du auslesen willst.
So war das nicht gemeint.
Der Assembler übersetzt den Assemblercode in Opcodes. Da kannst du Sprungmarken, Konstanten, Variablen anlegen, fast wie in C.
Wo genau die dann im Speicher liegen, darum kümmert sich der Assembler.
Er übersetzt nicht nur die Mnemonics in den entsprechenden Wert.C ist halt portabler.
-
@Wade1234 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
@Swordfish ja aber warum sollte man sich dann die mühe machen, alle prozessor-spezifischen funktionen in C zu implementieren? also intrin.h ist da irgendwie schon sehr umfangreich......
intrinsics != inline assembler.
Mit inline assembler kann man viel mehr Sauereien machen.
-
Wie könnte man denn am einfachsten die Brücke schlagen zwischen dem Verstehen von asm und dem Verständnis von Binaries?
-
@Wade1234 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
@Swordfish ja aber warum sollte man sich dann die mühe machen, alle prozessor-spezifischen funktionen in C zu implementieren? also intrin.h ist da irgendwie schon sehr umfangreich......
Es gibt so Fälle in denen Assembler noch immer signifikant schneller ist. Die MKL von Intel ist so ein Beispiel, sie implementiert unter anderem die DGEMM Routine, die zwei reelle Matrizen mit double Datatype multipliziert. Im Prinzip eine einfache Sache und die Komplexiztät ist mit O(N^3) für zwei quadratische Matrizen der Größe N auch bekannt. Du kannst aber gerne versuchen mit normalen C Code die Performance der MKL DGEMM Routine zu erreichen. Es wird sehr schwierig.
Für den Einstieg wäre ggf. Gotos Paper hilfreich.
-
@EinNutzer0 sagte in Was tut dieser Assembly Code? (Anfängerfrage):
Und was war zuerst da, Asm oder C?
C ist erst bei der Implementation von UNIX Version 4 zum Einsatz gekommen (1973). Davor wurde UNIX in reinem Assembler implementiert, und C war nicht wirklich existent. Es gab Vorläufersprachen wie B und BCPL, die die Entwicklung von C maßgeblich beeinflusst haben. Diese UNIX Version 4 wurde dann 1973 öffentlich gemacht, und die Bell Labs haben es dann auf Grund spezieller Auflagen der Regierung lizenziert, weil sie es selbst nicht verkaufen durften. Danach begann der Siegeszug von C an den US Universitäten, da diese üblicherweise die DEC Systeme im Einsatz hatten, und UNIX die Möglichkeit bot direkt am Betriebssystem zu forschen. Als dann Mitte der 1980er die ersten potenteren Homecomputer bzw. PCs aufkamen, war C bereits an den Universtäten und in der Industrie fest etabliert. Die 8Bit Homecomputer wurden meisten noch in Assembler programmiert, Amiga (bis auf eine Library die war in BCPL geschrieben) und Atari ST wurden in C programmiert, Apple hatte zuerst ObjectPascal benutzt und dann System 6 in C und C++ reimplementiert. Das BIOS des PCs und PC/MS-DOS war auch in Assembler programmiert. Wobei für die Anwendungen C relativ schnell populär war. Windows wurde später bereits mit C und C++ entwickelt.
Es gab natürlich eine Computer Welt vor UNIX Version 4. Z.B. der erste Computer mit einem Betriebssystem IBMs S/360 aus dem Jahre 1964, oder den ersten Hochsprachen Compiler überhaupt (DirkB wies schon darauf hin), Fortran aus dem Jahren 1954. Ergo, Assembler ist bedeutend älter als C.