Оптимизировать код

Тема в разделе "WASM.BEGINNERS", создана пользователем Crash, 1 окт 2006.

  1. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Привет всем!

    У меня есть код на ASM'е, полученный с помощью Visual C++ 6.0. Отлично компилируется в MASM. Мне нужно его немного оптимизировать.

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

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

    Исходный код на C++ на всякий случай:

    Код (Text):
    1. //Процедура Sum.
    2. //Получает сумму С = А + В в системе счисления с основанием р.
    3. //В массивах a и b содержатся цифры представления соответственно A и B.
    4. //Полученный результат помещается в массив С.
    5. void Sum(int p, int n, int m, int *a, int *b, int &l, int *c) {
    6.     int i = 0;
    7.     int t = 0;
    8.  
    9.     if (n > m) {
    10.         do {
    11.             c[i] = a[i] + b[i] + t;
    12.             if (c[i] >= p) {
    13.                 c[i] -= p;
    14.                 t = 1;
    15.             }
    16.             i++;
    17.         } while (i < m);
    18.  
    19.         do {
    20.             c[i] = a[i] + t;
    21.             t = 0;
    22.             if (c[i] >= p) {
    23.                 c[i] -= p;
    24.                 t = 1;
    25.             }
    26.             i++;
    27.         } while (i < n);
    28.     } else {
    29.         do {
    30.             c[i] = a[i] + b[i] + t;
    31.             if (c[i] >= p) {
    32.                 c[i] -= p;
    33.                 t = 1;
    34.             }
    35.             i++;
    36.         } while (i < n);
    37.  
    38.         while (i < m) {
    39.             c[i] = b[i] + t;
    40.             t = 0;
    41.             if (c[i] >= p) {
    42.                 c[i] -= p;
    43.                 t = 1;
    44.             }
    45.             i++;
    46.         }
    47.     }
    48.  
    49.     if (t != 0) {
    50.         l = i + 1;
    51.         c[i] = 1;
    52.     } else {
    53.         l = i;
    54.     }
    55. }
    56.  
    57. int main(int argc, char* argv[]) {
    58.     int a[] = {0, 1, 1, 1};
    59.     int b[] = {1, 1, 1, 8};
    60.     int c[100];
    61.     int p = 10;
    62.  
    63.     int n = sizeof(a) / sizeof(a[0]);
    64.     int m = sizeof(b) / sizeof(b[0]);
    65.     int l;
    66.  
    67.     Sum(p, n, m, a, b, l, c);
    68.  
    69.     if (c[0] == 1 && c[1] == 2 && c[2] == 2 && c[3] == 9 && l == 4) {
    70.         printf("Test is OK\n");
    71.     } else {
    72.         printf("Test is NOT OK\n");
    73.     }
    74.     return 0;
    75. }
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    чтобы получить передачу через регистры, объяви ф-цию как fastcall и перекомпилируй. И возьми лучше седьмой VC. Он делает более быстрый код.
     
  3. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Используй fastcall... Хотя сначала надо оптимизировать алгоритм :)
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Crash
    Когда параметров много и сама функция их интенсивно использует, как в вашем примере, fastcall скорее ухудшит скорость и размер.
     
  5. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Спасибо всем большое!