В сборке MIPS как обрезать до двух десятичных знаков, если у меня есть значение с плавающей запятой X.YZDEF в регистре с плавающей запятой? - PullRequest
2 голосов
/ 06 апреля 2010

Если у меня есть значение в регистре "f" в MIPS, как мне обрезать его до X.YZ из X.YZDEF? Предположительно, вы должны конвертировать из числа с плавающей точкой в ​​два целых и отображать их ... Как это сделать?

Ответы [ 3 ]

2 голосов
/ 06 апреля 2010

Самое простое, что можно сделать:

  1. умножить значение на 100 (mul.d),
  2. округлить до целого числа, (round.l.d),
  3. преобразование обратно в число с плавающей запятой (cvt.d.l) и
  4. деление на 100 (div.d).
2 голосов
/ 06 апреля 2010

Возможно, вы захотите посмотреть, помогут ли вам эти ссылки.

http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_Assembly_Language

http://chortle.ccsu.edu/AssemblyTutorial/index.html#part8

Вы также можете найти это полезным: http://www.uni -koblenz.de / ~ avolk / MIPS / Материал / MIPSFloatingPointInstructions.pdf

Прошло много времени с тех пор, как я занимался программированием на ассемблере, но если вы умножите на 100 <<code>mul.s>, то вы скопируете число в регистр целых чисел, а затем поделите на 100 <<code>div> тогда у вас будут только две цифры справа. Число слева от десятичного разделителя будет в LO, а число справа должно быть в HI, я ожидаю.

1 голос
/ 08 июля 2013

Чтобы реализовать усечение (не округление) в MIPS, вы можете сделать следующее

# Note: The number you want to truncate is in $f12

##### Load 100 #####
li $t5,100                              # t5 = 100 (word),       t5 (word)
mtc1 $t5,$f5                            # f5 = t5  (word),       f5 (word)
cvt.s.w $f5,$f5                         # f5 = wordToSingle(f5), f5 (single)

##### Multiply f12(single) by 100 (single) #####    
mul.s $f12,$f12,$f5                     # f12 = f12 (single) * f5 (single), f12 (single)

##### Truncate single to word #####
trunc.w.s $f12,$f12                     # f12 = truncWordToSingle(f12 (single)), f12 (word)

##### Convert from word to single #####
cvt.s.w $f12,$f12                       # f12 = convertWordToSingle(f12 (word)), f12 (single)

##### Divide by 100 #####
div.s $f12,$f12,$f5                     # f12 = f12 (single) / f5 (single), f12 (single)
...