Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,6 @@ dkms.conf

*.zip
*_out

# Python compiled files
__pycache__
Original file line number Diff line number Diff line change
@@ -1,6 +1,31 @@
# Laborator 4: Crearea și analiza unui executabil (2)
# Laborator 03: Compilare

<!-- Convert to DokuWiki format using Pandoc: pandoc -f markdown_github-hard_line_breaks -t dokuwiki README.md -->
Etapele prin care trece un program scris în `C` din momentul în care este scris până când este rulat ca un proces sunt, in ordine:

- preprocesare
- compilare
- asamblare
- link editare

În imaginea de mai jos sunt reprezentate si detaliate aceste etape:

![phases-full.png](https://ocw.cs.pub.ro/courses/_media/iocla/laboratoare/phases-full.png?cache=)

## Preprocesare

În cadrul primei etape, cea de `preprocesare` au loc următoarele acțiuni plecând de la fișierul cod sursă:
* eliminarea comentariilor
* expandarea directivelor care încep cu simbolul `#`
* înlocuirea valorilor corespunzătoare pentru `#define ...`
* includerea conținutului fișierelor date ca parametru directivei `#include`

## Compilare

În etapa de `compilare` au loc următoarele subetape:
* analiza lexicală - verificarea limbajului
* analiza sintactică - verificarea ordinii cuvintelor (`;` vine la finalul asignării unei variabile)
* analiza semantică - determinarea sensului codului scris (determinarea contextului variabilelor)
* generarea de cod în limbaj de asamblare care este o formă human-readable a ce ajunge procesorul să execute efectiv

## Assembly / Asamblare

Expand Down Expand Up @@ -223,9 +248,96 @@ Hex dump of section '.rodata':
0x080484e8 6f726c64 2100 orld!.
```

Majoritatea compilatoarelor oferă opțiunea de a genera și un fișier cu programul scris în limbaj de asamblare.

>**NOTE**: În cazul compilatorului `gcc` este de ajuns să adăugați flag-ul `-S` și vă va genera un
fișier `*.s` cu codul aferent. În arhiva de `TODO` aveți un exemplu de trecere a unui program
foarte simplu `hello.c` prin cele patru faze. Îl puteți testa pe un sistem Unix/Linux și pe un sistem Windows cu suport de MinGW.
```shell
$ make
cc -E -o hello.i hello.c
cc -Wall -S -o hello.s hello.i
cc -c -o hello.o hello.s
cc -o hello hello.o

$ ls
Makefile hello hello.c hello.i hello.o hello.s

$ ./hello
Hello, World!

$ tail -10 hello.i


# 5 "hello.c"
int main(void)
{
puts("Hello, World!");

return 0;
}

$ cat hello.s
.file "hello.c"
.section .rodata
.LC0:
.string "Hello, World!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 5.2.1-17) 5.2.1 20150911"
.section .note.GNU-stack,"",@progbits

$ file hello.o
hello.o: ELF 64-bit LSB relocatable, x86-64, [...]

$ file hello
hello: ELF 64-bit LSB executable, x86-64, [...]

$ objdump -d hello.o

hello.o: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: bf 00 00 00 00 mov $0x0,%edi
9: e8 00 00 00 00 callq e <main+0xe>
e: b8 00 00 00 00 mov $0x0,%eax
13: 5d pop %rbp
14: c3 retq
```

Pentru a genera sintaxa intel pe 32 de biți, se pot folosi aceste opțiuni:
```shell
cc -Wall -m32 -S -masm=intel -o hello.s hello.i
```

Dacă programele scrise în limbaje de nivel înalt ajung să fie portate ușor pentru procesoare diferite (arm, powerpc, x86, etc.), cele scrise în limbaj de asamblare sunt implementări specifice unei anumite arhitecturi. Limbaje de nivel înalt reprezintă o formă mai abstractă de rezolvare a unei probleme, din punctul de vedere al unui procesor, motiv pentru care și acestea trebuie traduse în limbaj de asamblare în cele din urmă, pentru a se putea ajunge la un binar care poate fi rulat. Mai multe detalii în laboratoarele următoare.

## Exerciții

> **NOTE:** În cadrul laboratoarelor vom folosi repository-ul de Git de IOCLA: https://github.com/systems-cs-pub-ro/iocla.
> **WARNING:** În cadrul laboratoarelor vom folosi repository-ul de Git de IOCLA: https://github.com/systems-cs-pub-ro/iocla.
> Repository-ul este clonat pe desktopul 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ă.
Expand Down Expand Up @@ -369,4 +481,4 @@ Rezultatul funcției scrisă în python va fi preluat în codul C și se va afi
> Puteți să urmăriți și exemplele de [aici](https://www.codeproject.com/Articles/820116/Embedding-Python-program-in-a-C-Cplusplus-code) și/sau [aici](https://www.xmodulo.com/embed-python-code-in-c.html) pentru a vedea cum să preluați rezultatul funcției scrisă în python. De asemenea puteți consulta documentația de [aici](https://docs.python.org/3/c-api/long.html) pentru a vedea cum să faceți conversia rezultatului la un tip de date din C.

> **NOTE:**
> Atenție la versiunea de python pe care o folosiți; nu este recomandată o anumită versiune însă trebuie să aveți în vedere că în funcție de soluția voastră este posibil să fie nevoie să folosiți versiune specifică. Makefile-ul folosește versiunea **3.9**.
> Atenție la versiunea de python pe care o folosiți; nu este recomandată o anumită versiune însă trebuie să aveți în vedere că în funcție de soluția voastră este posibil să fie nevoie să folosiți versiune specifică. Makefile-ul folosește versiunea **3.9**.
Binary file removed laborator/content/linking/06-obj-link-dev/shop.o
Binary file not shown.
Binary file not shown.
28 changes: 20 additions & 8 deletions laborator/content/reprezentare-numere/2-len_xor/len_xor.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,33 @@

int my_strlen(const char *str)
{
/* TODO */
(void) str;

return -1;
int contor=0;
while ( *(str+contor) ){
contor++;
}
return contor;

}

void equality_check(const char *str)
void equality_check(const char *str,int lenght)
{
/* TODO */
(void) str;
int contor=0;
while(contor < lenght){
if(!(*(str+contor)^*(str+contor+ (1<<contor)))){
printf(" adresa 1 : %p ", str+contor);
printf(" adresa 2 : %p \n", str+contor + (1<<contor));
}
contor++;
}
}

int main(void)
{
/* TODO: Test functions */
char str[156];
scanf("%s", str);
int lenght = my_strlen(str);
printf("%d \n", lenght);
equality_check(str,lenght);

return 0;
}
Expand Down
24 changes: 20 additions & 4 deletions laborator/content/reprezentare-numere/3-mirror/mirror.c
Original file line number Diff line number Diff line change
@@ -1,17 +1,33 @@

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void mirror(char *s)
void mirror( char * s)
{
/* TODO */

int lenght = 0;
while( *(s + lenght) ){
lenght++;
}
// printf("%d", lenght);

for(int i = 0 ; i < (lenght>>1); i++){
char aux = *(s + i);
// printf("prima data e : %c",*(s + i) );
*(s + i) = *(s + lenght - i -1);
// printf(" se schimba in : %c ", *(s + i) );
*(s + lenght - i -1) = aux;
}
(void) s;
}

int main()
{
/* TODO: Test function */

char s[10];
scanf("%s", s);
mirror(s);
printf("%s",s);
return 0;
}

29 changes: 25 additions & 4 deletions laborator/content/reprezentare-numere/4-rotations/rotations.c
Original file line number Diff line number Diff line change
@@ -1,22 +1,43 @@
#include <stdio.h>

void rotate_left(int *number, int bits)
{
/* TODO */
{

printf("numar: %d \n", *number);
int copie = *number;
*number = *number << bits;
printf("numar: %d \n", *number);
printf(" copie: %d \n", copie);
copie = copie >> (32-bits);
printf(" copie modificata: %d \n", copie);
*number = *number | copie;

(void) number;
(void) bits;
}

void rotate_right(int *number, int bits)
{
/* TODO */
int copie=*number;
*number = *number >> bits;
printf("numar: %d \n", *number);
printf(" copie: %d \n", copie);
copie = copie << (32-bits);
printf(" copie modificata: %d \n", copie);
*number = *number | copie;

(void) number;
(void) bits;
}

int main()
{
/* TODO: Test functions */
int number,bits;
scanf("%d %d", &number , &bits);
rotate_left(&number,bits);
// rotate_right(&number,bits);
printf("%d",number);


return 0;
}
Expand Down
78 changes: 73 additions & 5 deletions laborator/content/reprezentare-numere/5-odd_even/odd_even.c
Original file line number Diff line number Diff line change
@@ -1,23 +1,91 @@
#include <stdio.h>
#include <stdlib.h>

void print_hexa(int number, int nr_bits)
{ int necesari=nr_bits;
printf("0x");
while(((necesari >>2 )<<2) ^ necesari ){
necesari=necesari + 1;
printf("0");
}
// printf("nr biti : %d", nr_bits);
for(int i=nr_bits-1; i >= 0;i--){
if((number>>(4*i) == 15))
printf("F");
else if(number>>4*i == 14)
printf("E");
else if((number>>4*i) == 13)
printf("D");
else if((number>>4*i) == 12)
printf("C");
else if((number>>4*i )== 11)
printf("B");
else if((number>>4*i) == 10)
printf("A");
else if ((number>>4*i)<10)
printf("%d" ,number>>(4*i));

number=number-((number>>(4*i))<<(4*i));
}

printf("\n");
(void) number;
(void) nr_bits;
}

void print_binary(int number, int nr_bits)
{
/* TODO */
{ int necesari=nr_bits;
printf("0b");
while(((necesari >>2 )<<2) ^ necesari ){
necesari=necesari + 1;
printf("0");
}

for(int i=nr_bits -1; i >= 0;i--){
if(number>>i){
printf("1");
number=number-((number>>i)<<i);
}
else
printf("0");
}
printf("\n");
(void) number;
(void) nr_bits;
}

void check_parity(int *numbers, int n)
{
/* TODO */
{ int nr_bits=0;
for(int i = 0;i < n;i++){

if(((*(numbers+i) >>1)<<1) ^ ( *(numbers+i) ) ) { //daca e impar
while(*(numbers+i)>>(4*nr_bits))
nr_bits++;
print_hexa(*(numbers+i),nr_bits);
nr_bits = 0;

}else{

while(*(numbers+i)>>nr_bits)
nr_bits = nr_bits + 4;
print_binary(*(numbers+i), nr_bits);
nr_bits = 0;
}
}

(void) numbers;
(void) n;
}

int main()
{
/* TODO: Test functions */
int n;
scanf("%d", &n);
int v[n];
for(int i = 0;i < n;i++){
scanf("%d", v+i);
}
check_parity(v,n);

return 0;
}
Expand Down
6 changes: 6 additions & 0 deletions laborator/content/reprezentare-numere/ex1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
121-> 1111001
18446-> 10010000010

->50642
->0x8c1f

Loading