2017-10-20 14 views
1

Récemment, j'ai commencé l'assemblage d'apprentissage par un canal youtube et avait une question sur la déclaration d'une étiquette dans la section .dataQuelle est la signification pour le test db « Bonjour tout le monde » dans l'assemblage pour l'architecture X86 sur le système Linux

Lorsque nous écrire quelque chose comme: test db "bonjour monde", le lable "test" quelque chose comme pointeur en langage progamming? (ce qui signifie qu'il contient l'adresse mémoire du premier élément dans le texte "hello world")

quand nous écrivons: test mov rsi, cela signifie-t-il que nous jetons l'adresse de "hello world" dans le registre rsi?

Une autre question concerne l'utilisation de [], quel est le sens de l'écriture [Test]? Est-ce que ça veut dire quelque chose comme déréférencer en C? Tout comme derefernce le test de pointeur et que d'obtenir la lettre "t" qui est la première lettre dans "hello world"?

Je serai vraiment apprécier pour tout responsable de ma question.

+0

Pour une bonne réponse, affichant le code source du programme que vous faites référence serait utile. – fuz

+2

'test' est l'adresse de''h''. Full '" hello world "' sont plusieurs octets, occupant plusieurs adresses en mémoire. BTW, IMO regarder YouTube pour des choses comme l'apprentissage ASM doit être beaucoup plus lent que de lire un bon livre à ce sujet (ce qui expliquerait probablement tout cela bien). Je serais très méfiant sur la qualité de tout tutoriel ASM sous forme de vidéo, juste parce que cette forme ne peut pas couvrir suffisamment de détails (mais peut être un début). – Ped7g

+0

Je pense que c'est une bonne cible en double; il semble couvrir ce que vous demandez. L'équivalent C de 'test: db 'bonjour monde'' est 'test de char [] = {'h', 'e', ​​..., 'd'};' (sans aucun octet de fin). Ou si c'est dans 'section .rodata', alors' const char test [] = ... '. –

Répondre

1

Oui, essentiellement la quasi-totalité de vos suppositions sont la plupart du temps correct. La grande différence entre une étiquette et un pointeur C est qu'un pointeur est réellement stocké et peut être modifié pendant l'exécution, mais une étiquette est seulement connue de l'assembleur (sauf si elle est exportée dans la table de symboles avec la directive globale), donc une étiquette est l'adresse mémoire, mais elle est constante et ne peut pas être modifiée pendant l'exécution. La syntaxe [] syntax signifie fréquemment "les données stockées à", mais en réalité cela affecte la façon dont l'instruction est encodée par l'assembleur, ce qui dépend vraiment de l'instruction avec laquelle elle est utilisée. Par exemple, l'instruction lea utilise la syntaxe [] pour faire l'arithmétique de l'adresse, mais n'accède pas à la mémoire à l'adresse résultante. Cependant, s'il est utilisé avec move, il adresse toujours l'arithmétique, mais accède également à la valeur stockée à l'adresse résultante.

Ne pensez pas comme un « opérateur », pensez comme un codage opérande.

+0

'lea' est un peu comme le' 'et opérateur en C. Alors' rax Ica, [rdi + rsi] 'est comme' uint64_t rax = (uint64_t) & rdi [rsi] '. [Il s'agit essentiellement d'un moyen d'exposer les capacités de décodage en mode d'adressage du matériel de l'UC pour une utilisation en tant qu'instruction shift-and-add] (https://stackoverflow.com/a/46597375/224132). Il utilise toujours le codage normal du code machine en mode adressage, il est donc logique qu'il utilise la même syntaxe asm. –

+0

Bon, c'est ce que j'essayais de dire. Mon point était que vous ne pouvez pas vraiment penser à [] comme opérateur de déréférencement, puisque ce n'est pas le cas, c'est utilisé pour accéder au codage en mode d'adressage, qui n'est pas toujours le même pour déréférencer une adresse. – prushik

+0

Je suppose que j'essayais de dire que c'est un opérateur deref, mais vous pouvez l'annuler avec lea comme '&' "annule" '*' ou '[]' en C. Mais Je suis d'accord pour dire que c'est une façon déroutante de regarder la syntaxe asm! –