Цель лабораторной работы
- Знакомство с программной архитектурой x86/x86-64
- Анализ ассемблерного листинга программы для архитектуры x86/x86-64
Листинг работающей программы
#include <stdio.h>
#include <stdlib.h>
#include <sys/times.h>
#include <unistd.h>
int getSign(int pow) {
return pow % 2 == 0 ? 1 : - 1;
}
double findPi(int N) {
double result = 0.0;
while (N >= 0) {
result += (double) (getSign(N) / (2.0 * N + 1.0));
N--;
}
return result * 4.0;
}
int main(int argc, char *argv[]) {
struct tms start, end;
long clocks_per_sec = sysconf(_SC_CLK_TCK);
long clocks;
//long long N = argc > 1 ? atoll(argv[1]) : 7500000000L;
int N = 1500000000;
times(&start);
double PI = findPi(N);
times(&end);
clocks = end.tms_utime - start.tms_utime;
printf("Result: %lf, N = %d, time = %lf sec\n", PI, N, (double) clocks / clocks_per_sec);
return 0;
}
Список команд для компиляции
- gcc -o lab3-O0.s -O0 main.c -S
- gcc -o lab3-O1.s -O1 main.c -S
- gcc -o lab3-O2.s -O2 main.c -S
- gcc -o lab3-O3.s -O3 main.c -S
- gcc -o lab3-Os.s -Os main.c -S
- gcc -o lab3-Ofast.s -Ofast main.c -S
Листинг программы на ассемблере
Вывод по результатам лабораторной работы
По результатам выполнения лабораторной работы мы ознакомились с программной архитектурой x86/x86-64,
научились анализировать ассемблерные листинги программ на данной архитектуре.
На основе полученных знаний мы получили возможность применения различных оптимизаций на самом низком уровне.
Также в процессе работы мы увидели ключевую разницу между архитектурами x86 и x86-64: наличие 64-битных регистров и
команд для работы с ними.