Цель лабораторной работы

Листинг работающей программы

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/times.h>
  4. #include <unistd.h>
  5.  
  6. int getSign(int pow) {
  7.     return pow % 2 == 0 ? 1 : - 1;
  8. }
  9.  
  10. double findPi(int N) {
  11.     double result = 0.0;
  12.  
  13.     while (N >= 0) {
  14.         result += (double) (getSign(N) / (2.0 * N + 1.0));
  15.         N--;
  16.     }
  17.  
  18.     return result * 4.0;
  19. }
  20.  
  21.  
  22.  
  23. int main(int argc, char *argv[]) {
  24.     struct tms start, end;
  25.     long clocks_per_sec = sysconf(_SC_CLK_TCK);
  26.     long clocks;
  27.     //long long N = argc > 1 ? atoll(argv[1]) : 7500000000L;
  28.     int N = 1500000000;
  29.     times(&start);
  30.     double PI = findPi(N);
  31.     times(&end);
  32.     clocks = end.tms_utime - start.tms_utime;
  33.     printf("Result: %lf, N = %d, time = %lf sec\n", PI, N, (double) clocks / clocks_per_sec);
  34.     return 0;
  35. }

Список команд для компиляции

Листинг программы на ассемблере

...
...
...
...
...
...

Вывод по результатам лабораторной работы

По результатам выполнения лабораторной работы мы ознакомились с программной архитектурой x86/x86-64, научились анализировать ассемблерные листинги программ на данной архитектуре.

На основе полученных знаний мы получили возможность применения различных оптимизаций на самом низком уровне.

Также в процессе работы мы увидели ключевую разницу между архитектурами x86 и x86-64: наличие 64-битных регистров и команд для работы с ними.