Bonsoir,
j'étudie toujours l'assembleur sur l'Atmega328p qui dispose de registres de 8 bits.
J'ai trouvé en ce qui concerne la multiplication de nombres non signés que le résultat est placé par le µC directement dans les registres généraux R0 ou R0 et R1.
- Lorsque le résultat est sur 8 bits, il est stocké dans R0 ;
- Lorsque le résultat est sur 16 bits, il est stocké dans R0 et R1 où R1 prend les bits de poids fort et R0 les bits de poids faible;
1/ Par exemple pour une multiplication dont le résultat est sur un octet :
ldi r16, 4
ldi r17, 3
mul r16, r17
Dans ce cas le registre R0 contient le résultat de la multitplication sur un octet : soit 0x0c en hexadécimal, 12 en décimal.
2/ Pour une multiplication dont le résultat est sur deux octets :
ldi r16, 18 ; 0x12
ldi r17, 52 ; 0x34
mul r16, r17
Ici le résultat se trouve dans les registres R1 et R0.
Le registre R1 contient les bits de poids fort : 0x03.
Le registre R0 contient les bits de poids faible : 0xa8.
Le résultat de la multiplication 0x12 x 0x34 = 0x3a8 soit 936 en décimal.
Ma question est la suivante : étant donné qu'il suffit de prendre R1 et de "l'accoler" à R0 pour obtenir le résultat de la multiplication sur 16 bits, comment pourrai-je procéder pour obtenir le résultat dans l'IDE arduino :
volatile uint16_t resultat16_bits ;
void setup() {
Serial.begin(115200);
asm
(
"ldi r18, 150 \n"
"ldi r19, 2 \n"
"mul r18, r19 \n"
);
Serial.println(resultat16_bits);
}
void loop() {}
Ici resultat16_bits
afficherait 300 en décimal.
Merci par avance à ceux qui voudront bien m'aider.
Bonne soirée.
PS :
Je ne suis pas sûr d'avoir bien compris mais il semble que les registres :
- R27 et R26 peuvent peut-être constituer un registre X sur 16 bits
Idem pour R29 et R28 (registre Y) et R31 et R30 (registre Z) mais il s'agit de mes petites suppositions de débutant en assembleur.