2017-05-17 6 views
-3

S'il y a une adresse d'un tableau char dans eax, quelle est la différence entre 0 (% eax) et (% eax)? Ou sont-ils les mêmes, tous deux se réfèrent au premier élément du tableau?Quelle est la différence entre 0 (% eax) et (% eax)?

+5

lorsque vous les avez assemblés puis démonté, avez-vous vu une différence? –

+0

Pensez à ce que signifie '0 (% eax)'. Cela signifie qu'il y a un décalage de 0 par rapport à la valeur de 'eax'. Maintenant, que veut dire '(% eax)'? Cela signifie la valeur dans 'eax'. Donc, tant que «x == x + 0», non, il n'y a évidemment aucune différence. –

+0

Si vous voyez quelque chose comme '0 (% eax)' dans la sortie du désassembleur (par opposition au code source de l'assemblage) alors le 0 est probablement la cible d'une relocalisation qui changerait une autre valeur lorsque le fichier objet est lié. –

Répondre

0

Ce sont les mêmes. En supposant que vous ayez défini correctement eax pour pointer vers l'adresse du premier élément du tableau, vous pourriez utiliser movb pour mettre un octet de données dans le tableau en l'utilisant.

+0

Qu'est-ce que 'MOVB' a à faire avec quelque chose ici? Si c'est juste un exemple aléatoire, c'est particulièrement déroutant car vous ne pouvez pas utiliser 'MOVB' avec' EAX', comme indiqué dans la question; un registre de taille BYTE est requis. Peut-être un meilleur exemple aurait-il été «MOVZBL»? Ou juste 'MOVL' pour stocker une valeur de taille DWORD. –

+0

La question posée à propos de char array dans eax, donc l'accès aux éléments du tableau nécessiterait un movb. ie: déplacer $ 32, 0 (% eax) – lostbard

1

Ils sont exactement les mêmes. Vous pouvez facilement le prouver par l'assemblage et désassemblage les deux instructions:

movl (%eax),%edx 
movl 0(%eax),%edx 
Disassembly of section .text: 

0000000000000000 <.text>: 
    0: 67 8b 10    mov (%eax),%edx 
    3: 67 8b 10    mov (%eax),%edx 

avis qu'ils ont exactement le même codage en octets.