Более простые способы сделать это? - PullRequest
1 голос
/ 26 января 2012

Это домашнее задание. Мой код дает правильный ответ. Выписывание решения, как я сделал, было ужасно запутанным и заняло у меня некоторое время. Есть ли лучший способ кодирования этого?

# Convert to MIPS: (((5 + 1) - (1 + 3) + (5 - 3)) - 1) – 5 + 3

main:
    li $t0 5
    li $t1 1
    li $t2 3
    #         (((5   + 1)   - (1   + 3)   + (5   - 3))   - 1)   – 5   + 3
    # becomes ((($t0 + $t1) - ($t1 + $t2) + ($t0 - $t2)) - $t1) - $t0 + $t2
    #         (((  $t3    ) - (  $t4    ) + (  $t5    )) - $t1) - $t0 + $t2

    add $t3, $t0, $t1
    add $t4, $t1, $t2
    sub $t5, $t0, $t2
    sub $t6, $t3, $t4
    add $t6, $t6, $t5
    sub $t6, $t6, $t1
    sub $t6, $t6, $t0
    add $a0, $t6, $t2

    li $v0, 1             # print $a0
    syscall

    li $v0, 10            # system call 10... lets us exit, load 10 in $v0
    syscall               # call the exit.

Ответы [ 2 ]

0 голосов
/ 26 января 2012

Я видел проблему, прокомментированную в вашем коде.

Да, вы можете сделать это более простым способом.Вы просто создаете отдельный раздел для каждой операции, которая происходит в том порядке, в котором они происходят.но это сделает ваш код длиннее и не так уж и более читабельным

li $t0 5
li $t1 1
add $t2, $t0, $t1

li $t0 1
li $t1 3
add $t3, $t0, $t1

sub $t4, t2, t3


li $t0 5
li $t1 3
sub $t2, $t0, $t1

add $t3, $t4, $t2

li $t0 1
sub $t2, $t3, $t0
#etc.
0 голосов
/ 26 января 2012

Если у вас есть компилятор MIPS C, вы всегда можете скомпилировать его с отключенными оптимизациями:

int main()
{
    int one, three, five;
    int result;

    one = 1;
    three = 3;
    five = 5;

    result = (((five + one) - (one + three) + (five - three)) - one) -
        five + three;
    return result;
}

, затем запустить objdump для результирующего объектного кода.Это не так, как ваш профессор хочет, чтобы вы это делали, но вы уже сделали это, и вы узнаете больше.

Редактировать :

Я обычно запускаюC препроцессором на моих языках ассемблера перед передачей их ассемблеру.Это может значительно облегчить чтение, когда для определенных вещей используются конкретные регистры:

#define FIVE  $t0
#define ONE   $t1
#define THREE $t2
#define FIVE_PLUS_ONE    $t3
#define ONE_PLUS_THREE   $t4
#define FIVE_MINUS_THREE $t5
#define ACCUM $t6

main:
    li FIVE 5
    li ONE 1
    li THREE 3
    //         (((5   + 1)   - (1   + 3)   + (5   - 3))   - 1)   – 5   + 3
    // becomes ((($t0 + $t1) - ($t1 + $t2) + ($t0 - $t2)) - $t1) - $t0 + $t2
    //         (((  $t3    ) - (  $t4    ) + (  $t5    )) - $t1) - $t0 + $t2

    add FIVE_PLUS_ONE, FIVE, ONE
    add ONE_PLUS_THREE, ONE, THREE
    sub FIVE_MINUS_THREE, FIVE, THREE
    sub ACCUM, FIVE_PLUS_ONE, ONE_PLUS_THREE
    add ACCUM, ACCUM, FIVE_MINUS_THREE
    sub ACCUM, ACCUM, ONE
    sub ACCUM, ACCUM, FIVE
    add $a0, ACCUM, THREE

    li $v0, 1             // print $a0
    syscall

    li $v0, 10            // system call 10... lets us exit, load 10 in $v0
    syscall               // call the exit.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...