2016-09-28 3 views
0

Это очень общий вопрос от очень нового кодера MIPS, но при преобразовании кода из C в MIPS меняется ли количество команд на основе реализации или всегда одно и то же? Например, я использовал уравнение, чтобы обнаружить, что для:Изменяется ли количество команд MIPS с внедрением?

for(i=0; i<a; i++) 
for(j=0; j<b; j++) 
D[4*j] = i+j; 

Мой счетчик инструкция (4 * а) + (8 * а * б) +4. Но изменится ли это в зависимости от того, как я на самом деле написал код? Благодаря!

+0

Что такое «код» здесь, код C (это важно, как вы его пишете, но это имеет большее значение, чем компилятор решает сделать) или сборку (очевидно, что ее запись по-разному приводит к тому, что она отличается)? – harold

+0

Под кодом я подразумеваю сборку, но, в частности, я имею в виду определение количества команд, в котором определяется isa и compiler. И в основном я спрашивал, есть ли способ изменить подсчеты команд. IE пишет код по-разному и поэтому имеет меньше инструкций или, если он в конечном итоге по существу просто сделает то же количество инструкций за большее время. – SN44

+0

Даже на одном уровне обучения иногда вы можете достичь тот же результат по другой инструкции. Подобно делящемуся значению на 2, можно выполнить либо «DIV», либо путем смещения битов вправо, результат результата будет таким же (но сдвиг не приведет к остатку). В C простой способ увидеть огромную разницу - просто проверить машинный код «debug» build по сравнению с «оптимизированной» сборкой. В сборке программист больше контролирует и обычно вы можете сказать от источника, что будет машинным кодом после компиляции точно, поскольку сборка в основном состоит из 1: 1 отображения inst. Мнемоники для машинного кода операции (кроме псевдостроения). – Ped7g

ответ

1

Конечно, существует почти никогда не один способ сделать что-то.

Например, для этих for петель есть «скучный» способ с тестом вверху и безусловный переход назад, а «чуть более умная» форма с тестом внизу и безусловный переход от «перед циклом» непосредственно к тесту. Это конкретная форма цикла-инверсии, которая не требует больше кода, но динамически выполняет меньшее количество инструкций (j больше не находится в цикле, это происходит только один раз), если цикл не имеет нулевых итераций.

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

«Вы» в этой истории тоже может быть компилятором. И вы (реальный вы на этот раз) обычно можете манипулировать тем, сколько команд он испускает, задавая ему определенные флаги. Обычно говорить о том, что он вообще не делает никакой оптимизации, компилятор испускает нагрузку при каждом использовании переменной и сохраняет при каждом присваивании, а при любой ненулевой оптимизации это не должно быть сделано.

Смежные вопросы