Fibonači – C – Asembler

/ Ključ razumevanja dizajna prirode /

.

Ideja je predstavljanje Finonačijevog niza (Fibonacci sequence) u okviru kraćeg programa pisanog u jeziku C, s tim što uporedo dajem i dalje tumačenje instrukcija datih u C koje se zatim prevode u Asembler (Assembler). Asembler predstavlja poseban program koji napisani kod prevodi u mašinski jezik (Machine language, iliti binarni kod) jezik tzv. najnižeg tipa, odnosno sekvencu razumljivu računarskom procesoru koji tek tada započinje s izvršavanjem instrukcija. Jer tek na nivou nula i jedinica (A = 01100001) dolazimo do sâme srži moderne računarske tehnologije, utemeljene na binarnom principu.

Dakle, s leve strane je kod u C-u, dok je s desne strane taj isti kod preveden u Asembler, koji potom sve spušta na nivo nula i jedinica Mašinskog jezika.

Program pisan u jeziku C:

.

#include <stdio.h>

int main(void) {

int x, y, z;

while (1) {

x = 0;

y = 1;

do {

printf(“%d\n“, x)

z = x + y;

x = y;

y = z;

} while (x < 255);

}

}

Prevod iz C-a u Asembler:

.

% otool  -tv  fib
fib:
(__TEXT,__text) sestion
_main:
0000000100000f20      pushq      %rbp
0000000100000f21      movq       %rsp,    %rbp
0000000100000f24      subq        $0x20,   %rsp
0000000100000f28      movl        $0x0,     -0x4(%rbp)
0000000100000f2f       movl        $0x0,     -0x8(%rbp)
0000000100000f36      movl        $0x1,     -0xc(%rbp)
0000000100000f3d      leaq         0x56(%rip),     %rdi
0000000100000f44      movl        -0x8(%rbp),    %esi
0000000100000f47      movb       $0x0,  %al
0000000100000f49      callq        0x100000f78
0000000100000f4e      movl        -0x8(%rbp),  %esi
0000000100000f51      addl         -0xc(%rbp),  %esi
0000000100000f54      movl        %esi,   -0x10(%rbp)
0000000100000f57      movl        -0xc(%rbp),  %esi
0000000100000f5a      movl        %esi,   -0x8(%rbp)
0000000100000f5d      movl        -0x10(%rbp),  %esi
0000000100000f60      movl        %esi,   -0xc(%rbp)
0000000100000f63      movl        %eax,  -0x14(%rbp)
0000000100000f66      cmpl        $0xff,  -0x8(%rbp)
0000000100000f6d      jl             0x100000f3d
0000000100000f73      jmp         0x100000f2f

.

Logikom:

X     Y     Z

0      1       1

1       1       2

1      2      3

2      3      5

.

Rezultat je sledeći:

%  ./fib

0

1

1

2

3

5

8

13

21

34

55

89

144

233

.

• parametru 0x8 dodeljuje se promenljiva X

• parametru 0xc dodeljuje se promenljiva Y

• parametru 0x10 dodeljuje se promenljiva Z

• linijom 0000000100000f2f  movl  $0x0,  -0x8(%rbp) promenljivoj se dodeljuje vrednost X = 0

• linijom 0000000100000f36  movl  $0x1,  -0xc(%rbp) promenljivoj se dodeljuje vrednost Y = 1

• ovim četiri linijama koda izdaje se naredba printf X

0000000100000f3d  leaq  0x56(%rip),  %rdi
0000000100000f44  movl  -0x8(%rbp),  %esi
0000000100000f47  movb  $0x0,  %al
0000000100000f49  callq  0x100000f78

.

• linijom 0000000100000f4e  movl  -0x8(%rbp),  %esi promenljiva preuzima poziciju X –> esi

• linijom 0000000100000f51  addl  -0xc(%rbp),  %esi preuzima poziciju Y – esi, z = x + y

• linijom 0000000100000f54  movl  %esi,  -0x10(%rbp) promenljivoj se dodeljuje vrednost Z

• ovim dvema linijama se vrednost promenljive X izjednačava s YX = Y

0000000100000f57  movl  -0xc(%rbp),  %esi
0000000100000f5a  movl  %esi,  -0x8(%rbp)

.

• ovim dvema linijama se vrednost promenljive Y izjednačava s ZY = Z

0000000100000f5d  movl  -0x10(%rbp),  %esi
0000000100000f60  movl  %esi,  -0xc(%rbp)

Debugging Mode


Pratite diskusiju/Subscribe
Obaveštavaj/Notify

0 Comments / Komentara
Najstarije/Oldest
Najnovije/Newest Izglasano/Most Voted
Inline Feedbacks
View all comments