Как я могу прочитать биты с плавающей точкой, как если бы это было целочисленное значение? - PullRequest
1 голос
/ 11 февраля 2020

Я хочу прочитать каждый бит последовательно, интерпретируя его как целочисленное значение с прямым порядком байтов. Я не хочу привести или преобразовать значение; просто прочитайте битовое представление как есть, но интерпретируйте его так, как если бы оно было 32-битным целым.

Floating point representation of 49:
49.0  =  0 10000100 10001000000000000000000
 sign bit^ ^exp.    ^mantissa

Read as an int:
01000010010001000000000000000000 = 1111752704 (base 10)

По сути, я хочу воспроизвести следующее C выражение:

float y=49.00;
long i=*(long *) &y;

Я попытался просто скомпилировать код C выше, используя godbolt и посмотреть на вывод, но результат не будет работать в MARS.

Некоторые вещи, которые я пробовал, не помогли :

    .data

floatlabel:   .float 2.5

# [...]

    l.s $f0,floatlabel
    sw $t0,0($f0)
    lwc1 $f1,floatlabel
    s.s $f1,floatlabel
    lw $t0,floatlabel

Первое вызывает ошибку компиляции "$f0": operand is of incorrect type; второй "2.5": operand is of incorrect type,

1 Ответ

2 голосов
/ 12 февраля 2020

Большое спасибо @ErikEidt за его ответ: инструкции mtc1 и mfc1 - это то, что я искал, так как они перемещают значения в и из сопроцессора с плавающей запятой без изменения битового шаблона. Чтобы прочитать значение FP с одинарной точностью, как если бы оно было int, я сделал следующее:

mtc1 $t0, $f0
cvt.s.w $f0, $f0  # changes the bit pattern 
                  # from word to single-precision
mfc1 $t0, $f0
...