Как сделать отрицательное число положительным в MIPS? - PullRequest
0 голосов
/ 21 февраля 2019

В основном название.У меня есть отрицательное число в MIPS ISA, и я хочу, чтобы оно было положительным - как лучше всего его достичь?Я могу изменить знак бит или что-то?Не совсем уверен, какой путь выбрать.

Для контекста я пытаюсь разделить на 2, чтобы уменьшить число до 1, но это невозможно, если числовой индекс отрицательный, поэтому я хочусделайте это первым, чтобы достичь этого.

1 Ответ

0 голосов
/ 21 февраля 2019

Я хотел бы дать некоторую дополнительную информацию (потому что Шут уже дал правильный ответ):

Могу ли я изменить знак иличто-то?

Существуют разные способы хранения отрицательных чисел:

  • Дополнение к двум
    Это наиболее распространенный способ хранения целых чисел, посколькуЦелочисленные операции большинства процессоров (включая MIPS) (такие как сложение, вычитание) автоматически дают правильный результат при использовании дополнения до двух.

  • Дополнение до одного
    Этот способ хранения чисел часто используетсяв правилах расчета контрольной суммы для интернет-протоколов (IPv4, TCP, UDP ...)

  • Абсолютное значение и знаковый бит
    Обычно числа с плавающей запятой хранятся таким образом.

Конечно, что вы должны сделать, зависит от того, какие числа вы обрабатываете.

Как сделать отрицательное число положительным в MIPS?

  • Отрицательные числа хранятся как два дополнения (наиболее вероятно, для целых чисел):
    Как Шут уже писал: Вычислить 0-x с subu $v0, $zero, $a0.

  • Вы рассчитываете контрольные суммы для интернета (дополнение):
    В этом случае вам нужно инвертировать все биты.Наилучшим вариантом в MIPS является nor $v0, $zero, $a0.
    Вместо этого вы можете x xor (-1) или (-1)-x.На процессорах MIPS значение (-1) может быть сгенерировано одной subiu инструкцией.(Но xori использует немедленное без знака 0..65535.)

  • Вы обрабатываете числа с плавающей запятой с помощью целочисленных инструкций и хотите инвертировать знак:
    В этом случаевам нужно изменить знаковый бит.
    Это делается с помощью x xor 0x80000000.
    В CPU MIPS вы можете сгенерировать константу 0x80000000 с помощью одной инструкции lui.

    (Это можно сделать, если у вас есть ЦП без поддержки с плавающей запятой, и вам нужно эмулировать операции с плавающей запятой с помощью целочисленных операций. Если у вас есть ЦП с поддержкой с плавающей запятой, вы обычно не будете делатьЭто, однако, вы также можете сделать это, если вы сначала скопируете регистр с плавающей запятой в регистр целых чисел, используя mfc1, а после операции вы копируете значение обратно, используя mtc1. Спасибо @ Alain Merigot для аннотации.)

  • У вас есть процессор MIPS или эмулятор MIPS с поддержкой чисел с плавающей запятой и вы хотите отменить число с плавающей запятой:
    Вы можете использовать инструкции neg.s (32-разрядная с плавающей запятой) или neg.d (64-разрядная с плавающей запятой) для отрицания числа.

Посмотрите, что MIPS GCC делает для всех 3 из них, для целого числавходы: https://godbolt.org/z/ca2nUE.

...