2017-10-15 5 views
1

Récemment, je vais apprendre un langage de base de l'assemblage, j'ai cherché wiki et ce que je réalise est que le langage d'assemblage est juste une "version texte" du langage machine pour permettre à l'humain de lire? Cela signifie donc que tout ce que le langage machine peut faire en langage assembleur peut également finir, n'est-ce pas? Ou il existe une limitation dans le langage d'assemblage, tout comme un écart entre le langage de programmation de haut niveau et le langage d'assemblage (Quelque chose que nous ne pouvons pas bien faire dans un langage de haut niveau, donc nous devons utiliser l'assemblage) Language de machine?Y a-t-il quelque chose que le langage assembleur ne peut pas faire mais que seul le langage machine peut?

Une autre question est que j'ai trouvé une langue inférieure à la langue de la machine est "microcode"? Est-ce que quelqu'un connaît la relation entre le code machine et le microcode?

+2

Tout dépend de votre assembleur qui transforme le texte en code machine. Sur x86, par exemple, certaines instructions d'assemblage peuvent être encodées en code machine de plusieurs manières, et votre assembleur peut ou non fournir un moyen pour spécifier celui que vous voulez. Cependant, cela n'a généralement pas d'importance. Le microcode se trouve à l'intérieur du processeur, vous n'avez normalement pas accès à cela en tant que programmeur d'application. – Jester

+0

https://electronics.stackexchange.com/questions/1911/microprogramming-vs-machine-language-programming – Juan

+0

Comme @Jester, la principale chose qui m'est apparue est lorsque vous voulez un encodage spécifique. Dans asm, vous pouvez utiliser 'db 0x90' ou quoi que ce soit à la place de' nop' pour encoder manuellement une instruction, mais sinon profiter de la commodité d'un assembleur. –

Répondre

3

Cela dépend de la façon dont vous définissez la différence entre l'ensemble et le code de la machine:

Si vous appelez un code « source » qui se traduit par un assembleur « code assembleur » la réponse claire est pour 99% des assembleurs utilisé: « Non »

vous pouvez ajouter des instructions de code machine que vous aimez votre code source assembleur en utilisant des instructions comme .byte ou db ou cependant vos noms assembleur cette instruction comme ceci:

move X,Y 
.byte 1 
.byte 2 
.byte 3 
add Y,X 

Si vous dites: Toute instruction est entré comme numéro (en utilisant l'instruction .byte) n'est pas assembleur la réponse est: « Souvent oui »:

Sur le 8088 par exemple, il y a des instructions qui peuvent être représentés de multiples façons: jmp ou mov ax, value par exemple. (Pour de nombreuses CPU RISC comme MIPS, c'est encore pire ...)

Si vous tapez une telle instruction dans un assembleur, l'assembleur est libre de décider comment l'instruction sera traduite. Le CPU exécutera les deux variantes de la même manière, alors pourquoi l'assembleur devrait-il vous donner la possibilité de choisir entre les deux variantes? Cependant, d'autres exigences peuvent vous forcer à utiliser explicitement l'une des deux variantes: Il semble y avoir des émulateurs DOS qui nécessitent que la première instruction d'un certain format de fichier soit la variante à 3 octets d'une instruction jmp.

Si vous écrivez simplement le code assembleur suivant:

jmp _start 
_start: 
    ... 

Vous avez aucun contrôle si l'assembleur utilise 3 octets ou la variante 2 octets de l'instruction jmp _start. Je suppose que la plupart des assembleurs utiliseront la variante à 2 octets. S'il utilise la variante de 2 octets, un émulateur DOS ne pourra pas lire ce fichier!