Forum Programmation.autre question théorique sur l'assembleur

Posté par . Licence CC by-sa.
Tags : aucun
1
20
août
2019

bonjour à tous,

je vous donne l'instruction qui me pose probleme, ca sera plus simple pour expliquer :

add ax, PTR BYTE [bp - 0x02]

dans le cas ou j'utilise un processeur 8086 avec un bus d'adresse de 20 bits et un bus de donnés de 16 bits.

comment en une instruction qui ne peut pas dépasser 16 bits, je peux contenir à la fois l'oppcode (ADD), le registre(ax), et l'adresse de 20 bits contenu dans PTR BYTE [bp - 0x02]

Merci d'avance de votre aide

  • # -

    Posté par . Évalué à 4 (+3/-0). Dernière modification le 20/08/19 à 19:20.

    Une instruction peut dépasser 16 bits.

    Premier exemple que je trouve au pif (je ne connais pas l'assembleur 8086) :

    mov dx,[0x7c52] se traduit en LM par 8B16527C, soit 32 bits.

  • # RISC vs CISC

    Posté par . Évalué à 5 (+3/-0). Dernière modification le 21/08/19 à 10:17.

    Salut,
    Les μProcesseurs RISC ont des instructions de taille égale à leur cœur. Parfois Souvent, ils ne peuvent accéder à la mémoire que aligné (ce qui permet d’économiser quelques précieux bits), pour charger une valeur constante dans un registre on a besoin de deux instructions…

    Les processeurs intel sont CISC, est peuvent donc avoir des instructions particulièrement longue en langage machine.

    Une explication plus complète que les wikipedia ici.

    • [^] # Re: RISC vs CISC

      Posté par . Évalué à 1 (+0/-0).

      qu'est ce que tu appelles le coeur d'un processeur ?

      car apparemment la taille d'une instruction peut dépasser la taille du bus de données

      • [^] # Re: RISC vs CISC

        Posté par . Évalué à 1 (+0/-0).

        Et pourquoi une instruction ne pourrait-elle pas depasser la taille du bus de donnees ?

        En plus il y a le 8086 avec un bus 16 bits et le 8088, absolument identique en tout point sauf qu'il ne dispose que d'un bus de donnees de 8 bits.

        Tu devrais consulter le manuel de l'utilisateur du 8086 : https://ia801302.us.archive.org/2/items/bitsavers_intel80869lyUsersManualOct79_62967963/9800722-03_The_8086_Family_Users_Manual_Oct79.pdf

      • [^] # Re: RISC vs CISC

        Posté par . Évalué à 2 (+0/-0).

        qu'est ce que tu appelles le coeur d'un processeur ?

        L’unité de cacul, de traitement, le nombre de bit que peut faire en parallèle l’additionneur interne. On parle de processeur 16bits les registres font 16 bits, le cœur de traitement peut faire des calculs sur 16 bits. Pour faire du 32 bits, il faut utiliser deux instructions add des parties basse (moins significatives) et adc (add avec carry) pour les parties hautes.

        car apparemment la taille d'une instruction peut dépasser la taille du bus de données

        Ça c’est possible sur un processeur CISC comme les intel 80xx. Mais impossible sur les processeur RISC comme le PowerPC o{ toutes les instructions font 32 bits, et pire, elles doivent être alignées sur 32bits en mémoire.

        • [^] # Re: RISC vs CISC

          Posté par . Évalué à 1 (+0/-0).

          sur les processeurs risc, quand on fait un add eax, [bp -0x1] comment ca se passe ? cette instruction fait au moins plus de 32 bits donc il faut au moins deux cycles d'horloges pour que les portes logiques du CPU fassent leurs travail pour exécuter cette instruction ?

          • [^] # Re: RISC vs CISC

            Posté par . Évalué à 2 (+0/-0).

            Sur un μP RISC tu as moins d’instruction disponible, donc tu écris plus d’instructions.

            Par exemple pour charger une valeur dans un registre :

            • CISC : MOV AX,0x1234 (codé sur au moins 3 octets)
            • RISC :
              • MOV AH,0x12 (serait codé sur deux octets)
              • MOV AL,0x34

            Mon exemple prend la symbologie intel puisque c’est celle que tu connais, mais on est d’accord que chaque processeur à son propre langage assembleur.

  • # .

    Posté par . Évalué à 3 (+2/-0). Dernière modification le 21/08/19 à 17:27.

    Salut,

    Attention dans ton exemple les operandes ont des tailles differentes ce qui est une erreur.

    Aussi, ne devrais-tu pas utiliser 'byte ptr' (ou word ptr ici) plutot que 'ptr byte' ? et de toute facon tu pourrais omettre l'indicateur de taille puisqu'il peut etre induit par le premier operande.

    Extra car je m'ennuie en ce moment :

    L'instruction ADD AX,[BP-2] s'encode en 3 octets: 03 46 FE

    Le premier octet est l'opcode. Le second est le mod/rm decrivant les arguments et le troisieme est le deplacement encode sur un octet signe.

    L'opcode est au format 000000dw binaire. Donc ici 00000011 binaire, d=1 (le registre est la destination) et w=1 (l'instruction opere sur un mot).

    Le mod/rm est 46 hexa ou 106 octal : 1 = l'operande memoire a un deplacement encode sur 8 bits signes. 0 = registre AX (et non AL puisque w=1). 6 = memoire [BP+deplacement].

    Je te laisse decouvrir les details.

    Question subsidiaire : comment encoderais-tu MOV [BP-2],AL : ?? 46 FE

    • [^] # Re: .

      Posté par . Évalué à 1 (+0/-0).

      La reponse etait : 88 46 FE hexa

      MOV rm,r et MOV r,rm s'encodent similairement en au moins deux octets : 100010dw binaire, mod/rm, …

      Les opcodes 88, 89, 8A et 8B hexa sont frequentes dans un programme.

      Donc ici : d=0 (la memoire est la destination) et w=0 (l'instruction opere sur un octet). Le mod/rm est 106 octal donc ce qui differe ici c'est le deuxieme chiffre, 0, qui correspond a AL et non AX puisque w=0.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.