Настройка ввода с использованием регистров - PullRequest
1 голос
/ 11 ноября 2011

У меня есть простая программа c для печати n чисел Фибоначчи, и я хотел бы скомпилировать ее в объектный файл ELF. Вместо того, чтобы устанавливать число чисел Фибоначчи (n) непосредственно в моем коде c, я хотел бы установить их в регистрах, поскольку я имитирую их для процессора ARM. Как я могу это сделать?

Вот фрагмент кода

#include <stdio.h>
#include <stdlib.h>

#define ITERATIONS 3

static float fib(float i) {
    return (i>1) ? fib(i-1) + fib(i-2) : i;
}

int main(int argc, char **argv) {

    float i;
    printf("starting...\n");

    for(i=0; i<ITERATIONS; i++) {
    printf("fib(%f) = %f\n", i, fib(i));
    }

    printf("finishing...\n");

    return 0;
}

Я бы хотел установить счетчик ITERATIONS в своих регистрах, а не в коде.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 12 ноября 2011

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

register float i;
register int numIterations = ITERATIONS;

, ноэто не сильно поможет.Прежде всего, компилятор может или не может использовать ваше предложение.Далее, значения все еще должны быть помещены в стек для вызова fib () , и, наконец, в зависимости от того, какие функции вы вызываете в вашем цикле, код в процедуре, вызываемой процедурой, может сохранить ваш регистрсодержимое в стеке фрейма при входе в процедуру и восстановите их как часть кода, реализующего возвращаемую процедуру.

Если вам действительно нужно подсчитать каждую инструкцию, вам нужно будет написать машинный код (используя сборкуязык).Таким образом, у вас есть прямой контроль над использованием вашего реестра.Программирование на ассемблере не для слабонервных.Развитие языка ассемблера в несколько раз медленнее, чем при использовании языков более высокого уровня, риск вставки ошибок выше, а их гораздо сложнее отследить.Языки высокого уровня были разработаны по причине, и язык C был разработан, чтобы помочь написать Unix.Миникомпьютеры, на которых работали первые системы Unix, были очень медленными, но причина, по которой C использовался вместо сборки, заключалась в том, что даже тогда было важнее иметь код, который занимал меньше времени на кодирование, имел меньше ошибок и был легче отлаживаться, чемассемблер.

Если вы хотите попробовать это, вот ответы на предыдущий вопрос о стековом потоке о ресурсах для программирования на ARM , которые могут быть полезны.

Одна тактика, которую вы можете использоватьсостоит в том, чтобы изолировать ваш критичный к производительности код в процедуре, написать процедуру на C, захват сгенерированного представления на ассемблере.Затем перепишите ассемблер, чтобы он был более эффективным.Тщательно протестируйте и получите хотя бы еще один набор глазных яблок, чтобы просмотреть полученный код.

Удачи!

1 голос
/ 11 ноября 2011

Сделайте ITERATIONS переменной, а не литеральной константой, тогда вы можете установить ее значение непосредственно в окне наблюдения или локальных данных отладчика / симулятора непосредственно перед выполнением цикла.

Как вариант, у вас есть поддержка stdio, почему бы просто не принять значение через консольный ввод?

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