Inline Assembly - Einbinden von __asm__

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
pac89
Beiträge: 8
Registriert: 17.11.2012 02:14:16

Inline Assembly - Einbinden von __asm__

Beitrag von pac89 » 17.11.2012 04:43:50

hallo,

ich habe folgenden Quellcode abgetippt:

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>

unsigned long find_start(void)
{
  __asm__("movl %esp, %eax");
}

int main()
{
   printf("0x%x\n",find_start());
}

leider erscheint beim kompilieren immer die meldung :

Assembler messages: No such instruction movl %esp, %eax

weiß jmd. wie ich das beheben kann? im internet bin ich nicht fündig geworden.....ich vermute mal, dass ich da irgendeine header-datei einbinden muss, richtig? kann das sein? wenn nicht, dann wäre ich über tipps sehr erfreut....;)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Inline Assembly - Einbinden von __asm__

Beitrag von Cae » 17.11.2012 10:43:44

Also prinziell geht sowas, es fragt sich nur, wie sinnvoll es ist:

Code: Alles auswählen

#include <stdio.h>

int test(void) {
	__asm__("nop");
}

int main(void) {
	printf("%x\n", test());
	return 0;
}
nop, no operation, tut einen Zyklus lang nix. Es braucht keine Argumente oder sonstigen Firlefanz. %x vom printf erwartet einen int, also habe ich den Rueckgabewert von test() entsprechend gesetzt. Allerdings gibt test() *irgendeinen* Wert zurueck, weil __asm__ wohl einfach nur macht und nix zurueckgibt, das man ueber return an den Aufrufer von test() zurueckgeben koennte. Der Output vom Programm ist also Muell.

Zu deiner Assembler-Syntax faellt mir nur ein, dass mov b a die klassische Registerinhaltskopie von a nach b war. Vielleicht ist movl 'ne long-Variante... vielleicht auch nicht.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: Inline Assembly - Einbinden von __asm__

Beitrag von cosmac » 17.11.2012 12:57:33

welcher Prozessor, welcher Compiler, welches Betriebssystem?
weil: mit dem gcc auf einem 32Bit-PC sollte es eigentlich ohne weiteres funktionieren.
Beware of programmers who carry screwdrivers.

pac89
Beiträge: 8
Registriert: 17.11.2012 02:14:16

Re: Inline Assembly - Einbinden von __asm__

Beitrag von pac89 » 18.11.2012 02:31:20

ich habe debian auf einer virtualbox installiert. dabei benutze ich auch den gcc-compiler und die debian version mit 32-bit.


edit: sonst benutze ich windows 7, 64-Bit und habe einen i3-Prozessor. das programm habe ich aus einem buch, damit wurde nur gezeigt wie man die adresse des extended stack pointers (esp) mit einem simplen code herausfinden kann. aber anscheinend funktioniert das bei mir nicht so ganz

2.edit: Unter dem Codesnippet steht im Buch die Information, dass die Version Debian 3.1r4 benutzt wird. daher habe ich aktuellste version von Debian gelöscht und die Version Debian 3.1r4 als iso-Datei heruntergeladen. Beim Installieren dieser Datei jedoch tritt bei der partitionierrung der folgender Fehler auf:
Es wurde kein Medium gefunden, dass partitioniert werden kann. Bitte überprüfen sie ob eine festplatte angeschlossen ist.


weiß jmd. vtl. wie man das macht? ich glaub, wenn ich es schaffe, diese version zu installieren, dann kriege ich best. auch die ergebnisse wie im buch....

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: Inline Assembly - Einbinden von __asm__

Beitrag von uname » 19.11.2012 14:03:49

Programm funktioniert unter Squeeze, wobei ich nicht weiß was es wirklich soll.

Code: Alles auswählen

./a.out 
0xbfd233a8

Benutzeravatar
hikaru
Moderator
Beiträge: 13911
Registriert: 09.04.2008 12:48:59

Re: Inline Assembly - Einbinden von __asm__

Beitrag von hikaru » 19.11.2012 14:34:52

Cae hat geschrieben:Zu deiner Assembler-Syntax faellt mir nur ein, dass mov b a die klassische Registerinhaltskopie von a nach b war.
Laut [1] ist die Reihenfolge von Ziel und Quelle hier genau umgekehrt. Frag micht nicht warum!

[1] http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Inline Assembly - Einbinden von __asm__

Beitrag von Cae » 06.12.2012 03:32:32

hikaru hat geschrieben:
Cae hat geschrieben:Zu deiner Assembler-Syntax faellt mir nur ein, dass mov b a die klassische Registerinhaltskopie von a nach b war.
Laut [1] ist die Reihenfolge von Ziel und Quelle hier genau umgekehrt. Frag micht nicht warum!

[1] http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm
Okay, es kommt drauf an, wie rum man guckt. Meine Literatur dazu ist MS-DOS-zentriert, dort ist es wohl MOV dst,src. gdb meint mov $0x3,%edx, wenn ich eine Funktion mit einem Parameter 3 aufrufe, was offensichtlich andersherum ist.

[1] laesst vermuten, dass es (zusaetzlich?) eine Unterscheidung in AT&T- und Intel-Syntax gibt. [Edit: Ja, ist genau so [2].]

Gruss Cae

[1] https://de.wikipedia.org/wiki/Assembler ... schreibung
[2] https://en.wikipedia.org/wiki/X86_assem ... age#Syntax
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten