Как ассемблер MIPS получает немедленные (ПОСТОЯННЫЕ) значения?

#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.