[ mladenmp @ 07.10.2009. 00:05 ] @
Napisati C kod koji odgovara sljedećem MIPS kodu:

Code:

.text

main:
        subu    $sp, $sp, 12            
        sw      $ra, 0($sp)             
        sw      $s0, 4($sp)             
        sw      $s1, 8($sp)             

        li      $s1, 0
read:   
        li      $v0, 4                  
        la      $a0, prompt
        syscall
        li      $v0, 5                  
        syscall
        move    $s0, $v0
        li      $t0, -1
        beq     $s0, $t0, printtot
        add     $s1, $s1, $s0
        j       read

printtot:
        li      $v0, 4
        la      $a0, tmsg
        syscall
        li      $v0, 1
        move    $a0, $s1
        syscall
        li      $v0, 4
        la      $a0, nl
        syscall

        lw      $s1, 8($sp)             
        lw      $s0, 4($sp)             
        lw      $ra, 0($sp)             
        addu    $sp, $sp, 12           
        jr      $ra

.data
    prompt: .asciiz ">"                     
    tmsg:   .asciiz "Rezultat je: "        
    nl:     .asciiz "\n"                    



Da li neko ima predstavu kako ovaj zadatak da se rijesi i uopste sta radi ovaj kod?

Pustio sam ga kroz PCSPIM i ne mogu da ga pokrenem da dobijem rezultat.

Pomozite ako mozete!
[ marcetam @ 09.10.2009. 01:08 ] @
Nisam nikad radio na SPIM-u pa ne znam zasto kod ne mozes da pokrenes, a ni kako se u C-u zovu/pozivaju njegovi syscall-ovi kada bi pisao program.

Da li nesto tipa:

__syscall(READ_INTEGER, argument);

ili imas lib izmedju, uradis neki #include pa koristis ovako nesto:

read_integer(argument);

Ajde radi lakse citljivosti koristicu ovo drugo.

Sto se tice programa:

1. Ispisuje prompt ">"
2. Ucitava integer
3. Korake 1 i 2 ponavlja sve dok ne uneses broj -1
4. Ako si uneo -1, onda ti ispise sumu prethodno unetih brojeva ne racunajuci -1
5. Ako nisi, sabira uneti broj sa prethodnom sumom i nastavlja da vrti dalje

U C-u, u nekom pseudo-kodu to bi izgledalo recimo ovako:

Code:

void sum_ints() {

    int a, b;

    for (a = 0;;a += b) {
        print_string(">");
        read_integer(b);
        if (b == -1) break;
    }
    print_string("Rezultat je: ")
    print_integer(a);
    print_string("\n");
}
/* eof */    


Samo da se odmah ogradim, ovo je primer C koda koji samo ilustruje sta radi onaj asm code. Sa aspekta secure coding-a je los jer ne vodi racuna o integer overflow-u (iako to ovde nema neke znacajne implikacije). Ipak, cisto sumnjam da PCSPIM uopste ima nesto poput FPE_INTOVF_TRAP i SIGFPE-a, tj. da mozes da definises signal handler kad nastane integer overflow.

Sto se tice MIPS-a, baci pogled na ove linkove:

MIPS Architecture and Assembly Language Overview
System Calls and I/O (SPIM Simulator)

Pozdrav,

marcetam
[ mladenmp @ 15.10.2009. 12:04 ] @
Evo sa velikim zakasnjenjem da kazem da je rijesen problem!
Ako nekome slucajno treba kod evo:

Code:

#include <stdio.h>

int main()
{
    int uneseni = 0;
    int rezultat = 0;
    do
    {
        printf(">");
        scanf("%d", & uneseni);

    
    
        if (uneseni != -1)
        {
            rezultat += uneseni;
        }
    
    }
    while(uneseni != -1);
    printf("Rezultat je: %d\n", rezultat );
    system("PAUSE");
}


@marcetam

Veliko hvala za pomoc!