From 75a75016ec3ca9a1a9c988b98015a0db74b65cc7 Mon Sep 17 00:00:00 2001 From: Andreia Ocanoaia Date: Fri, 3 May 2024 14:53:31 +0300 Subject: [PATCH] Adding inline exercises to lab/interactiune-c-assembly Adding 1-inline-for, 2-inline-rotate and 3-inline-rtdscp and reordering the exercises accordingly. Signed-off-by: Andreia Ocanoaia --- .../01-inline-for/.gitignore | 1 + .../01-inline-for/Makefile | 3 + .../01-inline-for/inline_for.c | 29 ++++ .../02-inline-rotate/.gitignore | 1 + .../02-inline-rotate/Makefile | 3 + .../02-inline-rotate/inline_rotate.c | 34 ++++ .../03-inline-rdtscp/.gitignore | 1 + .../03-inline-rdtscp/Makefile | 3 + .../03-inline-rdtscp/inline_rdtscp.c | 20 +++ .../.gitignore | 0 .../Makefile | 0 .../main.c | 0 .../max.asm | 0 .../Makefile | 0 .../{03-stack-frame => 06-stack-frame}/main.c | 0 .../print-hello.asm | 0 .../.gitignore | 0 .../Makefile | 0 .../main.asm | 0 .../max.c | 0 .../Makefile | 0 .../double_array.c | 0 .../main.asm | 0 .../.gitignore | 0 .../Makefile | 0 .../hello.c | 0 .../a-func/.gitignore | 0 .../a-func/Makefile | 0 .../a-func/hidden.c | 0 .../a-func/main.c | 0 .../a-func/ops.h | 0 .../a-func/plain.c | 0 .../b-var/.gitignore | 0 .../b-var/Makefile | 0 .../b-var/hidden.c | 0 .../b-var/main.c | 0 .../b-var/ops.h | 0 .../b-var/plain.c | 0 .../c-var-2/.gitignore | 0 .../c-var-2/Makefile | 0 .../c-var-2/hidden.c | 0 .../c-var-2/main.c | 0 .../c-var-2/ops.h | 0 .../c-var-2/plain.c | 0 .../correct/c-calls-cpp/.gitignore | 0 .../correct/c-calls-cpp/Makefile | 0 .../correct/c-calls-cpp/add.cpp | 0 .../correct/c-calls-cpp/main.c | 0 .../correct/c-calls-cpp/ops.h | 0 .../correct/c-calls-cpp/sub.cpp | 0 .../correct/cpp-calls-c/.gitignore | 0 .../correct/cpp-calls-c/Makefile | 0 .../correct/cpp-calls-c/add.c | 0 .../correct/cpp-calls-c/main.cpp | 0 .../correct/cpp-calls-c/ops.h | 0 .../correct/cpp-calls-c/sub.c | 0 .../errors/c-calls-cpp/.gitignore | 0 .../errors/c-calls-cpp/Makefile | 0 .../errors/c-calls-cpp/add.cpp | 0 .../errors/c-calls-cpp/main.c | 0 .../errors/c-calls-cpp/ops.h | 0 .../errors/c-calls-cpp/sub.cpp | 0 .../errors/cpp-calls-c/.gitignore | 0 .../errors/cpp-calls-c/Makefile | 0 .../errors/cpp-calls-c/add.c | 0 .../errors/cpp-calls-c/main.cpp | 0 .../errors/cpp-calls-c/ops.h | 0 .../errors/cpp-calls-c/sub.c | 0 .../Makefile | 0 .../main.c | 0 .../max.asm | 0 .../.gitignore | 0 .../Makefile | 0 .../main.asm | 0 .../max.c | 0 .../content/interactiune-c-assembly/README.md | 147 +++++++++++++----- .../solution/02-inline-rotate/.gitignore | 1 + .../solution/02-inline-rotate/Makefile | 3 + .../solution/02-inline-rotate/inline_rotate.c | 45 ++++++ .../.gitignore | 0 .../Makefile | 0 .../main.c | 0 .../max.asm | 0 .../Makefile | 0 .../{03-stack-frame => 06-stack-frame}/main.c | 0 .../print-hello.asm | 0 .../.gitignore | 0 .../Makefile | 0 .../main.asm | 0 .../max.c | 0 .../Makefile | 0 .../double_array.c | 0 .../main.asm | 0 .../.gitignore | 0 .../Makefile | 0 .../hello.c | 0 .../a-func/.gitignore | 0 .../a-func/Makefile | 0 .../a-func/hidden.c | 0 .../a-func/main.c | 0 .../a-func/ops.h | 0 .../a-func/plain.c | 0 .../b-var/.gitignore | 0 .../b-var/Makefile | 0 .../b-var/hidden.c | 0 .../b-var/main.c | 0 .../b-var/ops.h | 0 .../b-var/plain.c | 0 .../c-var-2/.gitignore | 0 .../c-var-2/Makefile | 0 .../c-var-2/hidden.c | 0 .../c-var-2/main.c | 0 .../c-var-2/ops.h | 0 .../c-var-2/plain.c | 0 .../Makefile | 0 .../main.c | 0 .../max.asm | 0 .../.gitignore | 0 .../Makefile | 0 .../main.asm | 0 .../max.c | 0 121 files changed, 250 insertions(+), 41 deletions(-) create mode 100644 laborator/content/interactiune-c-assembly/01-inline-for/.gitignore create mode 100644 laborator/content/interactiune-c-assembly/01-inline-for/Makefile create mode 100644 laborator/content/interactiune-c-assembly/01-inline-for/inline_for.c create mode 100644 laborator/content/interactiune-c-assembly/02-inline-rotate/.gitignore create mode 100644 laborator/content/interactiune-c-assembly/02-inline-rotate/Makefile create mode 100644 laborator/content/interactiune-c-assembly/02-inline-rotate/inline_rotate.c create mode 100644 laborator/content/interactiune-c-assembly/03-inline-rdtscp/.gitignore create mode 100644 laborator/content/interactiune-c-assembly/03-inline-rdtscp/Makefile create mode 100644 laborator/content/interactiune-c-assembly/03-inline-rdtscp/inline_rdtscp.c rename laborator/content/interactiune-c-assembly/{01-2-max-c-calls => 04-5-max-c-calls}/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{01-2-max-c-calls => 04-5-max-c-calls}/Makefile (100%) rename laborator/content/interactiune-c-assembly/{01-2-max-c-calls => 04-5-max-c-calls}/main.c (100%) rename laborator/content/interactiune-c-assembly/{01-2-max-c-calls => 04-5-max-c-calls}/max.asm (100%) rename laborator/content/interactiune-c-assembly/{03-stack-frame => 06-stack-frame}/Makefile (100%) rename laborator/content/interactiune-c-assembly/{03-stack-frame => 06-stack-frame}/main.c (100%) rename laborator/content/interactiune-c-assembly/{03-stack-frame => 06-stack-frame}/print-hello.asm (100%) rename laborator/content/interactiune-c-assembly/{04-5-max-assembly-calls => 07-8-max-assembly-calls}/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{04-5-max-assembly-calls => 07-8-max-assembly-calls}/Makefile (100%) rename laborator/content/interactiune-c-assembly/{04-5-max-assembly-calls => 07-8-max-assembly-calls}/main.asm (100%) rename laborator/content/interactiune-c-assembly/{04-5-max-assembly-calls => 07-8-max-assembly-calls}/max.c (100%) rename laborator/content/interactiune-c-assembly/{06-7-regs-preserve => 09-10-regs-preserve}/Makefile (100%) rename laborator/content/interactiune-c-assembly/{06-7-regs-preserve => 09-10-regs-preserve}/double_array.c (100%) rename laborator/content/interactiune-c-assembly/{06-7-regs-preserve => 09-10-regs-preserve}/main.asm (100%) rename laborator/content/interactiune-c-assembly/{08-include-fix => 11-include-fix}/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{08-include-fix => 11-include-fix}/Makefile (100%) rename laborator/content/interactiune-c-assembly/{08-include-fix => 11-include-fix}/hello.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/a-func/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/a-func/Makefile (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/a-func/hidden.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/a-func/main.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/a-func/ops.h (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/a-func/plain.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/b-var/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/b-var/Makefile (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/b-var/hidden.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/b-var/main.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/b-var/ops.h (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/b-var/plain.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/c-var-2/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/c-var-2/Makefile (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/c-var-2/hidden.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/c-var-2/main.c (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/c-var-2/ops.h (100%) rename laborator/content/interactiune-c-assembly/{09-export-fix => 12-export-fix}/c-var-2/plain.c (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/c-calls-cpp/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/c-calls-cpp/Makefile (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/c-calls-cpp/add.cpp (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/c-calls-cpp/main.c (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/c-calls-cpp/ops.h (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/c-calls-cpp/sub.cpp (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/cpp-calls-c/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/cpp-calls-c/Makefile (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/cpp-calls-c/add.c (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/cpp-calls-c/main.cpp (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/cpp-calls-c/ops.h (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/correct/cpp-calls-c/sub.c (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/c-calls-cpp/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/c-calls-cpp/Makefile (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/c-calls-cpp/add.cpp (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/c-calls-cpp/main.c (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/c-calls-cpp/ops.h (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/c-calls-cpp/sub.cpp (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/cpp-calls-c/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/cpp-calls-c/Makefile (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/cpp-calls-c/add.c (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/cpp-calls-c/main.cpp (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/cpp-calls-c/ops.h (100%) rename laborator/content/interactiune-c-assembly/{10-cpp-obs => 13-cpp-obs}/errors/cpp-calls-c/sub.c (100%) rename laborator/content/interactiune-c-assembly/{11-max-c-calls-x64 => 14-max-c-calls-x64}/Makefile (100%) rename laborator/content/interactiune-c-assembly/{11-max-c-calls-x64 => 14-max-c-calls-x64}/main.c (100%) rename laborator/content/interactiune-c-assembly/{11-max-c-calls-x64 => 14-max-c-calls-x64}/max.asm (100%) rename laborator/content/interactiune-c-assembly/{12-max-assembly-calls => 15-max-assembly-calls}/.gitignore (100%) rename laborator/content/interactiune-c-assembly/{12-max-assembly-calls => 15-max-assembly-calls}/Makefile (100%) rename laborator/content/interactiune-c-assembly/{12-max-assembly-calls => 15-max-assembly-calls}/main.asm (100%) rename laborator/content/interactiune-c-assembly/{12-max-assembly-calls => 15-max-assembly-calls}/max.c (100%) create mode 100644 laborator/content/interactiune-c-assembly/solution/02-inline-rotate/.gitignore create mode 100644 laborator/content/interactiune-c-assembly/solution/02-inline-rotate/Makefile create mode 100644 laborator/content/interactiune-c-assembly/solution/02-inline-rotate/inline_rotate.c rename laborator/content/interactiune-c-assembly/solution/{01-2-max-c-calls => 04-5-max-c-calls}/.gitignore (100%) rename laborator/content/interactiune-c-assembly/solution/{01-2-max-c-calls => 04-5-max-c-calls}/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{01-2-max-c-calls => 04-5-max-c-calls}/main.c (100%) rename laborator/content/interactiune-c-assembly/solution/{01-2-max-c-calls => 04-5-max-c-calls}/max.asm (100%) rename laborator/content/interactiune-c-assembly/solution/{03-stack-frame => 06-stack-frame}/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{03-stack-frame => 06-stack-frame}/main.c (100%) rename laborator/content/interactiune-c-assembly/solution/{03-stack-frame => 06-stack-frame}/print-hello.asm (100%) rename laborator/content/interactiune-c-assembly/solution/{04-5-max-assembly-calls => 07-8-max-assembly-calls}/.gitignore (100%) rename laborator/content/interactiune-c-assembly/solution/{04-5-max-assembly-calls => 07-8-max-assembly-calls}/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{04-5-max-assembly-calls => 07-8-max-assembly-calls}/main.asm (100%) rename laborator/content/interactiune-c-assembly/solution/{04-5-max-assembly-calls => 07-8-max-assembly-calls}/max.c (100%) rename laborator/content/interactiune-c-assembly/solution/{06-7-regs-preserve => 09-10-regs-preserve}/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{06-7-regs-preserve => 09-10-regs-preserve}/double_array.c (100%) rename laborator/content/interactiune-c-assembly/solution/{06-7-regs-preserve => 09-10-regs-preserve}/main.asm (100%) rename laborator/content/interactiune-c-assembly/solution/{08-include-fix => 11-include-fix}/.gitignore (100%) rename laborator/content/interactiune-c-assembly/solution/{08-include-fix => 11-include-fix}/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{08-include-fix => 11-include-fix}/hello.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/a-func/.gitignore (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/a-func/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/a-func/hidden.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/a-func/main.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/a-func/ops.h (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/a-func/plain.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/b-var/.gitignore (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/b-var/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/b-var/hidden.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/b-var/main.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/b-var/ops.h (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/b-var/plain.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/c-var-2/.gitignore (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/c-var-2/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/c-var-2/hidden.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/c-var-2/main.c (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/c-var-2/ops.h (100%) rename laborator/content/interactiune-c-assembly/solution/{09-export-fix => 12-export-fix}/c-var-2/plain.c (100%) rename laborator/content/interactiune-c-assembly/solution/{11-max-c-calls-x64 => 14-max-c-calls-x64}/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{11-max-c-calls-x64 => 14-max-c-calls-x64}/main.c (100%) rename laborator/content/interactiune-c-assembly/solution/{11-max-c-calls-x64 => 14-max-c-calls-x64}/max.asm (100%) rename laborator/content/interactiune-c-assembly/solution/{12-max-assembly-calls => 15-max-assembly-calls}/.gitignore (100%) rename laborator/content/interactiune-c-assembly/solution/{12-max-assembly-calls => 15-max-assembly-calls}/Makefile (100%) rename laborator/content/interactiune-c-assembly/solution/{12-max-assembly-calls => 15-max-assembly-calls}/main.asm (100%) rename laborator/content/interactiune-c-assembly/solution/{12-max-assembly-calls => 15-max-assembly-calls}/max.c (100%) diff --git a/laborator/content/interactiune-c-assembly/01-inline-for/.gitignore b/laborator/content/interactiune-c-assembly/01-inline-for/.gitignore new file mode 100644 index 00000000..0c1c1e91 --- /dev/null +++ b/laborator/content/interactiune-c-assembly/01-inline-for/.gitignore @@ -0,0 +1 @@ +/inline_for.asm diff --git a/laborator/content/interactiune-c-assembly/01-inline-for/Makefile b/laborator/content/interactiune-c-assembly/01-inline-for/Makefile new file mode 100644 index 00000000..c6ae534d --- /dev/null +++ b/laborator/content/interactiune-c-assembly/01-inline-for/Makefile @@ -0,0 +1,3 @@ +PROGNAME := inline_for +include ../../utils/Makefile.generic + diff --git a/laborator/content/interactiune-c-assembly/01-inline-for/inline_for.c b/laborator/content/interactiune-c-assembly/01-inline-for/inline_for.c new file mode 100644 index 00000000..c1b5075c --- /dev/null +++ b/laborator/content/interactiune-c-assembly/01-inline-for/inline_for.c @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BSD-3-Clause + +#include + +#define NUM 100 + +int main(void) +{ + size_t n = NUM; + size_t sum = 0; + + __asm__ ( + "xor eax, eax\n\t" /* collect the sum in eax */ + /* use ecx to go through items, start from n */ + "mov ecx, %1\n" + "add_to_sum:\n\t" + "add eax, ecx\n\t" + "loopnz add_to_sum\n\t" + /* place sum in output register */ + "mov %0, eax\n\t" + : "=r" (sum) /* output variable */ + : "r" (n) /* input variable */ + : "eax", "ecx" + ); /* registers used in the assembly code */ + + printf("sum(%u): %u\n", n, sum); + + return 0; +} diff --git a/laborator/content/interactiune-c-assembly/02-inline-rotate/.gitignore b/laborator/content/interactiune-c-assembly/02-inline-rotate/.gitignore new file mode 100644 index 00000000..1398922c --- /dev/null +++ b/laborator/content/interactiune-c-assembly/02-inline-rotate/.gitignore @@ -0,0 +1 @@ +/inline_rotate.asm diff --git a/laborator/content/interactiune-c-assembly/02-inline-rotate/Makefile b/laborator/content/interactiune-c-assembly/02-inline-rotate/Makefile new file mode 100644 index 00000000..e79bba7b --- /dev/null +++ b/laborator/content/interactiune-c-assembly/02-inline-rotate/Makefile @@ -0,0 +1,3 @@ +PROGNAME := inline_rotate +include ../../utils/Makefile.generic + diff --git a/laborator/content/interactiune-c-assembly/02-inline-rotate/inline_rotate.c b/laborator/content/interactiune-c-assembly/02-inline-rotate/inline_rotate.c new file mode 100644 index 00000000..fab95daa --- /dev/null +++ b/laborator/content/interactiune-c-assembly/02-inline-rotate/inline_rotate.c @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: BSD-3-Clause + +#include + +#define NUM 0x12345678 + +int main(void) +{ + size_t n = NUM; + size_t rot_left = 0; + size_t rot_right = 0; + + __asm__ ("" + /* TODO: Use rol instruction to shift n by 8 bits left. + * Place result in rot_left variable. + */ + + /* TODO: Use ror instruction to shift n by 8 bits right. + * Place result in rot_right variable. + */ + /* TODO: Declare output variables - preceded by ':'. */ + /* TODO: Declare input variables - preceded by ':'. */ + /* TODO: Declared used registers - preceded by ':'. */ + ); + + /* NOTE: Output variables are passed by address, input variables + * are passed by value. + */ + + printf("init: 0x%08x, rot_left: 0x%08x, rot_right: 0x%08x\n", + n, rot_left, rot_right); + + return 0; +} diff --git a/laborator/content/interactiune-c-assembly/03-inline-rdtscp/.gitignore b/laborator/content/interactiune-c-assembly/03-inline-rdtscp/.gitignore new file mode 100644 index 00000000..e03ed5d1 --- /dev/null +++ b/laborator/content/interactiune-c-assembly/03-inline-rdtscp/.gitignore @@ -0,0 +1 @@ +/inline_cpuid.asm diff --git a/laborator/content/interactiune-c-assembly/03-inline-rdtscp/Makefile b/laborator/content/interactiune-c-assembly/03-inline-rdtscp/Makefile new file mode 100644 index 00000000..6c232acf --- /dev/null +++ b/laborator/content/interactiune-c-assembly/03-inline-rdtscp/Makefile @@ -0,0 +1,3 @@ +PROGNAME := inline_rtdscp +include ../../utils/Makefile.generic + diff --git a/laborator/content/interactiune-c-assembly/03-inline-rdtscp/inline_rdtscp.c b/laborator/content/interactiune-c-assembly/03-inline-rdtscp/inline_rdtscp.c new file mode 100644 index 00000000..21a2ff93 --- /dev/null +++ b/laborator/content/interactiune-c-assembly/03-inline-rdtscp/inline_rdtscp.c @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: BSD-3-Clause + +#include + +int main(void) +{ + char rdtscp_str[13]; + + __asm__ ("" + /* TODO: Make rdtscp call and copy string in rdtscp_str. + * After rdtscp call result is placed in (EDX:EAX registers). + */ + ); + + rdtscp_str[12] = '\0'; + + printf("rdtscp string: %s\n", rdtscp_str); + + return 0; +} diff --git a/laborator/content/interactiune-c-assembly/01-2-max-c-calls/.gitignore b/laborator/content/interactiune-c-assembly/04-5-max-c-calls/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/01-2-max-c-calls/.gitignore rename to laborator/content/interactiune-c-assembly/04-5-max-c-calls/.gitignore diff --git a/laborator/content/interactiune-c-assembly/01-2-max-c-calls/Makefile b/laborator/content/interactiune-c-assembly/04-5-max-c-calls/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/01-2-max-c-calls/Makefile rename to laborator/content/interactiune-c-assembly/04-5-max-c-calls/Makefile diff --git a/laborator/content/interactiune-c-assembly/01-2-max-c-calls/main.c b/laborator/content/interactiune-c-assembly/04-5-max-c-calls/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/01-2-max-c-calls/main.c rename to laborator/content/interactiune-c-assembly/04-5-max-c-calls/main.c diff --git a/laborator/content/interactiune-c-assembly/01-2-max-c-calls/max.asm b/laborator/content/interactiune-c-assembly/04-5-max-c-calls/max.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/01-2-max-c-calls/max.asm rename to laborator/content/interactiune-c-assembly/04-5-max-c-calls/max.asm diff --git a/laborator/content/interactiune-c-assembly/03-stack-frame/Makefile b/laborator/content/interactiune-c-assembly/06-stack-frame/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/03-stack-frame/Makefile rename to laborator/content/interactiune-c-assembly/06-stack-frame/Makefile diff --git a/laborator/content/interactiune-c-assembly/03-stack-frame/main.c b/laborator/content/interactiune-c-assembly/06-stack-frame/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/03-stack-frame/main.c rename to laborator/content/interactiune-c-assembly/06-stack-frame/main.c diff --git a/laborator/content/interactiune-c-assembly/03-stack-frame/print-hello.asm b/laborator/content/interactiune-c-assembly/06-stack-frame/print-hello.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/03-stack-frame/print-hello.asm rename to laborator/content/interactiune-c-assembly/06-stack-frame/print-hello.asm diff --git a/laborator/content/interactiune-c-assembly/04-5-max-assembly-calls/.gitignore b/laborator/content/interactiune-c-assembly/07-8-max-assembly-calls/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/04-5-max-assembly-calls/.gitignore rename to laborator/content/interactiune-c-assembly/07-8-max-assembly-calls/.gitignore diff --git a/laborator/content/interactiune-c-assembly/04-5-max-assembly-calls/Makefile b/laborator/content/interactiune-c-assembly/07-8-max-assembly-calls/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/04-5-max-assembly-calls/Makefile rename to laborator/content/interactiune-c-assembly/07-8-max-assembly-calls/Makefile diff --git a/laborator/content/interactiune-c-assembly/04-5-max-assembly-calls/main.asm b/laborator/content/interactiune-c-assembly/07-8-max-assembly-calls/main.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/04-5-max-assembly-calls/main.asm rename to laborator/content/interactiune-c-assembly/07-8-max-assembly-calls/main.asm diff --git a/laborator/content/interactiune-c-assembly/04-5-max-assembly-calls/max.c b/laborator/content/interactiune-c-assembly/07-8-max-assembly-calls/max.c similarity index 100% rename from laborator/content/interactiune-c-assembly/04-5-max-assembly-calls/max.c rename to laborator/content/interactiune-c-assembly/07-8-max-assembly-calls/max.c diff --git a/laborator/content/interactiune-c-assembly/06-7-regs-preserve/Makefile b/laborator/content/interactiune-c-assembly/09-10-regs-preserve/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/06-7-regs-preserve/Makefile rename to laborator/content/interactiune-c-assembly/09-10-regs-preserve/Makefile diff --git a/laborator/content/interactiune-c-assembly/06-7-regs-preserve/double_array.c b/laborator/content/interactiune-c-assembly/09-10-regs-preserve/double_array.c similarity index 100% rename from laborator/content/interactiune-c-assembly/06-7-regs-preserve/double_array.c rename to laborator/content/interactiune-c-assembly/09-10-regs-preserve/double_array.c diff --git a/laborator/content/interactiune-c-assembly/06-7-regs-preserve/main.asm b/laborator/content/interactiune-c-assembly/09-10-regs-preserve/main.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/06-7-regs-preserve/main.asm rename to laborator/content/interactiune-c-assembly/09-10-regs-preserve/main.asm diff --git a/laborator/content/interactiune-c-assembly/08-include-fix/.gitignore b/laborator/content/interactiune-c-assembly/11-include-fix/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/08-include-fix/.gitignore rename to laborator/content/interactiune-c-assembly/11-include-fix/.gitignore diff --git a/laborator/content/interactiune-c-assembly/08-include-fix/Makefile b/laborator/content/interactiune-c-assembly/11-include-fix/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/08-include-fix/Makefile rename to laborator/content/interactiune-c-assembly/11-include-fix/Makefile diff --git a/laborator/content/interactiune-c-assembly/08-include-fix/hello.c b/laborator/content/interactiune-c-assembly/11-include-fix/hello.c similarity index 100% rename from laborator/content/interactiune-c-assembly/08-include-fix/hello.c rename to laborator/content/interactiune-c-assembly/11-include-fix/hello.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/a-func/.gitignore b/laborator/content/interactiune-c-assembly/12-export-fix/a-func/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/a-func/.gitignore rename to laborator/content/interactiune-c-assembly/12-export-fix/a-func/.gitignore diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/a-func/Makefile b/laborator/content/interactiune-c-assembly/12-export-fix/a-func/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/a-func/Makefile rename to laborator/content/interactiune-c-assembly/12-export-fix/a-func/Makefile diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/a-func/hidden.c b/laborator/content/interactiune-c-assembly/12-export-fix/a-func/hidden.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/a-func/hidden.c rename to laborator/content/interactiune-c-assembly/12-export-fix/a-func/hidden.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/a-func/main.c b/laborator/content/interactiune-c-assembly/12-export-fix/a-func/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/a-func/main.c rename to laborator/content/interactiune-c-assembly/12-export-fix/a-func/main.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/a-func/ops.h b/laborator/content/interactiune-c-assembly/12-export-fix/a-func/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/a-func/ops.h rename to laborator/content/interactiune-c-assembly/12-export-fix/a-func/ops.h diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/a-func/plain.c b/laborator/content/interactiune-c-assembly/12-export-fix/a-func/plain.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/a-func/plain.c rename to laborator/content/interactiune-c-assembly/12-export-fix/a-func/plain.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/b-var/.gitignore b/laborator/content/interactiune-c-assembly/12-export-fix/b-var/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/b-var/.gitignore rename to laborator/content/interactiune-c-assembly/12-export-fix/b-var/.gitignore diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/b-var/Makefile b/laborator/content/interactiune-c-assembly/12-export-fix/b-var/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/b-var/Makefile rename to laborator/content/interactiune-c-assembly/12-export-fix/b-var/Makefile diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/b-var/hidden.c b/laborator/content/interactiune-c-assembly/12-export-fix/b-var/hidden.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/b-var/hidden.c rename to laborator/content/interactiune-c-assembly/12-export-fix/b-var/hidden.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/b-var/main.c b/laborator/content/interactiune-c-assembly/12-export-fix/b-var/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/b-var/main.c rename to laborator/content/interactiune-c-assembly/12-export-fix/b-var/main.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/b-var/ops.h b/laborator/content/interactiune-c-assembly/12-export-fix/b-var/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/b-var/ops.h rename to laborator/content/interactiune-c-assembly/12-export-fix/b-var/ops.h diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/b-var/plain.c b/laborator/content/interactiune-c-assembly/12-export-fix/b-var/plain.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/b-var/plain.c rename to laborator/content/interactiune-c-assembly/12-export-fix/b-var/plain.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/.gitignore b/laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/.gitignore rename to laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/.gitignore diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/Makefile b/laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/Makefile rename to laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/Makefile diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/hidden.c b/laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/hidden.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/hidden.c rename to laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/hidden.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/main.c b/laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/main.c rename to laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/main.c diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/ops.h b/laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/ops.h rename to laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/ops.h diff --git a/laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/plain.c b/laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/plain.c similarity index 100% rename from laborator/content/interactiune-c-assembly/09-export-fix/c-var-2/plain.c rename to laborator/content/interactiune-c-assembly/12-export-fix/c-var-2/plain.c diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/.gitignore b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/.gitignore rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/.gitignore diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/Makefile b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/Makefile rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/Makefile diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/add.cpp b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/add.cpp similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/add.cpp rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/add.cpp diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/main.c b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/main.c rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/main.c diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/ops.h b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/ops.h rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/ops.h diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/sub.cpp b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/sub.cpp similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/c-calls-cpp/sub.cpp rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/c-calls-cpp/sub.cpp diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/.gitignore b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/.gitignore rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/.gitignore diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/Makefile b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/Makefile rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/Makefile diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/add.c b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/add.c similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/add.c rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/add.c diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/main.cpp b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/main.cpp similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/main.cpp rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/main.cpp diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/ops.h b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/ops.h rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/ops.h diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/sub.c b/laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/sub.c similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/correct/cpp-calls-c/sub.c rename to laborator/content/interactiune-c-assembly/13-cpp-obs/correct/cpp-calls-c/sub.c diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/.gitignore b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/.gitignore rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/.gitignore diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/Makefile b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/Makefile rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/Makefile diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/add.cpp b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/add.cpp similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/add.cpp rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/add.cpp diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/main.c b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/main.c rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/main.c diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/ops.h b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/ops.h rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/ops.h diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/sub.cpp b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/sub.cpp similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/c-calls-cpp/sub.cpp rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/c-calls-cpp/sub.cpp diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/.gitignore b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/.gitignore rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/.gitignore diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/Makefile b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/Makefile rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/Makefile diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/add.c b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/add.c similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/add.c rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/add.c diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/main.cpp b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/main.cpp similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/main.cpp rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/main.cpp diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/ops.h b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/ops.h rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/ops.h diff --git a/laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/sub.c b/laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/sub.c similarity index 100% rename from laborator/content/interactiune-c-assembly/10-cpp-obs/errors/cpp-calls-c/sub.c rename to laborator/content/interactiune-c-assembly/13-cpp-obs/errors/cpp-calls-c/sub.c diff --git a/laborator/content/interactiune-c-assembly/11-max-c-calls-x64/Makefile b/laborator/content/interactiune-c-assembly/14-max-c-calls-x64/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/11-max-c-calls-x64/Makefile rename to laborator/content/interactiune-c-assembly/14-max-c-calls-x64/Makefile diff --git a/laborator/content/interactiune-c-assembly/11-max-c-calls-x64/main.c b/laborator/content/interactiune-c-assembly/14-max-c-calls-x64/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/11-max-c-calls-x64/main.c rename to laborator/content/interactiune-c-assembly/14-max-c-calls-x64/main.c diff --git a/laborator/content/interactiune-c-assembly/11-max-c-calls-x64/max.asm b/laborator/content/interactiune-c-assembly/14-max-c-calls-x64/max.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/11-max-c-calls-x64/max.asm rename to laborator/content/interactiune-c-assembly/14-max-c-calls-x64/max.asm diff --git a/laborator/content/interactiune-c-assembly/12-max-assembly-calls/.gitignore b/laborator/content/interactiune-c-assembly/15-max-assembly-calls/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/12-max-assembly-calls/.gitignore rename to laborator/content/interactiune-c-assembly/15-max-assembly-calls/.gitignore diff --git a/laborator/content/interactiune-c-assembly/12-max-assembly-calls/Makefile b/laborator/content/interactiune-c-assembly/15-max-assembly-calls/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/12-max-assembly-calls/Makefile rename to laborator/content/interactiune-c-assembly/15-max-assembly-calls/Makefile diff --git a/laborator/content/interactiune-c-assembly/12-max-assembly-calls/main.asm b/laborator/content/interactiune-c-assembly/15-max-assembly-calls/main.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/12-max-assembly-calls/main.asm rename to laborator/content/interactiune-c-assembly/15-max-assembly-calls/main.asm diff --git a/laborator/content/interactiune-c-assembly/12-max-assembly-calls/max.c b/laborator/content/interactiune-c-assembly/15-max-assembly-calls/max.c similarity index 100% rename from laborator/content/interactiune-c-assembly/12-max-assembly-calls/max.c rename to laborator/content/interactiune-c-assembly/15-max-assembly-calls/max.c diff --git a/laborator/content/interactiune-c-assembly/README.md b/laborator/content/interactiune-c-assembly/README.md index 7f765fe0..ecd776be 100644 --- a/laborator/content/interactiune-c-assembly/README.md +++ b/laborator/content/interactiune-c-assembly/README.md @@ -12,16 +12,16 @@ Pentru a ne asigura că procedura assembly și modulul C se vor combina cum treb - folosirea directivei EXTERN pentru a declara procedurile și datele globale ca fiind externe. ### Setarea stivei -Atunci când se intră intr-o procedură, este necesar să se seteze un stack frame către care să se trimită parametrii. Desigur, dacă procedura nu primește parametri, acest pas nu este necesar. Așadar, pentru a seta stiva, trebuie inclus următorul cod: +Atunci când se intră intr-o procedură, este necesar să se seteze un stack frame către care să se trimită parametrii. Desigur, dacă procedura nu primește parametri, acest pas nu este necesar. Așadar, pentru a seta stiva, trebuie inclus următorul cod: ```Assembly push ebp mov ebp, esp ``` EBP-ul ne oferă posibilitatea să îl folosim ca un index în cadrul stivei și nu ar trebui alterat pe parcursul procedurii. ### Conservarea registrelor -Este necesar ca procedura să conserve valoarea registrelor ESI, EDI, EBP și a registrelor segment. În cazul în care aceste registre sunt corupte, este posibil ca programul să producă erori la întoarcerea din procedura assembly. +Este necesar ca procedura să conserve valoarea registrelor ESI, EDI, EBP și a registrelor segment. În cazul în care aceste registre sunt corupte, este posibil ca programul să producă erori la întoarcerea din procedura assembly. ### Transmiterea parametrilor din C către procedura assembly -Programele C trimit parametrii către procedurile assembly folosind stiva. Să considerăm următoarea secvență de program C: +Programele C trimit parametrii către procedurile assembly folosind stiva. Să considerăm următoarea secvență de program C: ```C extern int Sum(); ... @@ -31,7 +31,7 @@ x = Sum(a1, a2); ``` Când C-ul execută apelul către Sum, mai întâi face push la argumente pe stivă, în ordine inversă, apoi face efectiv call către procedură. Astfel, la intrarea în corpul procedurii, stiva va fi intactă. -Cum variabilele `a1` și `a2` sunt declarate ca fiind valori `int`, vor folosi fiecare câte un cuvânt pe stivă. Metoda aceasta de pasare a parametrilor se numește pasare prin valoare. Codul procedurii Sum ar putea arăta în felul următor: +Cum variabilele `a1` și `a2` sunt declarate ca fiind valori `int`, vor folosi fiecare câte un cuvânt pe stivă. Metoda aceasta de pasare a parametrilor se numește pasare prin valoare. Codul procedurii Sum ar putea arăta în felul următor: ```Assembly Sum: push ebp ; creează stack frame pointer @@ -44,7 +44,7 @@ Sum: ``` Este interesant de remarcat o serie de lucruri. În primul rând, codul assembly pune în mod implicit valoarea de retur a procedurii în registrul `eax`. În al doilea rând, comanda `ret` este suficientă pentru a ieși din procedură, datorită faptului că compilatorul de C se ocupă de restul lucrurilor, cum ar fi îndepărtarea parametrilor de pe stivă. ## Apelarea de funcții C din proceduri assembly -În majoritatea cazurilor, apelarea de rutine sau funcții din biblioteca standard C dintr-un program în limbaj de asamblare este o operație mult mai complexă decât viceversa. Să luăm exemplul apelării funcției `printf` dintr-un program în limbaj de asamblare: +În majoritatea cazurilor, apelarea de rutine sau funcții din biblioteca standard C dintr-un program în limbaj de asamblare este o operație mult mai complexă decât viceversa. Să luăm exemplul apelării funcției `printf` dintr-un program în limbaj de asamblare: ```Assembly global main @@ -68,44 +68,109 @@ Remarcați faptul că procedura este declarată ca fiind globală și se numeșt Când se face linkarea codului assembly trebuie inclusă și biblioteca standard C (sau biblioteca care conține funcțiile pe care le folosiți). +## Inline assembly +În primul rând, ce este “inline”? + +Termenul `inline` este un cuvânt cheie în limbajul C și este folosit în declararea funcțiilor. În momentul în care compilatorul găsește o funcție declarată ca fiind inline, acesta va înlocui toate apelurile către funcția respectivă cu corpul funcției. Avantajul principal al funcțiilor inline este acela că se pierde overheadul rezultat din apelul unei funcții. Pe de altă parte, dimensiunea binarului va fi mai mare. +> **NOTE:** Nu are sens să declarăm ca fiind inline funcțiile recursive. De ce? +Acum este ușor să ghicim la ce se referă expresia “inline assembly”: un set de instrucțiuni assembly scrise ca funcții inline. Inline assembly este folosit ca o metoda de optimizare și este foarte des întâlnit în system programming. + +În programele C/C++ se pot insera instrucțiuni în limbaje de asamblare folosing cuvântul cheie “asm”. + +Pentru mai multe detalii, consultați [linkul](https://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C) pentru gcc sau [linkul](https://docs.microsoft.com/en-us/cpp/assembler/inline/inline-assembler?redirectedfrom=MSDN&view=msvc-160) pentru cl. + ## Exerciții > **IMPORTANT:** În cadrul laboratoarelor vom folosi repository-ul de git al materiei IOCLA - [https://github.com/systems-cs-pub-ro/iocla](https://github.com/systems-cs-pub-ro/iocla). Repository-ul este clonat pe desktop-ul mașinii virtuale. Pentru a îl actualiza, folosiți comanda `git pull origin master` din interiorul directorului în care se află repository-ul (`~/Desktop/iocla`). Recomandarea este să îl actualizați cât mai frecvent, înainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentă. Dacă doriți să descărcați repository-ul în altă locație, folosiți comanda `git clone https://github.com/systems-cs-pub-ro/iocla ${target}`.Pentru mai multe informații despre folosirea utilitarului `git`, urmați ghidul de la [Git Immersion](https://gitimmersion.com/). -### 1. Tutorial: Calcul maxim în assembly cu apel din C -În subdirectorul `01-2-max-c-calls/` din arhiva de sarcini a laboratorului găsiți o implementare de calcul a maximului unui număr în care funcția `main()` este definită în C de unde se apelează funcția `get_max()` definită în limbaj de asamblare. +### 1. Tutorial: Buclă for în inline assembly +În subdirectorul `01-inline-for/` din arhiva de sarcini a laboratorului aveți o implementare a unei bucle for folosind inline assembly. + +Urmăriți codul și compilați-l și rulați-l într-un terminal. Pentru a-l compila rulați comanda +```bash +make +``` +În urma rulării comenzii rezultă executabilul `inline_for` pe care îl putem executa folosind comanda +```bash +./inline_for +``` +Urmăriți în cod partea de inline assembly din blockul ce începe cu `asm`. Înțelegeți modul în care funcționează inline assembly înainte de a trece la exercițiul următor. +> **TIP:** +> Structura generală a unei directive de inline assembly este următoarea: +> ```C +> __asm__ ( AssemblerTemplate +> : OutputOperands +> [ : InputOperands +> [ : Clobbers ]] +> ) +> ``` +> `AssemblerTemplate` este un string care constituie instrucțiunile in limbaj de asamblare executate de programul vostru. `gcc` nu va ține cont de spațiile albe din acest string, din cauza aceasta trebuie sa marcați fiecare instrucțiune cu `\n` (opțional `\t` pentru indentare). +> +> `OutputOperands` și `InputOperands` reprezintă variabilele de ieșire, respectiv intrare ale rutinei voastre. Convențional, variabilele de ieșire sunt transferate prin referință, iar cele de intrare prin valoare. Pentru variabilele de ieșire, folosiți declarații de forma `"=r" ()`, iar pentru variabile de intrare, `"r" ()`. +> +> Prin `Clobbers` menționați registrele pe care îi folosiți în rutina voastră de asamblare, și în felul acesta instruiți compilatorul să nu se atingă de ei. Altfel, sunt șanse să îi folosească în alte scopuri. +> +> În instrucțiuni, trebuie să înlocuiți aparițiile variabilelor din program (e.g. `sum`), cu registrul aferent (e.g. `%0`). Registrele de tip general (`"r"`) sunt numerotați crescător începând cu 0, în ordinea declarațiilor. Există și posibilitatea de a mapa explicit o variabilă la un anumit registru (e.g. `"=a" (var)` va mapa variabila `var` la registrul `eax`), însă, pentru simplitate, în laborator folosim doar mapări la registrele generale. +> +> Pentru debugging, puteți inspecta fișierul de assembly generat de `gcc` - acesta se generază executând comanda: +> ```bash +> make asm +> ``` + +### 2. Rotație în inline assembly +În limbajul C avem suport pentru operații de shiftare pe biți dar nu avem suport pentru operații de rotație pe biți. Acest lucru în ciuda prezenței operațiilor de rotație pe biți la nivelul procesorului. +În subdirectorul `02-inline-rotate/` găsiți un schelet de cod pe care să îl folosiți pentru a implementa, folosind mnemonicile `rol` și respectiv `ror`, rotații pe biți. O descriere scurtă a acestor instrucțiuni găsiți [aici](https://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate#Rotate_Instructions). +Pentru compilare folosiți comanda `make`. +> **TIP:** +> La o implementare corectă a rotației cu 8 biți la stânga și dreapta, în urma rulării executabilului `./inline_rotate`, veți obține un rezultat de forma: +> ```bash +> ./inline_rotate +> init: 0x12345678, rot_left: 0x34567812, rot_right: 0x78123456 +> ``` + +### 3. RTDSCP în inline assembly +La nivelul procesoarelor moderne există o instrucțiune simplă, accesibilă doar din limbaj de asamblare, care oferă informații despre registrul TSC (Time Stamp Counter) numită `rtdscp`. +În subdirectorul `03-inline-rtdscp/` găsiți un schelet de cod pe care să îl folosiți pentru obținerea valorii registrului TSC folosind instrucțiunea `rtdscp`. Completați scheletul și faceți programul să afișeze informațiile dorite. +Pentru compilare folosiți comanda `make`. +> **TIP:** +> Pentru informații despre instrucțiunea `rtdscp` consultați și aceste link-uri: +> - https://www.felixcloutier.com/x86/rdtscp +> - https://en.wikipedia.org/wiki/Time_Stamp_Counter + +### 4. Tutorial: Calcul maxim în assembly cu apel din C +În subdirectorul `04-5-max-c-calls/` din arhiva de sarcini a laboratorului găsiți o implementare de calcul a maximului unui număr în care funcția `main()` este definită în C de unde se apelează funcția `get_max()` definită în limbaj de asamblare. Urmăriți codul din cele două fișiere și modul în care se transmit argumentele funcției și valoarea de retur. -Compilați și rulați programul. Pentru a-l compila rulați comanda: +Compilați și rulați programul. Pentru a-l compila rulați comanda: ```bash make ``` -În urma rulării comenzii rezultă executabilul mainmax pe care îl putem executa folosind comanda: +În urma rulării comenzii rezultă executabilul mainmax pe care îl putem executa folosind comanda: ```bash ./mainmax ``` > **IMPORTANT:** -> Acordați atenție înțelegerii codului înainte de a trece la exercițiul următor. +> Acordați atenție înțelegerii codului înainte de a trece la exercițiul următor. > **IMPORTANT:** > Valoarea de retur a unei funcții este plasată în registrul `eax`. -### 2. Extindere calcul maxim în assembly cu apel din C +### 5. Extindere calcul maxim în assembly cu apel din C Extindeți programul de la exercițiul anterior (în limbaj de asamblare și C) astfel încât funcția `get_max()` să aibă acum semnătura `unsigned int get_max(unsigned int *arr, unsigned int len, unsigned int *pos)`. Al treilea argument al funcției este adresa în care se va reține poziția din vector pe care se găsește maximul. -La afișare se va afișa și poziția din vector pe care se găsește maximul. +La afișare se va afișa și poziția din vector pe care se găsește maximul. > **TIP:** -> Pentru reținerea poziției, cel mai bine este definiți o variabilă locală `pos` în funcția `main` din fișierul C (`main.c`) în forma +> Pentru reținerea poziției, cel mai bine este definiți o variabilă locală `pos` în funcția `main` din fișierul C (`main.c`) în forma > ```C > unsigned int pos; > ``` -> iar apelul funcției `get_max` îl veți face în forma: +> iar apelul funcției `get_max` îl veți face în forma: > ```C > max = get_max(arr, 10, &pos); > ``` -### 3. Depanare stack frame corupt -În subdirectorul `03-stack-frame/` din arhiva de sarcini a laboratorului găsiți un program C care implementează afișarea stringului `Hello world!` printr-un apel al funcției `print_hello()` definită în assembly pentru prima parte a mesajului, urmat de două apeluri ale funcției `printf()` direct din codul C. +### 6. Depanare stack frame corupt +În subdirectorul `06-stack-frame/` din arhiva de sarcini a laboratorului găsiți un program C care implementează afișarea stringului `Hello world!` printr-un apel al funcției `print_hello()` definită în assembly pentru prima parte a mesajului, urmat de două apeluri ale funcției `printf()` direct din codul C. Compilați și rulați programul. Ce observați? Mesajul printat nu este cel așteptat deoarece din codul assembly lipsește o instrucțiune. @@ -116,16 +181,16 @@ Găsiți instrucțiunea lipsă și rerulați executabilul. > **TIP:** > Pentru a putea restaura stiva la starea sa de la începutul funcției curente, instrucțiunea `leave` se bazează pe faptul că frame pointerul funcției a fost setat. -### 4. Tutorial: Calcul maxim în C cu apel din assembly -În subdirectorul `04-5-max-assembly-calls/` din arhiva de sarcini a laboratorului găsiți o implementare de calcul a maximului unui număr în care funcția `main()` este definită în limbaj de asamblare de unde se apelează funcția `get_max()` definită în C. +### 7. Tutorial: Calcul maxim în C cu apel din assembly +În subdirectorul `07-8-max-assembly-calls/` din arhiva de sarcini a laboratorului găsiți o implementare de calcul a maximului unui număr în care funcția `main()` este definită în limbaj de asamblare de unde se apelează funcția `get_max()` definită în C. Urmăriți codul din cele două fișiere și modul în care se transmit argumentele funcției și valoarea de retur. -Compilați și rulați programul. +Compilați și rulați programul. > **IMPORTANT:** -> Acordați atenție înțelegerii codului înainte de a trece la exercițiul următor. +> Acordați atenție înțelegerii codului înainte de a trece la exercițiul următor. -### 5. Extindere calcul maxim în C cu apel din assembly +### 8. Extindere calcul maxim în C cu apel din assembly Extindeți programul de la exercițiul anterior (în limbaj de asamblare și C) astfel încât funcția `get_max()` să aibă acum semnătura `unsigned int get_max(unsigned int *arr, unsigned int len, unsigned int *pos)`. Al treilea argument al funcției este adresa în care se va reține poziția din vector pe care se găsește maximul. La afișare se va afișa și poziția din vector pe care se găsește maximul. @@ -135,26 +200,26 @@ La afișare se va afișa și poziția din vector pe care se găsește maximul. > pos: dd 0 > ``` > Această variabilă o veți transmite (prin adresă) către apelul `get_max` și prin valoare pentru apelul `printf` pentru afișare. -> +> > Pentru afișare modificați șirul `print_format` și apelul `printf` în fișierul assembly (`main.asm`) ca să permită afișare a două valori: maximul și poziția. -### 6. Tutorial: Conservare registre -În subdirectorul `06-7-regs-preserve/` din arhiva de sarcini a laboratorului găsiți funcția `print_reverse_array()` implementată printr-un simplu loop ce face apeluri repetate ale funcției `printf()`. +### 9. Tutorial: Conservare registre +În subdirectorul `09-10-regs-preserve/` din arhiva de sarcini a laboratorului găsiți funcția `print_reverse_array()` implementată printr-un simplu loop ce face apeluri repetate ale funcției `printf()`. Urmăriți codul din fișierul `main.asm`, compilați și rulați programul. Ce s-a întâmplat? Programul rulează la infinit. Acest lucru se întămplă deoarece funcția `printf()` nu conservă valoarea din registrul `ECX`, folosit aici ca și contor. Decomentați liniile marcate cu `TODO1` și rerulați programul. -### 7. Depanare SEGFAULT +### 10. Depanare SEGFAULT Decomentați liniile marcate cu `TODO2` în fișierul assembly de la exercițiul anterior. Secvența de cod realizează un apel al funcției `double_array()`, implementată în C, chiar înainte de afișarea vectorului folosind funcția văzută anterior. Compilați și rulați programul. Pentru depanarea segfault-ului puteți folosi utilitarul `objdump` pentru a urmări codul în limbaj de asamblare corespunzător funcției `double_array()`. Observați care din registrele folosite înainte și după apel sunt modificate de această funcție. Adăugați în fișierul assembly instrucțiunile pentru conservarea și restaurarea registrelor necesare. -### 8. Warning (nu eroare) +### 11. Warning (nu eroare) -Accesați directorul `08-include-fix/`. +Accesați directorul `11-include-fix/`. Rulați comanda `make`. Veți primi un warning. Este de la compilare sau de la linkare? @@ -162,15 +227,15 @@ Rezolvați acest warning prin editarea fișierului `hello.c`. Rezolvați warningul fără folosirea directivei `#include`. -### 9. Reparare probleme de export +### 12. Reparare probleme de export -Accesați directorul `09-export-fix/`. +Accesați directorul `12-export-fix/`. Fiecare subdirector (`a-func/`, `b-var/`, `c-var-2/`) conține o problemă legată de exportarea unor simboluri (funcții sau variabile). În fiecare subdirector, rulați comanda `make`, identificați problema și editați fișierele necesare pentru rezolvarea problemei. -### 10. Tutorial: Linkare C și C++ +### 13. Tutorial: Linkare C și C++ -Accesăm directorul `10-cpp-obs/`. +Accesăm directorul `13-cpp-obs/`. Vrem să urmărim cum se realizează linkarea din surse mixte: C și C++. În subdirectorul `errors/` avem două directoare `c-calls-cpp/` și `cpp-calls-c/` în care se combinăm surse mixte C și C++. @@ -194,18 +259,18 @@ Pentru a rezolva acest lucru, trebuie ca simbolurile definite C și importate î Acest lucru este realizat în subdirectorul `correct/`. In acest subdirector sunt reparate erorile din subdirrectorul `errors/`. Comparati fisierele `ops.h` din ambele subdirectoare. Detalii despre directiva `extern "C"` găsiți [aici](https://stackoverflow.com/a/1041880/4804196). -### 11. Bonus: Calcul maxim în assembly cu apel din C pe 64 de biți -Intrați în subdirectorul `11-max-c-calls-x64/` și faceți implementarea calculului maximului în limbaj de asamblare pe un sistem pe 64 de biți. Porniți de la programul de la exercițiile 4 și 5 în așa fel încât să îl rulați folosind un sistem pe 64 de biți. +### 14. Bonus: Calcul maxim în assembly cu apel din C pe 64 de biți +Intrați în subdirectorul `14-max-c-calls-x64/` și faceți implementarea calculului maximului în limbaj de asamblare pe un sistem pe 64 de biți. Porniți de la programul de la exercițiile 4 și 5 în așa fel încât să îl rulați folosind un sistem pe 64 de biți. > **TIP:** -> https://en.wikipedia.org/wiki/X86_calling_conventions. -> -> Primul lucru pe care trebuie să-l aveți în vedere este că pe arhitectura x64 registrele au o dimensiune de 8 octeți și au nume diferite decât cele pe 32 de biți (pe lângă extinderea celor tradiționale: `eax` devine `rax`, `ebx` devine `rbx`, etc., mai există altele noi: R10-R15: pentru mai multe informații vedeți [aici](https://stackoverflow.com/questions/20637569/assembly-registers-in-64-bit-architecture)). -> +> https://en.wikipedia.org/wiki/X86_calling_conventions. +> +> Primul lucru pe care trebuie să-l aveți în vedere este că pe arhitectura x64 registrele au o dimensiune de 8 octeți și au nume diferite decât cele pe 32 de biți (pe lângă extinderea celor tradiționale: `eax` devine `rax`, `ebx` devine `rbx`, etc., mai există altele noi: R10-R15: pentru mai multe informații vedeți [aici](https://stackoverflow.com/questions/20637569/assembly-registers-in-64-bit-architecture)). +> > De asemenea, pe arhitectura x64 parametrii nu se mai trimit pe stivă, ci se pun în registre. Primii 3 parametri se pun în: `RDI`, `RSI` și `RDX`. Aceasta nu este o convenţie adoptată uniform. Această convenţie este valabilă doar pe Linux, pe Windows având alte registre care sunt folosite pentru a transmite parametrii unei funcţii. -> -> Convenția de apel necesită ca, pentru funcțiile cu număr variabil de argumente, `RAX` să fie setat la numărul de registre vector folosiți pentru a pasa argumentele. `printf` este o funcție cu număr variabil de argumente, și dacă nu folosiți alte registre decât cele menționate în paragraful anterior pentru trimiterea argumentelor, trebuie să setați `RAX = 0` înainte de apel. Citiți mai multe [aici](https://stackoverflow.com/questions/38335212/calling-printf-in-x86-64-using-gnu-assembler). +> +> Convenția de apel necesită ca, pentru funcțiile cu număr variabil de argumente, `RAX` să fie setat la numărul de registre vector folosiți pentru a pasa argumentele. `printf` este o funcție cu număr variabil de argumente, și dacă nu folosiți alte registre decât cele menționate în paragraful anterior pentru trimiterea argumentelor, trebuie să setați `RAX = 0` înainte de apel. Citiți mai multe [aici](https://stackoverflow.com/questions/38335212/calling-printf-in-x86-64-using-gnu-assembler). -### 12. Bonus: Calcul maxim în C cu apel din assembly pe 64 de biți -Intrați în subdirectorul `12-max-assembly-calls` și faceți implementarea calculului maximului în C cu apel din limbaj de asamblare pe un sistem pe 64 de biți. Porniți de la programul de la exercițiile 6 și 7 în așa fel încât să îl rulați folosind un sistem pe 64 de biți. Urmați indicațiile de la exercițiul anterior și aveți grijă la ordinea parametrilor. +### 15. Bonus: Calcul maxim în C cu apel din assembly pe 64 de biți +Intrați în subdirectorul `15-max-assembly-calls` și faceți implementarea calculului maximului în C cu apel din limbaj de asamblare pe un sistem pe 64 de biți. Porniți de la programul de la exercițiile 6 și 7 în așa fel încât să îl rulați folosind un sistem pe 64 de biți. Urmați indicațiile de la exercițiul anterior și aveți grijă la ordinea parametrilor. diff --git a/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/.gitignore b/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/.gitignore new file mode 100644 index 00000000..1398922c --- /dev/null +++ b/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/.gitignore @@ -0,0 +1 @@ +/inline_rotate.asm diff --git a/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/Makefile b/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/Makefile new file mode 100644 index 00000000..900babf1 --- /dev/null +++ b/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/Makefile @@ -0,0 +1,3 @@ +PROGNAME := inline_rotate +include ../../../utils/Makefile.generic + diff --git a/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/inline_rotate.c b/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/inline_rotate.c new file mode 100644 index 00000000..16ba1cf8 --- /dev/null +++ b/laborator/content/interactiune-c-assembly/solution/02-inline-rotate/inline_rotate.c @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: BSD-3-Clause + +#include + +#define NUM 0x12345678 + +int main(void) +{ + size_t n = NUM; + size_t rot_left = 0; + size_t rot_right = 0; + + __asm__ ( + /* Use rol instruction to shift n by 8 bits left. + * Place result in rot_left variable. + */ + "mov eax, %1\n\t" + "rol %1, 8\n\t" + "mov %0, eax\n\t" + : "=r" (rot_left) + : "r" (n) + : "eax" + ); + + __asm__ ( + /* Use ror instruction to shift n by 8 bits right. + * Place result in rot_right variable. + */ + "mov eax, %1\n\t" + "ror eax, 8\n\t" + "mov %0, eax\n\t" + : "=r" (rot_right) + : "r" (n) + : "eax", "ecx" + ); + + + /* NOTE: Output variables are passed by address, input variables + * are passed by value. + */ + printf("init: 0x%08x, rot_left: 0x%08x, rot_right: 0x%08x\n", + n, rot_left, rot_right); + + return 0; +} diff --git a/laborator/content/interactiune-c-assembly/solution/01-2-max-c-calls/.gitignore b/laborator/content/interactiune-c-assembly/solution/04-5-max-c-calls/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/01-2-max-c-calls/.gitignore rename to laborator/content/interactiune-c-assembly/solution/04-5-max-c-calls/.gitignore diff --git a/laborator/content/interactiune-c-assembly/solution/01-2-max-c-calls/Makefile b/laborator/content/interactiune-c-assembly/solution/04-5-max-c-calls/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/01-2-max-c-calls/Makefile rename to laborator/content/interactiune-c-assembly/solution/04-5-max-c-calls/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/01-2-max-c-calls/main.c b/laborator/content/interactiune-c-assembly/solution/04-5-max-c-calls/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/01-2-max-c-calls/main.c rename to laborator/content/interactiune-c-assembly/solution/04-5-max-c-calls/main.c diff --git a/laborator/content/interactiune-c-assembly/solution/01-2-max-c-calls/max.asm b/laborator/content/interactiune-c-assembly/solution/04-5-max-c-calls/max.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/01-2-max-c-calls/max.asm rename to laborator/content/interactiune-c-assembly/solution/04-5-max-c-calls/max.asm diff --git a/laborator/content/interactiune-c-assembly/solution/03-stack-frame/Makefile b/laborator/content/interactiune-c-assembly/solution/06-stack-frame/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/03-stack-frame/Makefile rename to laborator/content/interactiune-c-assembly/solution/06-stack-frame/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/03-stack-frame/main.c b/laborator/content/interactiune-c-assembly/solution/06-stack-frame/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/03-stack-frame/main.c rename to laborator/content/interactiune-c-assembly/solution/06-stack-frame/main.c diff --git a/laborator/content/interactiune-c-assembly/solution/03-stack-frame/print-hello.asm b/laborator/content/interactiune-c-assembly/solution/06-stack-frame/print-hello.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/03-stack-frame/print-hello.asm rename to laborator/content/interactiune-c-assembly/solution/06-stack-frame/print-hello.asm diff --git a/laborator/content/interactiune-c-assembly/solution/04-5-max-assembly-calls/.gitignore b/laborator/content/interactiune-c-assembly/solution/07-8-max-assembly-calls/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/04-5-max-assembly-calls/.gitignore rename to laborator/content/interactiune-c-assembly/solution/07-8-max-assembly-calls/.gitignore diff --git a/laborator/content/interactiune-c-assembly/solution/04-5-max-assembly-calls/Makefile b/laborator/content/interactiune-c-assembly/solution/07-8-max-assembly-calls/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/04-5-max-assembly-calls/Makefile rename to laborator/content/interactiune-c-assembly/solution/07-8-max-assembly-calls/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/04-5-max-assembly-calls/main.asm b/laborator/content/interactiune-c-assembly/solution/07-8-max-assembly-calls/main.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/04-5-max-assembly-calls/main.asm rename to laborator/content/interactiune-c-assembly/solution/07-8-max-assembly-calls/main.asm diff --git a/laborator/content/interactiune-c-assembly/solution/04-5-max-assembly-calls/max.c b/laborator/content/interactiune-c-assembly/solution/07-8-max-assembly-calls/max.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/04-5-max-assembly-calls/max.c rename to laborator/content/interactiune-c-assembly/solution/07-8-max-assembly-calls/max.c diff --git a/laborator/content/interactiune-c-assembly/solution/06-7-regs-preserve/Makefile b/laborator/content/interactiune-c-assembly/solution/09-10-regs-preserve/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/06-7-regs-preserve/Makefile rename to laborator/content/interactiune-c-assembly/solution/09-10-regs-preserve/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/06-7-regs-preserve/double_array.c b/laborator/content/interactiune-c-assembly/solution/09-10-regs-preserve/double_array.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/06-7-regs-preserve/double_array.c rename to laborator/content/interactiune-c-assembly/solution/09-10-regs-preserve/double_array.c diff --git a/laborator/content/interactiune-c-assembly/solution/06-7-regs-preserve/main.asm b/laborator/content/interactiune-c-assembly/solution/09-10-regs-preserve/main.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/06-7-regs-preserve/main.asm rename to laborator/content/interactiune-c-assembly/solution/09-10-regs-preserve/main.asm diff --git a/laborator/content/interactiune-c-assembly/solution/08-include-fix/.gitignore b/laborator/content/interactiune-c-assembly/solution/11-include-fix/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/08-include-fix/.gitignore rename to laborator/content/interactiune-c-assembly/solution/11-include-fix/.gitignore diff --git a/laborator/content/interactiune-c-assembly/solution/08-include-fix/Makefile b/laborator/content/interactiune-c-assembly/solution/11-include-fix/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/08-include-fix/Makefile rename to laborator/content/interactiune-c-assembly/solution/11-include-fix/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/08-include-fix/hello.c b/laborator/content/interactiune-c-assembly/solution/11-include-fix/hello.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/08-include-fix/hello.c rename to laborator/content/interactiune-c-assembly/solution/11-include-fix/hello.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/.gitignore b/laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/.gitignore rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/.gitignore diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/Makefile b/laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/Makefile rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/hidden.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/hidden.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/hidden.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/hidden.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/main.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/main.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/main.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/ops.h b/laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/ops.h rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/ops.h diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/plain.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/plain.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/a-func/plain.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/a-func/plain.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/.gitignore b/laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/.gitignore rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/.gitignore diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/Makefile b/laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/Makefile rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/hidden.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/hidden.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/hidden.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/hidden.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/main.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/main.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/main.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/ops.h b/laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/ops.h rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/ops.h diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/plain.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/plain.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/b-var/plain.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/b-var/plain.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/.gitignore b/laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/.gitignore rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/.gitignore diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/Makefile b/laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/Makefile rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/hidden.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/hidden.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/hidden.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/hidden.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/main.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/main.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/main.c diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/ops.h b/laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/ops.h similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/ops.h rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/ops.h diff --git a/laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/plain.c b/laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/plain.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/09-export-fix/c-var-2/plain.c rename to laborator/content/interactiune-c-assembly/solution/12-export-fix/c-var-2/plain.c diff --git a/laborator/content/interactiune-c-assembly/solution/11-max-c-calls-x64/Makefile b/laborator/content/interactiune-c-assembly/solution/14-max-c-calls-x64/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/11-max-c-calls-x64/Makefile rename to laborator/content/interactiune-c-assembly/solution/14-max-c-calls-x64/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/11-max-c-calls-x64/main.c b/laborator/content/interactiune-c-assembly/solution/14-max-c-calls-x64/main.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/11-max-c-calls-x64/main.c rename to laborator/content/interactiune-c-assembly/solution/14-max-c-calls-x64/main.c diff --git a/laborator/content/interactiune-c-assembly/solution/11-max-c-calls-x64/max.asm b/laborator/content/interactiune-c-assembly/solution/14-max-c-calls-x64/max.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/11-max-c-calls-x64/max.asm rename to laborator/content/interactiune-c-assembly/solution/14-max-c-calls-x64/max.asm diff --git a/laborator/content/interactiune-c-assembly/solution/12-max-assembly-calls/.gitignore b/laborator/content/interactiune-c-assembly/solution/15-max-assembly-calls/.gitignore similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/12-max-assembly-calls/.gitignore rename to laborator/content/interactiune-c-assembly/solution/15-max-assembly-calls/.gitignore diff --git a/laborator/content/interactiune-c-assembly/solution/12-max-assembly-calls/Makefile b/laborator/content/interactiune-c-assembly/solution/15-max-assembly-calls/Makefile similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/12-max-assembly-calls/Makefile rename to laborator/content/interactiune-c-assembly/solution/15-max-assembly-calls/Makefile diff --git a/laborator/content/interactiune-c-assembly/solution/12-max-assembly-calls/main.asm b/laborator/content/interactiune-c-assembly/solution/15-max-assembly-calls/main.asm similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/12-max-assembly-calls/main.asm rename to laborator/content/interactiune-c-assembly/solution/15-max-assembly-calls/main.asm diff --git a/laborator/content/interactiune-c-assembly/solution/12-max-assembly-calls/max.c b/laborator/content/interactiune-c-assembly/solution/15-max-assembly-calls/max.c similarity index 100% rename from laborator/content/interactiune-c-assembly/solution/12-max-assembly-calls/max.c rename to laborator/content/interactiune-c-assembly/solution/15-max-assembly-calls/max.c