Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Assembler ::  ia32 Code mit einer ia64 CPU ausführen?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
triarii
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.04.2015
Beiträge: 11
Beitrag triarii Mitglied 18:05:43 10.03.2016   Titel:   ia32 Code mit einer ia64 CPU ausführen?            Zitieren

Hi,

Ich wollte mal wieder etwas assembly programmieren(ia32, GNU Syntax) unter Linux.
Leider habe ich eine 64-bit CPU.
Meine Frage: Weiß jemand, wie es mit der Kompatibilität aussieht?

Ich habe stark den Verdacht, dass es im Allgemeinen nicht kompatibel ist, da er mir manche Programme einfach nicht kompiliert.

BSP:

Assembler:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#schreibt den String auf die Konsole mithilfe von Linux-Syscall 4: WRITE
 
 
.section .rodata
message: .string "Hello GAS with IA32 Code \n"
.equ sys_write, 0x4
.equ stdout, 0x1
 
.section .text
.globl main
.type main, @function
 
main:
 
 
#print
mov $sys_write , %eax
mov $stdout , %ebx
mov $message, %ecx
mov $0x1A , %edx #26 Bytes
 
int $0x80
 
ret



Dieser einfache Code funktioniert.

Wenn aber z.B. der Stack mit ins Spiel kommt, gibt es Probleme.
Speicheraddressen sind ja 64bit, da akzeptiert er natürlich pushl nicht mehr, sondern man müsste pushq nehmen.. das kann man noch recht einfach umschreiben.

Aber bei Aufrufen von C-Funktionen komme ich an meine Grenzen.. kennt sich da jemand aus?
Folgender Code funktioniert bei mir NICHT.. ich kriege einen libc-Aufruf einfach nicht zum Laufen. Es kompiliert, aber ich kriege einen Segmentation Fault.

Assembler:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#schreibt string auf die Konsole
#printf aus libc wird aufgerufen
 
 
.section .data
    fmtstr: .string "Hello GAS. %s \n"
    extstr: .string "Written using libc function call printf \n"
.section .bss
 
.section .text
.globl main
.type main,@function
 
main:
 
 
#Parameter auf den Stack schieben, printf aufrufen
pushq   $extstr
pushq   $fmtstr
call    printf
 
#Parameter für printf löschen
add $0x10, %esp
 
mov $1, %eax
mov $0, %ebx
int $0x80
 
ret





ALSO:
Was läuft falsch? Kann mir jemand weiterhelfen? Sind das inkompatibilitätsprobleme, oder mache ich etwas falsch? Gibt es vllt. die Möglichkeit, ia32 Code auf einer ia64 auszuführen ?
Anmerkung: Ich habe den gcc benutzt, unter as funktioniert es aber auch nicht.

Danke schonmal für alle Antworten


Zuletzt bearbeitet von triarii am 18:06:30 10.03.2016, insgesamt 1-mal bearbeitet
camper
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 6949
Beitrag camper Mitglied 18:59:30 10.03.2016   Titel:   Re: ia32 Code mit einer ia64 CPU ausführen?            Zitieren

triarii schrieb:
ibt es vllt. die Möglichkeit, ia32 Code auf einer ia64 auszuführen ?
Selbstverständlich (mal vorausgesetzt der Kernel wurde mit der entsprechenden Option gebaut), benötigt aber logischweise auch die jeweilige 32-bit Version der Bibliotheken, die genutzt werden - bei den meisten Distributionen in Hinblick auf glibc kein Problem.

triarii schrieb:
Was läuft falsch?
Aufrufkonventionen nicht beachtet. Siehe ABI-Dokumention.

Ganz nebenbei, wenn es nur 64-bit sein soll, ist es zweckmäßig, auch das entsprechende Kernelinterface zu verwenden.

P.S. ia64 ist die falsche Bezeichnung, damit sind für gewöhnlich die 64-bit-Itaniums gemeint. amd64 oder x86_64 ist verständlicher.


