| Autor |
Nachricht |
hackbert
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.11.2001
Beiträge: 723
|
hackbert Mitglied
13:10:00 22.03.2003 Titel: |
Inline Assembler in GCC |
Zitieren |
Ich hatte angefangen in eine C-Source inline assembler nach der mir bekannten Syntax einzubinden:
| Code: | char message[] = "Hallo wie geht es?";
_asm{
mov si, message
} | |
| Code: | char message[] = "Hallo wie geht es?";
_asm{
mov si, message
} | |
| Code: | char message[] = "Hallo wie geht es?";
_asm{
mov si, message
} | |
GCC meckert und nach einem Blick in die FAQ sah ich, dass man das so machen muss:
| Code: | char message[] = "Hallo wie geht es?";
asm("mov si, message"); | |
| Code: | char message[] = "Hallo wie geht es?";
asm("mov si, message"); | |
| Code: | char message[] = "Hallo wie geht es?";
asm("mov si, message"); | |
Jetzt meckert er nicht mehr über die Syntax, sagt aber folgendes:
Error: too many memory references for 'mov'
Was soll denn das heißen? |
_________________ http://www.programmierforen.de | KernelWiki
|
|
 |
Werbeunterbrechung
|
|
 |
rüdiger
Moderator
Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 22822
|
rüdiger Moderator
14:10:00 22.03.2003 Titel: |
|
Zitieren |
der GCC nutzt einen anderen Assembler Syntax, als der MSVC++. Der MSVC++ nutzt Intel-Syntax Assembler und der GCC nutzt den (IMHO besseren) AT&T Syntax. In der 3er Version kann man das aber mit einem Parameter ändern, weiss aber nicht genau wie (schau am besten mal in die GCC Doku) |
_________________ .
|
|
 |
