web-dev-qa-db-fra.com

Différence entre "move" et "li" dans le langage d'assemblage MIPS

Je pratiquais la conversion de code C en langage d'assemblage MIPS et j'ai du mal à comprendre l'utilisation de move et li dans l'affectation des variables.

Par exemple, pour implémenter la ligne C suivante dans MIPS:

int x = 0;

Si je le comprends bien (j'en doute fortement, cependant), cela ressemble à ces deux travaux dans l'assembleur MIPS:

move $s0, $zero
li $s0, $zero

Ai-je tort? Quelle est la différence entre ces deux lignes?

25
user2492270

L'instruction move copie une valeur d'un registre à un autre. L'instruction li charge une valeur numérique spécifique dans ce registre.

Pour le cas spécifique de zéro, vous pouvez utiliser le zéro constant ou le registre zéro pour obtenir cela:

move $s0, $zero
li   $s0, 0

Il n'y a pas de registre qui génère une valeur autre que zéro, donc vous devez utiliser li si vous voulez un autre nombre, comme:

li $s0, 12345678
48
duskwuff