Question

  1. Quelqu'un peut-il me expliquer pourquoi chaque constante dans la syntaxe AT & T a un « $ » devant elle?
  2. Pourquoi tous les registres ont un '%'?
  3. Est-ce juste une autre tentative de me faire faire beaucoup de dactylographie boiteux?
  4. Aussi, suis-je le seul qui trouve: 16(%esp) vraiment contre-intuitif par rapport à [esp+16]
  5. Je sais qu'il compile à la même chose, mais pourquoi quelqu'un voudrait taper beaucoup de « $ » et « % » s sans besoin? - Pourquoi avez GNU choisir cette syntaxe par défaut
  6. Une autre chose, pourquoi toutes les instructions dans la syntaxe AT & T précédée d'un: l? - Je connais son pour les tailles d'opérandes, mais pourquoi ne pas tout simplement laisser assembleur cela? (Ce que je voudrais jamais faire un movl sur des opérandes qui ne sont pas de cette taille?)
  7. La dernière chose: pourquoi sont les arguments mov inversés

est-il pas plus logique:

eax = 5
mov eax, 5

où au & t est:

mov 5, eax
5 = a (? wait what ?)

Note: Je ne cherche pas à la traîne. Je ne comprends pas les choix de conception qu'ils ont fait et je suis en train d'apprendre à connaître pourquoi ils ont fait ce qu'ils ont fait.

Était-ce utile?

La solution

1, 2, 3 et 5: la notation est un peu redondant, mais je trouve qu'il est une bonne chose lors du développement dans l'assemblage. La redondance permet la lecture. Le point de « laisser le chiffre assembleur dehors » se transforme facilement en « laisser le programmeur qui lit le chiffre du code dehors », et je ne l'aime pas quand je suis celui qui fait la lecture. La programmation est pas une tâche d'écriture seule; même le programmeur lui-même doit lire son propre code, et la redondance de syntaxe aide un peu.

Un autre point est que le « % » et « $ » signifie que les nouveaux registres peuvent être ajoutés sans casser la compatibilité ascendante: aucun problème à ajouter, par exemple, un registre appelé xmm4, car il sera écrit comme %xmm4, qui ne peut pas être confondu avec une variable appelée xmm4 qui serait écrit sans « % ».

En ce qui concerne la quantité de frappe: normalement, lors de la programmation dans l'assemblage, le goulot d'étranglement est le cerveau, pas la main. Si le « $ » et « % » vous ralentir, alors soit vous pensez de façon plus rapide que ce qui est généralement considéré comme faisable pour un être humain, ou, plus probablement, votre tâche est trop mécanique et ne doit pas se faire en Assemblée; il devrait être laissé à un générateur automatique de code, quelque chose familièrement connu comme un « compilateur C ».

Le suffixe « l » a été ajouté à gérer certaines situations où l'assembleur chiffre « ne peut pas » sortir. Par exemple, ce code:

mov  [esp], 10

est ambigu, car il ne dit pas si vous voulez écrire un octet de valeur 10, ou un mot de 32 bits avec la même valeur numérique. La syntaxe Intel appelle ensuite pour:

mov  byte ptr [esp], 10

ce qui est assez laid, quand on y pense. Les gens AT & T a voulu faire quelque chose de plus rationnel, donc ils sont venus avec:

movb   $10, (%esp)

et ils préféraient être systématique, et ont le 'b' (ou 'L' ou 'W') suffixe partout . Notez que le suffixe est pas toujours requis . Par exemple, vous pouvez écrire:

mov   %al, (%ebx)

et laisser l'assembleur GNU « figure » que puisque vous parlez de « % al », le mouvement est pour un seul octet. Ça marche vraiment ! Et pourtant, je trouve encore mieux de préciser la taille (il aide vraiment le lecteur, et le programmeur lui-même est le premier et le lecteur avant tout de son propre code).

Pour la « inversion »: il est l'inverse. La syntaxe Intel imite ce qui se passe dans C, où les valeurs sont calculées sur la droite, puis écrit à ce qui est à gauche. Ainsi, l'écriture va de droite à gauche, dans le sens « inverse », considérant que la lecture va de gauche à droite. La syntaxe AT & T revient à la direction « normale ». Au moins ils considérés; car ils ont été décidés sur l'utilisation de leur propre de toute façon de syntaxe, ils pensaient qu'ils pouvaient utiliser les opérandes dans ce qu'ils pensaient comme « l'ordre juste ». Ceci est la plupart du temps une convention, mais pas illogique. La convention C imite la notation mathématique, à l'exception que les mathématiques sont sur le définir valeurs ( "Soit x la valeur 5") et pas affectation valeurs ( "nous écrivons la valeur 5 dans une fente appelée 'x' "). Le choix AT & T est logique. Il est source de confusion que lorsque vous convertissez code C à l'assemblage, une tâche qui devrait généralement être laissée à un compilateur C.

La dernière partie de votre question 5 est intéressant, d'un point de vue historique. Les outils GNU pour x86 ont suivi la syntaxe AT & T, car à ce moment-là, ils essayaient de se emparer dans le monde Unix ( « GNU » signifie « GNU n'est pas Unix ») et en concurrence avec les outils Unix; Unix était sous le contrôle d'AT & T. Ceci est avant les jours de Linux ou même Windows 3.0; PC étaient des systèmes 16 bits. Unix utilisé la syntaxe AT & T, d'où GNU utilisé AT & T syntaxe.