Descartes
Unregistrierter
|
Descartes Unregistrierter
14:11:00 22.03.2003 Titel: |
|
Zitieren |
Bei GCC sieht die Syntax noch ein bisserl anders aus.
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | 1 2 3 4 5 6 7 8 9 10 | #include <stdio.h>
int main()
{
char message[] = "Hallo wie geht es?";
asm("movl %0, %%esi;"::"r"(message));
return 0;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | #include <stdio.h>
int main()
{
char message[] = "Hallo wie geht es?";
asm("movl %0, %%esi;"::"r"(message));
return 0;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | #include <stdio.h>
int main()
{
char message[] = "Hallo wie geht es?";
asm("movl %0, %%esi;"::"r"(message));
return 0;
} | |
|
|
|
|
 |
hackbert
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.11.2001
Beiträge: 723
|
hackbert Mitglied
14:55:00 22.03.2003 Titel: |
|
Zitieren |
|
 |
Descartes
Unregistrierter
|
Descartes Unregistrierter
15:19:00 22.03.2003 Titel: |
|
Zitieren |
|
 |
hackbert
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.11.2001
Beiträge: 723
|
hackbert Mitglied
15:26:00 22.03.2003 Titel: |
|
Zitieren |
|
 |
hackbert
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.11.2001
Beiträge: 723
|
hackbert Mitglied
19:54:00 22.03.2003 Titel: |
|
Zitieren |
Ich habe jetzt den Parameter für GCC gefunden, der Intel Syntax im Quellcode erlaubt. Allerdings kommen jetzt ganz viele Fehler. Mein Programm sieht so aus:
| C/C++ Code: | main()
{
char message[] = "Second stage booting";
asm("mov eax, 0x00000000");
} | |
| C/C++ Code: | main()
{
char message[] = "Second stage booting";
asm("mov eax, 0x00000000");
} | |
| C/C++ Code: | main()
{
char message[] = "Second stage booting";
asm("mov eax, 0x00000000");
} | |
Es kommen 26 Fehler bei der kompilierung (gcc -c testkernel.c -masm=intel) die ich hier jetzt nicht alle auflisten möchte. Sie wiederholen sich ziemlich oft:
Too many memory references for mov
Too many memory references for sub
junk 'PTR [ebp-x]' after expression, wobei x für mehrere Zahlen stehen kann... |
_________________ http://www.programmierforen.de | KernelWiki
|
|
 |
Mr. N
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.12.2001
Beiträge: 4331
|
Mr. N Mitglied
20:33:00 22.03.2003 Titel: |
|
Zitieren |
wie heißt der parameter? wär doch bestimmt was für die faq. |
|
|
|
 |
hackbert
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.11.2001
Beiträge: 723
|
hackbert Mitglied
20:36:00 22.03.2003 Titel: |
|
Zitieren |
|
 |
Mr. N
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.12.2001
Beiträge: 4331
|
Mr. N Mitglied
20:55:00 22.03.2003 Titel: |
|
Zitieren |
versuchs doch mal mit 0 statt 0x0000000.... |
|
|
|
 |
Descartes
Unregistrierter
|
Descartes Unregistrierter
21:12:00 22.03.2003 Titel: |
|
Zitieren |
| Zitat: | Original erstellt von hackbert:
Der Parameter heißt -masm=intel wahlweise auch -mintel-syntax
trotzdem funktioniert mein proggie net  |
Wenn ich das ganze mit AT&T Syntax schreibe, wird zwar fehlerfrei kompiliert. Das erzeugte Binary schmiert allerdings beim Starten mit einem Segment Fault ab.
| C/C++ Code: | int main()
{
char message[] = "Second stage booting";
asm("mov 0x0, %ax");
return 0;
} | |
| C/C++ Code: | int main()
{
char message[] = "Second stage booting";
asm("mov 0x0, %ax");
return 0;
} | |
| C/C++ Code: | int main()
{
char message[] = "Second stage booting";
asm("mov 0x0, %ax");
return 0;
} | |
Der Absturz kommt hierbei durch die -- aus Programmsicht -- unerwartet Veränderung des Registers "ax" auf 0x00.
Eine Kleine Änderung des Programms, das keine Auswirkung auf den eigentlichen Registerinhalt von "ax" hat stürzt beispielsweise nicht ab.
| C/C++ Code: | int main()
{
char message[] = "Second stage booting";
asm("mov %ax, %ax");
return 0;
} | |
| C/C++ Code: | int main()
{
char message[] = "Second stage booting";
asm("mov %ax, %ax");
return 0;
} | |
| C/C++ Code: | int main()
{
char message[] = "Second stage booting";
asm("mov %ax, %ax");
return 0;
} | |
Du solltest also schon wissen, was du tust wenn du inline Assembler Befehle verwendest. |
|
|
|
 |
hackbert
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.11.2001
Beiträge: 723
|
hackbert Mitglied
21:19:00 22.03.2003 Titel: |
|
Zitieren |
Ist schon klar. Eigentlich sollte message in si geschoben werden. Aus Testzwecken habe ich allerdings erstmal 0x00 in ax geschoben, nur um zu sehen, ob der Compiler das Zeug kompiliert. Eine Frage noch: wie gebe ich an, dass die Adresse von message in si soll? |
_________________ http://www.programmierforen.de | KernelWiki
|
|
 |
Descartes
Unregistrierter
|
Descartes Unregistrierter
17:32:00 23.03.2003 Titel: |
|
Zitieren |
| Zitat: | Original erstellt von hackbert:
Ist schon klar. Eigentlich sollte message in si geschoben werden. Aus Testzwecken habe ich allerdings erstmal 0x00 in ax geschoben, nur um zu sehen, ob der Compiler das Zeug kompiliert. Eine Frage noch: wie gebe ich an, dass die Adresse von message in si soll? |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h>
int main()
{
char message[] = "Hallo wie geht es?";
/* Die Adresse der Variable "message" wird ist innerhalb der
** Assemblerbefehler als %0 zugreifbar.
*/
asm("movl %0, %%esi;"::"r"(message));
/* Wenn du statt der Adresse den Inhalt der Speicherzelle benötigst,
** dann musst du das ganze mit runden Klammern schreiben:
**
** asm("movl (%0), %%esi;"::"r"(message));
*/
return 0;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h>
int main()
{
char message[] = "Hallo wie geht es?";
/* Die Adresse der Variable "message" wird ist innerhalb der
** Assemblerbefehler als %0 zugreifbar.
*/
asm("movl %0, %%esi;"::"r"(message));
/* Wenn du statt der Adresse den Inhalt der Speicherzelle benötigst,
** dann musst du das ganze mit runden Klammern schreiben:
**
** asm("movl (%0), %%esi;"::"r"(message));
*/
return 0;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h>
int main()
{
char message[] = "Hallo wie geht es?";
/* Die Adresse der Variable "message" wird ist innerhalb der
** Assemblerbefehler als %0 zugreifbar.
*/
asm("movl %0, %%esi;"::"r"(message));
/* Wenn du statt der Adresse den Inhalt der Speicherzelle benötigst,
** dann musst du das ganze mit runden Klammern schreiben:
**
** asm("movl (%0), %%esi;"::"r"(message));
*/
return 0;
} | |
|
|
|
|
 |
Garrett
Mitglied
Benutzerprofil
Anmeldungsdatum: 22.04.2001
Beiträge: 456
|
Garrett Mitglied
22:30:00 26.03.2003 Titel: |
|
Zitieren |
So, ich wollte nur noch weitere Posts abwarten, nun ab damit in die FAQ. |
_________________ 2 Days more and I'm a god
>> Moderator im Forum für Andere Compiler <<
|
|
 |