Добавление двух 64-битных чисел в сборку

Итак, я изучаю MIPS с помощью симулятора SPIM, и я застрял в этой проблеме.

Я хочу добавить два 64-битных числа, которые хранятся в четырех 32-битных регистрах. Поэтому я добавляю байты LO, а затем байты переноса и байты HI. Но нет команды adc/addc, т.е. добавить с переносом.

Поэтому мне пришлось бы добавить бит переноса в регистр состояния. Но как именно я могу прочитать этот регистр?

Если $t0 является временным регистром 1, то каков эквивалент регистра состояния, который содержит флаг переноса?

Я много гуглил, но до сих пор не могу найти примеров, которые даже используют регистр состояния.


person Community    schedule 15.08.2009    source источник
comment
в MIPS нет регистра состояния или флага   -  person phuclv    schedule 24.10.2014


Ответы (1)


Сложите $t2 $t3 + $t4 $t5, получите $t0 $t1

addu  $t1, $t3, $t5    # add least significant word
sltu  $t0, $t1, $t5    # set carry-in bit 
addu  $t0, $t0, $t2    # add in first most significant word
addu  $t0, $t0, $t4    # add in second most significant word

Что касается второй части вашего вопроса, регистра статуса нет. Вовсе нет. Нада.

person Gunther Piez    schedule 15.08.2009
comment
Спасибо. Понятно, почему я не смог найти регистр статуса :) Ваш ответ работает отлично. Есть ли место с советами по лучшему кодированию MIPS? - person ; 16.08.2009
comment
Есть немного. Для меня медитация над исходным кодом других людей или просмотр objdump -S работает. Вы можете учиться на тех редких случаях, когда компилятор делает что-то правильно, но еще большему можно научиться на тех местах, где они, как обычно, выдают полную чушь ;-) cs.unibo.it/~solmi/teaching/arch_2002-2003/ также дает несколько полезных советов. - person Gunther Piez; 16.08.2009
comment
Отличное решение. Мне нравится, когда решения кажущихся сложными (ИМХО) проблем настолько элегантны. - person Derek; 06.11.2009
comment
Это в значительной степени окончательный способ сделать это (если вы хотите увидеть, переполняются ли два 64-битных числа, вы все равно можете сделать это в четырех инструкциях, просто еще один регистр для второго результата и изменения регистров вокруг). Если говорить о хорошем справочном материале, «Пробеги MIPS» Доминика Свитмана — это моя книга для начинающих. Хотя он не держит вас за руку, если вы не знаете общего программирования на ассемблере, он охватывает MIPS внутри и снаружи, включая множество конкретных вариантов микросхем. - person D'Nabre; 23.04.2012
comment
может быть быстрее выполнить addu $t1, $t3, $t5 и addu $t0, $t2, $t4 перед добавлением переноса sltu $at, $t1, $t5; addu $t0, $t0, $at, поскольку большинство современных процессоров имеют несколько ALU/FPU, которые могут выполнять множество инструкций одновременно, если они не зависят друг от друга и от предыдущих результатов. - person phuclv; 24.12.2013