#assembly #mips
#сборка #mips
Вопрос:
Я нигде не мог найти подобный вопрос. Например, когда мы хотим добавить предопределенное значение в память, мы получаем его адрес и копируем его содержимое, но если мы хотим добавить 40000 в регистр, как ассемблер интерпретирует 40000 и копирует его значение. Спасибо, если поможете мне понять эту концепцию
Комментарии:
1. Это то, что вы можете легко поэкспериментировать и выяснить сами. Используйте простой в использовании симулятор MARS и введите
li $t0, 40000
, затем посмотрите на сгенерированный машинный код и дизассемблирование. Вы даже можете попробовать разные значения, чтобы посмотреть, что получится!!2. в 32-битных инструкциях фиксированной длины нет места для 32-битных немедленных действий, поэтому архитектура должна решить эту проблему, mips решила ее, имея способы установить для верхних 16 бит значение immediate, а для нижних — нули, а затем ряд других, которые могут иметь 16-битные немедленные действия, которые можно использовать дляустановите / измените младшие 16 бит. Объедините два из них, и вы сможете создать любой битовый шаблон. если ваш immediate / constant имеет все нули для старших или младших 16 бит, то это можно сделать с помощью одной инструкции.
3. некоторые наборы команд будут загружать константу с относительной нагрузкой на ПК, другие имеют переменную длину, а вся константа является частью инструкции.
4. @ErikEidt спасибо за вашу помощь. На самом деле я имел в виду, как генерируются эти биты, и я думаю, что получил свой ответ, что клавиатура производит каждый бит и сохраняет его в памяти, я не знаю, правда это или нет
5. Этот последний комментарий и мой выбранный ответ не имеют смысла вместе. Если вы спрашиваете, как клавиатура, компьютер, операционная система и текстовый редактор работают вместе, это одно и то же и не имеет ничего общего с MIPS, языком ассемблера, машинным кодом или чем-то подобным. Если это вопрос машинного кода, который связан с языком ассемблера, то выбранный ответ демонстрирует инструкции.
Ответ №1:
Значение кодируется непосредственно в слове инструкции.
Например, инструкция ADDI rs,rt,immediate
имеет следующую кодировку:
001000 rs rt немедленное #бит: 6 5 5 16
Таким образом, непосредственная константа будет помещена в 16 младших значащих битов слова инструкции. Обратите внимание, что immediate имеет расширенный знак, поэтому он может кодировать только значения в диапазоне -32768 .. 32767. Таким образом, вы не можете добавить 40000 в регистр с помощью одной инструкции, если только у вас уже нет значения 40000 в каком-либо регистре.
Дополнительные сведения см. в документе Архитектура MIPS32™ для программистов, том II: Набор инструкций MIPS32™.
Ответ №2:
unsigned int fun0 ( void )
{
return 40000;
}
unsigned int fun1 ( void )
{
return 0x40000;
}
unsigned int fun2 ( void )
{
return 0x12345678;
}
unsigned int fun3 ( void )
{
return 0x12340000;
}
unsigned int fun4 ( void )
{
return 0x00005678;
}
Disassembly of section .text:
00000000 <fun0>:
0: 03e00008 jr $31
4: 34029c40 li $2,0x9c40 ; 0x34xxxxxx ORI $2,$0,0x9c40
00000008 <fun1>:
8: 03e00008 jr $31
c: 3c020004 lui $2,0x4
00000010 <fun2>:
10: 3c021234 lui $2,0x1234
14: 03e00008 jr $31
18: 24425678 addiu $2,$2,22136
0000001c <fun3>:
1c: 03e00008 jr $31
20: 3c021234 lui $2,0x1234
00000024 <fun4>:
24: 03e00008 jr $31
28: 24025678 li $2,22136 ; 0x24xxxxxx ADDIU $2,$0,0x5678
unsigned int fun5 ( void )
{
return 0x9999;
}
00000000 <fun5>:
0: 03e00008 jr $31
4: 34029999 li $2,0x9999 ; 0x34xxxxxx ORI $2,$0,0x9999
li — это псевдо-инструкция.
Комментарии:
1. К сожалению, в этой разборке не проводится различие между
ori
значениями with$zero
для 0 ..65535 иaddiu
значениями -32768 .. 32767. Он просто показывает их какli
.2. @PeterCordes да, компилятор создал li, ассемблер выбрал addiu для одного, когда он мог просто использовать ori для обоих случаев, а затем дизассемблер решил показать li вместо реальной инструкции.
3. Да, я понимаю, как и почему вы получили этот вывод из инструментов. Я вижу, вы поняли мою реальную точку зрения, что, сказав что-то о том, как
li
было реализовано в виде одной инструкции, это сделало бы лучший ответ, поскольку вы добавили это. 🙂4. Я подразумеваю, что требуется примерно столько же времени, чтобы просто показать вам инструмент / some примерно за то же время, которое требуется для создания вопроса SO… Я знал, что это будет делать add или or, но в то время не думал менять li.