2010-01-24 8 views
9

Kürzlich entschied ich, dass es einen Versuch wert war, eine einfache x86-Assembly zu testen, so dass es einfacher wäre, Programme usw. zu debuggen. So begann ich vor etwa einer Woche x86-Assembly zu lernen Computer zu 8 GB rAM, so obviusly meine x86 Windows XP Installation verschwendete bis alle diese Erinnerung, jetzt, ich bin ein x64 Windows 7 Kopie ausgeführt wird, so ist die Frage:Ist es möglich, x86-Assembly auf einem x64-Betriebssystem auszuführen?

ist es möglich, mit x86-Assembler zu arbeiten auf einem x64-Betriebssystem? Wird es im Emulator ordnungsgemäß ausgeführt? Oder sollte ich x64-Assembly lernen?

Antwort

11

Ja, natürlich. Die meisten Programme sind immer noch 32 Bit und laufen auf 64-Bit-Windows-Systemen einwandfrei. Diese Programme sind Maschinensprache, die eine Eins-zu-Eins-Zuordnung mit Assembly hat (und kann leicht in x86-Assemblercode zerlegt werden).

+0

Vielen Dank für das, ich kann ohne Sorgen –

17

Ist es möglich, mit x86 Assembly auf einem x64-Betriebssystem zu arbeiten? Wird es im Emulator ordnungsgemäß ausgeführt?

Ja, es ist möglich & es wird ordnungsgemäß ausgeführt. Die Befehlssatzarchitektur ist immer abwärtskompatibel.

Register in x86-64:

alt text http://www.usenix.org/events/bsdcon/full_papers/linden/linden_html/reg.gif

Zum Beispiel: Hier können Sie sehen, dass rax die neuen 64 General Purpose Register, aber Sie können immer noch eax verwenden, wie es bezieht sich 32 senken Bits von rax.

Oder sollte ich x64 Montage lernen?

x86-32 Architektur ist Teilmenge von x86-64. Es ist wie zuerst Sie x86 gelernt dann gehen Sie & finden Sie was neues in x86-64 Assembly. Sobald Sie x86 asm lernen. Dann wird dies eine nützliche Ressource sein: http://www.cs.cmu.edu/~fp/courses/15213-s06/misc/asm64-handout.pdf

+0

nette Antwort und danke für den Link wissen weiterhin, +1 – Andrey

+0

Was in rax ist r für stehen? Ich weiß, e steht für erweiterte – kizzx2

+1

@ kizzx2: 'r' steht für registrieren. 'e' steht für erweitert. Wenn Sie zu anderen ISAs gehen, finden Sie Registernamen wie r1, r2, r3 ... – claws

0

Ich möchte etwas zu dieser Frage (scheint ziemlich relevant und nicht-Hijacking zu tun) freeload: Es gibt viele Ressourcen für x86-32 in der Welt . Es scheint, als gäbe es nicht sehr viele Unterschiede zwischen 32/64 auf Assembly-Ebene. Betrachtet man den Reichtum an Material, lohnt es sich, die 64 Ressourcen aufzuspüren und sich an dieser Stelle wirklich auf 64 zu konzentrieren (vorausgesetzt man möchte 64 lernen) oder, zumindest scheint es, dass das wichtige konzeptionelle Zeug alles in 32 ist und nur Dinge wie 64-Bit-Register sind wirklich wichtig, dass es gut ist, mich auf 32 nur für lässige Bildungszwecke zu beschränken.

Mit anderen Worten, gibt es irgendwelche wesentlichen Unterschiede in der Installation, die in 64 vs 32 wesentlich anders wären?

+0

Nicht so sehr. Es ändert sich jedoch, wenn Sie zu Compilern gehen. Das Aufrufen von Konventionen und ABI unterscheidet sich, und die obligatorische SSE2 auf X86_64 bedeutet, dass sie tatsächlich verwendet wird. Auch Sachen wie PIC sind ziemlich unterschiedlich. Dennoch sind diese Unterschiede zwar beherrschbar. –

+0

Marco, ich bin nicht ganz sicher, ob ich das verstehe: meinst du, dass die konzeptionellen Unterschiede für 64 so trivial sind im Vergleich zu 32, dass jemand, der Assembly lernt, sie ignorieren kann und sich einfach auf 32 konzentriert, ohne Angst haben zu müssen. lerne den "alten" Weg, wenn du auf 64 ziehst? –

0

Linux implementiert explizit 32 Bit-Unterstützung, wenn die Übersetzungsoption:

CONFIG_IA32_EMULATION=y 

gesetzt.

Dies wird von den meisten vernünftigen Distributionen, einschließlich Ubuntu 14.04 getan.Die 32-Bit-Emulation ist natürlich nur möglich, weil x86-64-Prozessoren so konzipiert sind, dass sie mit 32-Bit-Programmen über einen 32-Bit-Emulationsmodus abwärtskompatibel sind, den der Kernel zu verwenden weiß.

Eine andere Sache, über die Sie sich Gedanken machen müssen, sind die Bibliotheken: Um 32-Bit-Programme zu kompilieren, benötigen Sie 32-Bit-Bibliotheken. Unter Ubuntu 14.04 AMD64:

sudo apt-get install gcc-multilib 

Dann können wir es einfach mit einem Hallo Welt testen:

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

int main() { 
    puts("hello world"); 
    return EXIT_SUCCESS; 
} 

und:

gcc -m32 hello_world.c 
./a.out 

Welche druckt:

hello world 

Und:

file a.out 

bestätigt, dass es 32-Bit:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=358f7969deeb2f24a8dd932a0d296887af4eae30, not stripped 
Verwandte Themen