Zuletzt bearbeitet von camper am 19:06:29 10.03.2016, insgesamt 4-mal bearbeitet
triarii
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.04.2015
Beiträge: 11
Beitrag triarii Mitglied 15:20:29 12.03.2016   Titel:              Zitieren

Zitat:
triarii schrieb:
ibt es vllt. die Möglichkeit, ia32 Code auf einer ia64 auszuführen ?
Selbstverständlich

Und wie würde das funktionieren? Muss man da anders kompilieren?

Zitat:
Aufrufkonventionen nicht beachtet. Siehe ABI-Dokumention.

Naja, in der ABI steht unter Aufrufkonventionen nur, dass Speicheraddressen auf dem Stack übergeben werden. Das habe ich doch gemacht?

Übrigens, der gnu-debugger sagt, es kommt zu einem Segmenation Fault beim Aufruf von printf, weil:
Code:
 __printf (format=0x1 <error: Cannot access memory at address 0x1>)
   at printf.c:28
      printf.c: No such file or directory.


Ich weiß leider immer noch nicht weiter :(


Zuletzt bearbeitet von triarii am 16:05:54 12.03.2016, insgesamt 1-mal bearbeitet
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1743
Beitrag icarus2 Mitglied 21:30:15 13.03.2016   Titel:              Zitieren

triarii schrieb:
Zitat:
triarii schrieb:
ibt es vllt. die Möglichkeit, ia32 Code auf einer ia64 auszuführen ?
Selbstverständlich

Und wie würde das funktionieren? Muss man da anders kompilieren?

Du musst die entsprechende 32-Bit Version der Libraries installieren. Kommt halt auf deine Distro an. Z.B. unter Arch Lnux brauchst du multilib und unter Ubuntu ist es (wenn ich mich richtig erinnere) ia32. Google einfach mal fuer deine Distro.

Um 32-Bit Executables zu erstellen kannst du in gcc das -m32 Compiler-Flag verwenden.


Zuletzt bearbeitet von icarus2 am 21:30:49 13.03.2016, insgesamt 1-mal bearbeitet
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1743
Beitrag icarus2 Mitglied 21:35:21 13.03.2016   Titel:              Zitieren

triarii schrieb:

Übrigens, der gnu-debugger sagt, es kommt zu einem Segmenation Fault beim Aufruf von printf, weil:
Code:
 __printf (format=0x1 <error: Cannot access memory at address 0x1>)
   at printf.c:28
      printf.c: No such file or directory.


Ich weiß leider immer noch nicht weiter :(

In x86_64 werden die ersten paar Argumente in Registern uebergeben und nicht auf dem Stack. Schau dir mal die Aufrufkonvention fuer x86_64 an.

PS: Sorry fuer DP


Zuletzt bearbeitet von icarus2 am 21:36:06 13.03.2016, insgesamt 2-mal bearbeitet
camper
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 6949
Beitrag camper Mitglied 11:40:56 15.03.2016   Titel:              Zitieren

triarii schrieb:
Naja, in der ABI steht unter Aufrufkonventionen nur, dass Speicheraddressen auf dem Stack übergeben werden.
Das steht dort nicht.

Seite 19 schrieb:
Arguments of types (signed and unsigned) _Bool, char, short, int, long, long long, and pointers are in the INTEGER class.

Seite 21 schrieb:
Once arguments are classified, the registers get assigned (in left-to-right order) for passing as follows:
1. ...
2. If the class is INTEGER, the next available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8 and %r9 is used.
Hast du das verlinkte Dokument überhaupt mal angeschaut?
triarii
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.04.2015
Beiträge: 11
Beitrag triarii Mitglied 19:58:37 17.03.2016   Titel:              Zitieren

Danke für eure Antworten.

Ja, ich habe mir die ABI angesehen, aber mich verlesen, tut mir leid.
Die Parameterübergabe funktioniert jetzt, so wie es dort beschrieben ist und ich kann jetzt die C-Funktionen aufrufen, danke :)

Welche Bibliothek ich brauche, muss ich mal noch gucken. Ich hab Bodhi.
C++ Forum :: Assembler ::  ia32 Code mit einer ia64 CPU ausführen?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.