La bonne question est alors: pourquoi AT & T a trouvé intelligent pour inventer leur propre syntaxe? Comme décrit ci-dessus, ils avaient des raisons, qui ne sont pas sans fondement. Le coût d'utilisation de votre propre syntaxe, bien sûr, est qu'il limite l'interopérabilité. dans lesjours, un compilateur C ou assembleur fait pas de sens réel comme un outil distinct: dans un système Unix, ils étaient destinés à être fournis par le fournisseur du système d'exploitation. En outre, Intel n'a pas été un acteur important dans le monde Unix; grands systèmes principalement utilisés VAX ou dérivés Motorola 680x0. Personne n'avait compris que le MS-Dos PC se transformer en, vingt ans plus tard, l'architecture dominante dans les mondes de bureau et serveur.

Autres conseils

1-2, 5: Ils ont choisi sans doute aux registres de préfixe et comme pour le rendre plus facile à analyser; vous savez directement au premier caractère quel type de jeton est.

4. Non

6. Encore une fois, sans doute pour le rendre plus facile pour l'analyseur de savoir quelle instruction de sortie

7: En fait, cela fait plus de sens dans un sens grammatical, déplacer ce . Peut-être le mov L'enseignement doit être un ld instruction.

Ne vous méprenez pas, je pense que la syntaxe AT & T est horrible.

La syntaxe assembleur GNU AT & T retrace ses origines à l'assembleur Unix 1 , qui lui-même a pris sa syntaxe d'entrée principalement du PDP-11 assembleur PAL-11 (vers 1970).

  

Quelqu'un peut-il me expliquer pourquoi chaque constante dans la syntaxe AT & T a un « $ » devant elle?

Il permet de distinguer les constantes immédiates des adresses de mémoire. Intel syntaxe, il fait l'inverse, avec des références de mémoire comme [foo].

Soit dit en passant, MASM (Microsoft Assembleur) n'a pas besoin d'une distinction au niveau de la syntaxe, car il peut dire si l'opérande est une constante symbolique ou une étiquette. D'autres assembleurs pour x86 évitent activement ces suppositions, car ils peuvent être source de confusion pour les lecteurs, par exemple:. TASM en mode IDEAL (il met en garde sur les références de mémoire non entre parenthèses), nasm, fasm

PAL-11 utilisé # pour immédiat mode d'adressage, où l'opérande a suivi l'instruction. Une constante sans # signifié Par rapport mode d'adressage, où une adresse relative a suivi l'instruction.

Unix tel qu'il est utilisé la même syntaxe pour les modes d'adressage que assembleurs DEC, avec * au lieu de @ et $ au lieu de #, puisque @ et # étaient apparemment peu pratique à taper 2 .

  

Pourquoi tous les registres ont un '%'?

En PAL-11, les registres ont été définis comme R0 = 0%, R1 =% 1, ... avec R6 aussi appelé SP, et R7 également appelé PC. Le DEC MACRO-11 macro-assembleur se référant aux registres a permis que %x, où x pourrait être une expression arbitraire, par exemple %3+1 appelé %4.

  

Est-ce juste une autre tentative de me faire faire beaucoup de dactylographie boiteux?

Non.

  

En outre, suis-je le seul qui trouve: 16 (% esp) vraiment contre-intuitif par rapport à [esp + 16]

Cela vient du PDP-11 Index mode d'adressage, où une adresse mémoire est formée en additionnant le contenu d'un registre et un mot d'index suivant l'instruction.

  

Je sais qu'il compile à la même chose, mais pourquoi quelqu'un voudrait taper beaucoup de « $ » et « % » s sans besoin? - Pourquoi choisir GNU   cette syntaxe par défaut?

Il est venu du PDP-11.

  

Une autre chose, pourquoi toutes les instructions dans la syntaxe AT & T précédée d'un: l? - Je connais son pour les tailles d'opérandes, mais pourquoi ne pas simplement laisser   la figure assembleur cela? (Ce que je voudrais jamais faire un movl sur   opérandes qui ne sont pas de cette taille?)

gaz peut généralement comprendre. D'autres assembleurs ont également besoin d'aide dans des cas particuliers.

Le PDP-11 utiliserait b pour des instructions d'octets, par exemple: CLR vs CLRB. D'autres suffixes sont apparus dans VAX-11: l longtemps, w pour mot, f pour flotteur, d pour le double, q quad mot, ...

Last thing: why are the mov arguments inverted?

On peut dire que, puisque le PDP-11 microprocesseurs Intel est antérieure, il est l'inverse.


  1. Selon le gaz info-page par l'assembleur BSD 4.2.
  2. Unix Assembleur Manuel de référence §8.1 - Dennis M. Ritchie

La raison AT & T de radiers opérandes ordre par rapport à Intel est très probablement parce que le PDP-11, sur lequel Unix a été développé à l'origine, utilise le même ordre d'opérandes.

Intel et DEC ont choisi simplement des ordres opposés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top