11
votes

Est-il possible d'exécuter X86 assemblage sur un système d'exploitation X64?

Récemment, j'ai décidé que cela valait la peine d'essayer d'essayer l'assemblée de base x86 afin qu'elle soit plus facile de déboguer des programmes, etc., donc j'ai commencé (environ une semaine il y a environ une semaine) l'assemblage de X86, à cette époque, j'ai mis à niveau Mon ordinateur à 8 Go de RAM, donc mon installation X86 Windows XP gaspillait toute cette mémoire, maintenant, je cours une copie de Windows 7 x64, la question est donc la suivante:

est-il possible de travailler avec l'assemblage X86 sur un système d'exploitation X64? fonctionnera correctement dans l'émulateur? Ou devrais-je apprendre l'assemblage x64?


4 commentaires

J'aimerais freiner un peu sur cette question (semble assez pertinent et non-détournement de le faire): il y a beaucoup de ressources pour X86-32 dans le monde. Il semble que les différences ne soient pas très nombreuses entre 32/64 au niveau de l'assemblée. Compte tenu de la richesse de 32 matériaux, cela vaut-t-il la peine d'aller sur les 64 ressources et de se concentrer réellement sur 64 à ce stade (en supposant que l'on veut apprendre 64) ou, car cela (au moins semble) que l'important truc conceptuel est tout dans 32 et seules des choses telles que des registres de 64 bits sont vraiment importantes que cela me limite tout simplement à 32 pour juste casua


Pas tellement. Cependant, cela change si vous allez aux compilateurs. Les conventions d'appel et ABI diffèrent, et le SSE2 obligatoire sur X86_64 signifie qu'il est réellement utilisé. Aussi des choses comme la photo sont assez différentes. Néanmoins, ces différences sont réalisées cependant.


Marco, je ne suis pas tout à bien sûr que je comprenne: es-tu dit que vous pensez que les différences conceptuelles sont si triviales pour 64 comparativement à ce que quelqu'un d'apprentissage de l'assemblage peut les ignorer en toute sécurité et il suffit de se concentrer sur 32 sans crainte d'avoir à ne pas apprendre le "vieux" quand passe à 64 ans?


Il n'y a pas vraiment rien de dont vous avez besoin désapprendre . Apprendre à la fois les conventitions d'appel de Stack-Args (Hegacy 32 bits) et Register-Args (64 bits) auront un sens et que les conventions d'appel de 64 bits doivent utiliser Stack Args une fois à court de registres, par ex. Pour des fonctions avec plus de 6 ARG INTEGER. L'apprentissage de 32 bits en premier n'est pas un mauvais plan; Certaines choses sont plus simples là-bas. (Mais le maintien de l'alignement de la pile de 16 octets pour les conventions d'appel modernes est la plus laidienne dans les unités de 4 octets vs. 8 octets poussent 64 bits.)


3 Réponses :


14
votes

Oui, bien sûr. La plupart des programmes sont toujours 32 bits et fonctionnent bien sur des systèmes Windows 64 bits. Ces programmes sont la langue de la machine, qui comporte une mappage individuelle avec montage (et peut être facilement démonté dans le code de montage X86).


1 commentaires

Merci pour ça, je peux savoir continuer sans soucis



19
votes

est-il possible de travailler avec x86 Assemblage sur un système d'exploitation X64? Va-t-il fonctionner correctement dans l'émulateur?

Oui, c'est possible et il fonctionnera correctement. L'architecture de jeu d'instructions est toujours compatible à l'envers.

registres au x86-64:

 text alt
(Source: Usenix.org )

Par exemple: Ici, vous pouvez voir que RAX est le nouveau registre général 64 Généralités, mais vous pouvez toujours utiliser EAX car il fait référence à 32 bits inférieurs de RAX .

ou devrais-je apprendre l'assemblage x64?

L'architecture X86-32 est un sous-ensemble de X86-64. C'est comme tout d'abord, vous avez appris X86 puis aller et trouver ce qui est neuf dans l'assemblage X86-64. Une fois que vous avez appris X86 ASM. Ensuite, ce sera une ressource utile: HTTP : //www.cs.cmu.edu/~fp/courses/15213-s06/15213-S06/MISC/asm64-Apport.pdf


5 commentaires

Que signifie R à Rax? Je sais que e signifie étendu


@ kizzx2: r signifie enregistrer. E signifie étendu. Si vous allez à d'autres ISAS, vous trouverez des noms d'enregistrement comme R1, R2, R3 ...


Les visuels rendent toujours mieux une réponse.


Belle réponse avec une figure compréhensible.


Le x86 ISA est toujours compatible à l'envers, car c'est sa principale caractéristique / point de vente (et l'existence de processeurs rapides X86-64 la maintient également). Certaines puces Aarch64 ont supprimé la prise en charge du mode Arm32. Il n'est donc pas vrai en général que l'architecture d'instructions d'instruction est toujours compatible à l'envers. MIPS64R6 a même réorganisé certains opcodes dans les modes existants, il s'agit donc d'un processeur incompatible distinct qui n'est compatible qu'avec plus tôt MIPS au niveau source de l'ASM .



2
votes

Linux implémente explicitement de manière explicite 32 bits si l'option de compilation: xxx pré>

est définie. p>

Ceci est effectué par la plupart des distributions saines, y compris Ubuntu 14.04. P >

L'émulation 32 bits n'est bien entendu possible que car les processeurs X86-64 sont conçus pour être compatibles à l'envers avec des exécutables 32 bits via un mode d'émulation 32 bits que le noyau sait utiliser. p>

Une autre chose à craindre est que les bibliothèques: pour compiler des programmes 32 bits, vous avez besoin de bibliothèques 32 bits. Sur Ubuntu 14.04 AMD64: P>

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


1 commentaires

Le sous-système Windows pour Linux fait pas le faire; La couche d'émulation à l'intérieur du noyau Windows se comporte comme Linux avec config_ia32_emulation = n . Il ne peut pas exécuter des fichiers binaires 32 bits, ou 32 bits int 0x80 appels système à partir de 64 bits (que personne ne devrait faire en premier lieu, mais l'ASM écrit à la main par novices fait parfois) .