2016-10-27 7 views
2

Я только начал изучать Собрание и в одном упражнении мне нужно найти выход из следующего кода, но, поскольку я очень новый, я не уверен, что это такое, и это главным образом из-за add.Вывод кода сборки - путаница с добавлением?

Код сборки:

addi $8, $0, 0  # $8 = $0 + 0 = 0 + 0 = 0 
addi $9, $0, 8  # $9 = $0 + 8 = 0 + 8 = 8 
L1: 
    add $4, $0, $8  # $4 = $0 + $8 = $8 
    addi $2, $0, 1  # $2 = $0 + 1 = 0 + 1 = 1 
    addi $8, $8, 1  # $8 = $8 + 1 
    syscall  # show the number in $4 
bne $8, $9, L1  # if $8 ≠ $9 go to L1 (line 3) 

Я смотрю на него, приведенный выше код должен выводить номера 0-7, но так как я новичок в Ассамблее, я думал о переводе кода C++, чтобы понять это, но в C++ я получил 1-8, потому что я был склонен переводить add $4, $0, $8 как $4 = &$8.

C++ Код:

#include <iostream> 
using namespace std; 

int main() { 
    int $0 = 0, $2, $8, $9, *$4; 

    $8 = $0 + 0;  // $8 = 0 
    $9 = $0 + 8;  // $9 = 8 

    do { 
    $4 = &$8; 
    $2 = $0 + 1; 
    $8 = $8 + 1; 
    cout << *$4 << endl; 
    } 
    while ($8 != $9); 
    return 0; 
} 

Вопрос: ли Ассамблеи add $4, $0, $8 будет рассматриваться как $4 быть указателем на $8 или просто равно, что $8 находится время. (Смех был создан комментарием рядом с add).

+0

В то время как C++ является _valid_, как псевдо-код для прототипирования ПМО ассемблера, рассмотреть вопрос об изменении (например) '$ 0' в' r0' [также для других], если ни по какой другой причине, чтобы сделать его собрать более чисто и тихий LLs. Тем не менее, IIRC, может быть компилируемый вариант, позволяющий '' 'символам в любом случае –

+0

Спасибо за подсказку @CraigEstey :) –

ответ

2

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

Обратите внимание, что вы можете сделать то же самое, используя move $4 $8.

+0

Итак, он выводит **' 0-7' **? –

+0

Да, это правильно. –

+0

Чтобы установить $ 4 по адресу $ 8, вам придется использовать 'la $ 4 $ 8'. –

2

Как указано Zach, ваш код на C++ устанавливает 4 доллара на значение адреса 8 долларов США, но сборка устанавливает значение от 4 до 8 долларов США. Таким образом, приведен правильный код на C++. То, что он распечатывает, остается как упражнение!

Дополнительно $ 2 устанавливается только для системного вызова, поэтому нам не нужен он в нашем коде на C++: я удалил его, чтобы избавиться от предупреждения «неиспользуемая переменная».

#include <iostream> 
using namespace std; 

int main() { 
    int $0 = 0, $8, $9, $4; 

    $8 = $0 + 0;  // $8 = 0 
    $9 = $0 + 8;  // $9 = 8 

    do { 
    $4 = $8; 
    $8 = $8 + 1; 
    cout << $4 << endl; 
    } 
    while ($8 != $9); 
    return 0; 
} 
+0

Спасибо за ваш ответ @dave. Что вы подразумеваете *** $ 2 только для syscall ***? Мне было интересно, почему он существует даже в коде Ассамблеи, поскольку он не используется. –

+1

@AngelPolitis: вы должны указать операционную систему _which_ системный вызов, который вы хотите выполнить. Я предполагаю из кода, что номер syscall передан в $ 2, но вам нужно будет проверить вашу документацию. – dave

+0

Вы правы. Упражнение говорит * '', чтобы вывести целое число, мы должны установить от 2 до 1 и поставить значение, которое мы хотим напечатать, до $ 4 '' *.Мне непонятно, почему ** '$ 2' ** и почему **' $ 4' **, но, я думаю, я это выясню, когда узнаю. Спасибо за помощь. –