Попробуй перевести C-код в сборку MIPS для работы на spim - PullRequest
0 голосов
/ 02 декабря 2009

Я написал код для вычисления факториала на C, однако я пытаюсь перевести его на язык ассемблера для работы на PCspim, но понятия не имею, как ?? может кто-нибудь помочь, пожалуйста?

код C:

 #include <stdio.h>

 #include <stdlib.h>

 #include <string.h>

void factorial(long argument, long *result) {

    if(argument < 2) {
    printf("%ld", *result);
    } else {
        long before = argument - 1;
        *result = *result * before;
        argument = before;
      factorial(argument, result);
         }
}

 int main() {

   long argument, answer, *result;

   printf("Factorial ");

   scanf("%ld", &argument);

   result = &answer;

   *result = argument;

   printf("%ld! = ",argument);

   factorial(argument, result);
 }

Ответы [ 3 ]

1 голос
/ 02 декабря 2009

Я написал компилятор, который делает это для удовольствия, с подмножеством синтаксиса asm для C в SPIM (конечно, рекурсия поддерживается) ..

Согласно этому

int f(int x) 
{
  if (x == 1)
        return 1;
    else
        return (x*f(x-1));
}

int main (void) {
  f(8);
}

компилируется в

    .data
.align 4
.align 1

    .text
    .globl main
main:
    subu $sp, $sp, 32
    sw $ra, 20($sp)
    sw $fp, 16($sp)
    addiu $fp, $sp, 28
    li $t6, 8
    move $a0, $t6
    jal f
    lw $ra, 20($sp)
    lw $fp, 16($sp)
    addu $sp, $sp, 32
    jr $ra

f:
    subu $sp, $sp, 36
    sw $ra, 24($sp)
    sw $fp, 20($sp)
    addiu $fp, $sp, 32
    li $t0, 1
    bne $a0, $t0, equal0
    li $t1, 1
    b equal1
equal0:
    li $t1, 0
equal1:
    li $t2, 0
    beq $t1, $t2, if2
    li $v0, 1
    lw $ra, 24($sp)
    lw $fp, 20($sp)
    addu $sp, $sp, 36
    jr $ra
    b if3
if2:
    li $t3, 1
    subu $t4, $a0, $t3
    sw $a0, 0($sp)
    move $a0, $t4
    jal f
    move $t5, $v0
    lw $a0, 0($sp)
    mulou $v0, $a0, $t5
    lw $ra, 24($sp)
    lw $fp, 20($sp)
    addu $sp, $sp, 36
    jr $ra
if3:
    lw $ra, 24($sp)
    lw $fp, 20($sp)
    addu $sp, $sp, 36
    jr $ra

Попробуйте, если он работает, он вообще не оптимизирован, но вы можете получить подсказку и изменить его в соответствии с вашими потребностями.

1 голос
/ 02 декабря 2009

SPIM - интерпретатор MIPS, поэтому вам придется писать эти процедуры в сборке MIPS ... Вы могли бы взглянуть на вывод

gcc -s

, который создает представления сборок, однако я подозреваю, что он ограничен архитектурой, на которой вы используете GCC (вероятно, X86. X86! = MIPS).

Когда несколько недель назад мне пришлось писать сборку MIPS для моего курса «Основы», я активно использовал статью Википедии и следующий веб-сайт: http://en.wikibooks.org/wiki/MIPS_Assembly/Arithmetic_Instructions

0 голосов
/ 02 декабря 2009

Вы пишете факториал с нуля или «компилируете» код на C? два очень разных подхода.

Когда я сделал какое-то кодирование RISC, я решил, что лучше всего псевдокодировать его и напрямую реализовать без ссылки на C.

Если вы компилируете, то каждый оператор C должен быть расширен до эквивалентной сборки RISC.

edit: Вот некоторая информация: страница из U курса Айдахо , в котором используется MIPS / spim.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...