From 9a28acb0c93e12b8db0fc3c380813035b4c6b1a6 Mon Sep 17 00:00:00 2001 From: Jan Potocki Date: Wed, 24 May 2023 20:05:11 +0200 Subject: [PATCH] =?UTF-8?q?R2023.05.1=20-=20aktualizacja=20wyk=C5=82adu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fibb_tsc/Makefile | 15 ++++++++++--- fibb_tsc/fibb_asm.s | 50 ++++++++++++++++++++++++++++++++++++++++++ fibb_tsc/fibb_bin.s | 47 +++++++++++++++++++++++++++++++++++++++ fibb_tsc/fibb_c.c | 12 +++++----- fibb_tsc/fibb_inline.c | 38 ++++++++++++++++++++++++++++++++ 5 files changed, 154 insertions(+), 8 deletions(-) create mode 100644 fibb_tsc/fibb_asm.s create mode 100644 fibb_tsc/fibb_bin.s create mode 100644 fibb_tsc/fibb_inline.c diff --git a/fibb_tsc/Makefile b/fibb_tsc/Makefile index c1ef2c0..8340441 100644 --- a/fibb_tsc/Makefile +++ b/fibb_tsc/Makefile @@ -1,13 +1,22 @@ -all: fibb_32 fibb_64 second +all: fibb_32 fibb_64 fibb_32_inline fibb_asm fibb_bin second fibb_32: fibb_c.c fibb32.s timestamp32.s gcc -m32 fibb32.s timestamp32.s fibb_c.c -o fibb_32 fibb_64: fibb_c.c fibb64.s timestamp64.s - gcc -no-pie fibb64.s timestamp64.s fibb_c.c -o fibb_64 + gcc fibb64.s timestamp64.s fibb_c.c -o fibb_64 + +fibb_32_inline: fibb_inline.c fibb32.s + gcc -m32 fibb32.s fibb_inline.c -o fibb_32_inline + +fibb_asm: fibb_asm.s fibb64.s + gcc fibb64.s fibb_asm.s -o fibb_asm + +fibb_bin: fibb_bin.s fibb64.s + gcc -no-pie fibb64.s fibb_bin.s -o fibb_bin second: second.c timestamp32.s gcc -m32 timestamp32.s second.c -o second clean: - rm fibb_32 fibb_64 second + rm fibb_32 fibb_64 fibb_32_inline fibb_asm fibb_bin second diff --git a/fibb_tsc/fibb_asm.s b/fibb_tsc/fibb_asm.s new file mode 100644 index 0000000..de9bdec --- /dev/null +++ b/fibb_tsc/fibb_asm.s @@ -0,0 +1,50 @@ +# Jan Potocki 2023 +# Wersja przystosowana do zbudowania jako PIE (Position Independent Executable) + +# Definicje numerow funkcji systemowych i ich parametrow +SYSEXIT64 = 60 + +# Stale okreslajace rozmiar przetwarzanych danych +word_length = 8 + +.global main + +# Segment niezainicjalizowanych danych +.bss +element: .space word_length + +# Segment zainicjalizowanych danych +.data +format_s: .asciz "%lu" +format_p: .asciz "%lu\n" + +# Segment kodu +.text + +main: +# To jest potrzebne zeby printf i scanf nie konczyly sie segfaultem +push %rbp +mov %rsp, %rbp + +lea format_s(%rip), %rdi # Adresowanie wzgledem rip, wprowadzone w x86-64 +#mov $format_s, %rdi # ...tu nam wystarczy sam adres +lea element(%rip), %rsi +#mov $element, %rsi +mov $0, %rax # Nie ma argumentow dla scanf() w rejestrach xmm +call scanf + + +lea element(%rip), %r8 # Tutaj trzeba jakis posredni rejestr... +movq (%r8), %rdi # ...zeby odwolac sie do wartosci +#movq element, %rdi +call fibb + +lea format_p(%rip), %rdi +#mov $format_p, %rdi +mov %rax, %rsi # rax - wartosc zwrocona przez fibb() +mov $0, %rax # Nie ma argumentow dla printf() w rejestrach xmm +call printf + +mov $SYSEXIT64, %rax +mov $0, %rdi +syscall diff --git a/fibb_tsc/fibb_bin.s b/fibb_tsc/fibb_bin.s new file mode 100644 index 0000000..9a85abf --- /dev/null +++ b/fibb_tsc/fibb_bin.s @@ -0,0 +1,47 @@ +# Jan Potocki 2020 +# Przyklad wywolania: +# echo 08 | xxd -p -r | ./fibb_asm | hexdump + +# Definicje numerow funkcji systemowych i ich parametrow +SYSEXIT64 = 60 +SYSREAD = 0 +SYSWRITE = 1 +STDIN = 0 +STDOUT = 1 + +# Stale okreslajace rozmiar przetwarzanych danych +word_length = 8 + +.global main + +# Segment niezainicjalizowanych danych +.bss +result: .space word_length + +# Segment zainicjalizowanych danych +.data +term: .zero word_length + +# Segment kodu +.text + +main: +mov $SYSREAD, %rax +mov $STDIN, %rdi +mov $term, %rsi +mov $word_length, %rdx +syscall + +movq term, %rdi +call fibb +movq %rax, result + +mov $SYSWRITE, %rax +mov $STDOUT, %rdi +mov $result, %rsi +mov $word_length, %rdx +syscall + +mov $SYSEXIT64, %rax +mov $0, %rdi +syscall diff --git a/fibb_tsc/fibb_c.c b/fibb_tsc/fibb_c.c index 6c5687e..3e78d38 100644 --- a/fibb_tsc/fibb_c.c +++ b/fibb_tsc/fibb_c.c @@ -1,5 +1,7 @@ #include +// Jan Potocki 2020 + unsigned long fibb(unsigned long n); unsigned long long timestamp(); @@ -7,15 +9,15 @@ int main() { unsigned long term, result; unsigned long long tstamp1, tstamp2; - + scanf("%lu", &term); - + tstamp1 = timestamp(); result = fibb(term); tstamp2 = timestamp(); - - printf("%lu\n", result); + + printf("Result: %lu\n", result); printf("Cycles: %llu\n", tstamp2-tstamp1); - + return 0; } diff --git a/fibb_tsc/fibb_inline.c b/fibb_tsc/fibb_inline.c new file mode 100644 index 0000000..d1967d9 --- /dev/null +++ b/fibb_tsc/fibb_inline.c @@ -0,0 +1,38 @@ +#include + +// Jan Potocki 2020 + +unsigned long fibb(unsigned long n); + +unsigned long long timestamp() +{ + unsigned long long tsc; + + asm volatile( + "xor %%eax, %%eax\n" + "cpuid\n" + "rdtsc" + : "=A" (tsc) + : + : "ebx", "ecx" + ); + + return tsc; +} + +int main() +{ + unsigned long term, result; + unsigned long long tstamp1, tstamp2; + + scanf("%lu", &term); + + tstamp1 = timestamp(); + result = fibb(term); + tstamp2 = timestamp(); + + printf("Result: %lu\n", result); + printf("Cycles: %llu\n", tstamp2-tstamp1); + + return 0; +}