Разница между "перемещением" и "ли" на языке ассемблера MIPS

Я практиковал преобразование кода C в язык ассемблера MIPS, и мне трудно понять использование move и li в присваивании переменных.

Например, для реализации следующей строки C в MIPS:

int x = 0;

Если я правильно ее понимаю (я очень сомневаюсь в этом), похоже, что обе эти работы выполняются в MIPS-ассемблере:

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

Неужели я ошибаюсь? В чем разница между этими двумя строками?

Ответы

Ответ 1

Команда move копирует значение из одного регистра в другой. Команда li загружает определенное числовое значение в этот регистр.

Для конкретного случая нуля вы можете использовать либо постоянный нуль, либо нулевой регистр, чтобы получить это:

move $s0, $zero
li   $s0, 0

Нет никакого регистра, который генерирует значение, отличное от нуля, поэтому вам нужно будет использовать li, если вам нужен другой номер, например:

li $s0, 12345678