2016-06-23 5 views
0

J'ai vu en utilisant gdb que lorsque des octets sont copiés de la mémoire dans des registres, ils sont inversés, si le système utilisé adopte la petite approche endian. Comme, au mieux de mes connaissances, l'ensemble d'instructions d'assemblage x86 ne permet pas d'opérations dont les opérandes sont toutes deux en mémoire, je me demandais: y a-t-il une opération qui s'effectue directement sur de petites valeurs endiennes?Opérations et endianess

+0

Vous pouvez avoir 2 opérandes de mémoire, mais au moins l'un d'entre eux doit être implicite. Voir par exemple 'push',' pop' ou 'movs'. Je ne comprends pas le reste de votre question, ou pourquoi il faudrait 2 opérandes de mémoire. Par exemple 'add [foo], eax' est légal et fonctionne sur la mémoire. – Jester

+0

Ce que je voulais dire était: considérez l'opération ajouter -0x8 (% ebp),% eax. Ce qu'il fait est d'obtenir la première valeur de la mémoire, l'inverser, puis l'ajouter au contenu de eax. Enfin, le résultat est stocké dans eax. Ma question est la suivante: y a-t-il une opération (à part celles de déplacement de la mémoire) qui n'inverse pas l'opérande de mémoire? – badnack

+1

il n'est pas "inversé", il est en mémoire dans le bon ordre et lu de la mémoire dans le bon ordre, ls byte voie d'abord, ms byte lane last, le contrôleur met les octets sur la bonne voie octet, comme sur un gros boutiste Le contrôleur met les octets sur la bonne voie d'octets. x86 permet non aligné donc c'est encore pire que de prendre des octets qui sont dans l'une des voies et les déplacer vers la bonne voie (soit sur le bus ou après l'intérieur du processeur, dépend de la conception). –

Répondre

2

Cette réponse peut sembler un peu étrange pour les gens expérimentés, mais ce que le questionneur recherche est appelé MOVBE. Il copie les données telles quelles (!) (Relatives à ses arguments) dans un registre. Il n'est pas disponible sur toutes les architectures, mais reste la meilleure solution à ce problème spécifique. Donc la réponse à

Je me demandais: existe-t-il une opération qui est effectuée directement sur de petites valeurs endian sans être inversée en premier?

est oui: MOVBE copie les octets dans l'ordre requis.

+1

Je crois que les gens d'expérience où essayer de dire que, bien, «movbe» est celui qui inverse les octets. Endianess est due au câblage interne du processeur, bien sûr, Intel n'a pas gaspillé de transistors pour inverser les mots. Vous semble répandre l'incompréhension qu'une valeur de registre est le nombre utilisé pour l'afficher. Nous ne savons pas comment le registre comme RAX est chargé, tout ce que nous savons c'est que l'octet à l'adresse basse va dans AL (l'octet bas) et vice versa. Si AL est en fait les bits 56-63 ou les bits 0-7, nous ne le savons pas. –