Youtube subtitles download by mo.dbxdb.com
Donc, j'ai un programme ici qui imprime les chiffres de Fibonacci, et je veux parcourir
comment nous obtenons ce programme compilé en code machine et exécuté sur l’ordinateur.
Mais tout d’abord, juste pour voir à quoi ressemble la sortie de ceci quand nous l’exécutons
est-ce qu'il imprime des nombres de Fibonacci jusqu'à 255.
Et en réalité, 233 est le plus grand nombre de Fibonacci, inférieur à 255.
Et puis ça recommence juste. Et ça fait ça pour toujours et à jamais.
Et pour rappel,
Les nombres de Fibonacci commencent par 0 et 1, puis le nombre suivant est simplement la somme des deux derniers chiffres.
Donc 0 + 1 est 1, 1 + 1 est 2,
1 + 2 est 3, 2 + 3 est 5, 3 + 5 est 8. Et ainsi de suite jusqu'à la fin.
Et si juste pour parcourir ce programme pour nous assurer que nous comprenons comment cela fonctionne:
nous avons trois variables, x, y et z,
et nous avons cette boucle qui continue pour toujours et à jamais.
Mais à l’intérieur de cela, nous mettons x à 0 et y à 1. Donc x commence par 0,
y commence comme 1,
Et puis nous avons cette boucle ici où nous imprimons la valeur de x. Donc x est 0, alors nous l’imprimons.
Et ensuite, nous calculons z comme étant x + y. Donc 0 + 1 est 1.
Et puis, ce que nous faisons est fondamentalement une sorte de transfert de tous ces chiffres. Donc x devient égal à y,
alors x devient 1.
y est égal à z, alors y devient 1 également,
même si c'était déjà 1
Et ensuite, nous passons à nouveau en boucle. x est inférieur à 255 (c'est seulement 1), alors nous parcourons à nouveau.
Nous imprimons x, x est 1,
et nous calculons à nouveau z. z est x + y, donc 1 + 1 est 2,
Et puis on change un peu les choses: si x est égal à y, donc x est égal à 1,
et alors y est égal à z. z est 2, alors maintenant y devient 2.
Et ensuite, nous parcourons à nouveau, car x est inférieur à 255. Et ici, nous imprimons 1.
Nous calculons z, qui est maintenant 1 + 2 est 3,
Et ensuite, nous devons encore déplacer les choses,
donc les deux décalages ici, les 3 décalés ici, donc x est égal à y, y est égal à z, ...
et ensuite nous parcourons à nouveau. Et ici nous imprimons le 2, nous calculons z comme x plus y, donc 2 + 3 est 5, ...
Et ainsi de suite. Et comme vous pouvez le constater, nous imprimons 0,1,1,2 et ainsi de suite.
Donc 0,1,1,2 ... et ça continue comme ça. C’est ainsi que fonctionne ce programme pour imprimer les nombres de Fibonacci.
Mais que se passe-t-il lorsque nous compilons cela?
Donc, si nous le compilons, en exécutant ...
c'est le compilateur GNU C, et je dis que le fichier de sortie va juste être
un fichier appelé fib. Ce sera l'exécutable qui s'exécutera, puis l'entrée sera fib.c.
(Quel est ce code ici, sur lequel on regarde)
Donc, si nous le compilons, nous pourrons l’exécuter, mais ce que j’ai fait ici est en fait le démonter.
Alors qu'est-ce que cette commande fait,
Ceci est juste sur mon macbook. Je ne sais pas si cela fonctionnera sur d'autres ordinateurs.
Peu importe, mais cela a fonctionné sur mon macbook ... et il affiche les instructions en langage machine
qui ont été compilés. Nous examinons donc la version compilée de ce programme que nous exécuterions.
Et donc je veux parcourir ces instructions, juste pour voir si nous pouvons un peu, comme,
Déterminez laquelle de ces instructions correspond à ce qui se passe dans le programme C original.
Et donc, si nous commençons ici, les deux premières choses ici sont un peu en train de mettre les choses en place.
Tout ici ne fait pas vraiment partie de ce que j'ai écrit ici. C'est juste un peu comme mettre en place le cadre de la pile.
(Je pense que c'est une valeur de retour ou quelque chose comme ça)
Donc, dans lequel nous ne faisons pas vraiment quelque chose avec. Ignorons-les pour l'instant.
Mais voici où nous entrons réellement dans le code que nous avons écrit ici: donc cette première ligne ici,
ce "Move long", déplace cette valeur 0 dans cette chose,
qui est en réalité un décalage d'adresse. Donc,% rbp est le pointeur de la base de la pile,
et ce -8 est en fait juste compensé. Donc, cela fait référence à un emplacement en mémoire,
et donc nous mettons un 0 dans cet emplacement spécifique en mémoire.
Ce qui est exactement ce que nous faisons ici,
nous disons x = 0. et donc ce que nous pouvons voir est que x
est en réalité cet emplacement en mémoire, ce décalage -0x8 par rapport au pointeur de la base de la pile.
Donc ici, je vais écrire que 0x8 est la variable x
Ainsi, lorsque nous le verrons ailleurs dans le programme, nous saurons que c'est x.
Donc, cette ligne dit fondamentalement: x = 0.
Nous définissons donc 0 dans 0x8, qui est l'emplacement de la mémoire où x est.
La ligne suivante est fondamentalement la même chose, sauf que maintenant nous mettons 1 dans cet emplacement 0xc.
Donc, ici, nous disons réellement y = 1. et 0xC
se réfère à la variable y dans le programme ici.
Les quelques lignes suivantes (maintenant nous entrons ici dans cette boucle),
Donc, les quelques lignes suivantes ont à voir avec le "printf",
et donc je vais simplement appeler ces quatre lignes ici, qui ont à voir avec le printf,
et nous imprimons la valeur de x.
Et fondamentalement ce que font ces quatre lignes est, il met en place toutes les choses,
et appelez ensuite ceci, vous savez, "printf". Je suppose que c'est une adresse mémoire
c'est quelque part ailleurs dans le programme, ce n'est pas répertorié ici.
Mais c’est probablement la fonction "printf" fournie par la bibliothèque standard C,
et pour l'appeler, nous devons mettre certaines choses en place.
Je pense que c'est probablement l'adresse de la chaîne "% d \ n",
et bien sûr, 0x8. Nous reconnaissons que, c'est x. Nous imprimons donc x.
Et puis ... je ne suis pas sûr de la nature de cette autre chose, et ensuite "l'appel" appelle réellement printf.
Donc, cette sorte de correspond à cette "printf".
Donc, après l'impression, nous avons ce z = x + y,
et c'est en fait, ces trois lignes ici
sont les z = x + y. Et la façon dont cela fonctionne est, ce que nous faisons est que nous déplaçons 0x8 (qui est x),
Dans ce registre% esi, nous disons donc que x entre dans% esi.
Et puis on dit "ajoute la valeur de c." Alors on dit
"ajoute y à la valeur de% esi."
(Et vous ne pouvez probablement pas lire mon écriture ici, soyez un peu en désordre ...)
Mais fondamentalement, ce que nous disons, c’est que, vous savez, x entre dans le registre% esi,
et ensuite nous ajoutons la valeur de y (car 0xc est l'emplacement de la mémoire de y) au registre% esi.
Et ensuite, prenez la valeur de% esi register et mettez-la dans 0x10.
Et 0x10 est un nouvel emplacement de mémoire que nous n'avons pas encore vu.
Donc 0x10, c’est en fait l’emplacement mémoire de z. Et alors nous avons juste mis cela dans z.
Donc, ces trois lignes font essentiellement le z = x + y, donc nous obtenons x et le mettons dans% esi,
nous y ajoutons y, puis nous remettons la somme dans z.
Donc, en se déplaçant sur les deux lignes suivantes, on fait le x = y.
Et encore une fois, nous utilisons ce registre% esi comme une sorte d’emplacement temporaire.
Et donc nous prenons 0xc (qui est y), le chargeons à nouveau dans% esi, puis nous prenons ce qui est dans% esi
et le mettre dans 0x8. Nous prenons donc c, et nous prenons y, en mettant en% esi
Et puis nous prenons% esi et le plaçons dans x, donc de y à x, ou autrement dit: x = y.
Nous fixons x égal à y.
C'est donc le x = y. Et puis les deux lignes suivantes sont fondamentalement la même chose,
sauf que maintenant, on passe de 0x10 à 0xc, on passe donc de z à y.
Ou le chemin, nous l'écrivons ici est y = z,
Donc y est égal à z.
Cette ligne suivante, je ne sais pas vraiment ce que cette ligne fait. Et donc si ... ouais, parce que c’est le registre% eax
être déplacé dans cet autre emplacement de mémoire que nous n'utilisons pas pour autre chose,
Et nous n'avons pas d'autres variables définies ici ...
Honnêtement, je ne suis pas sûr de ce que cette ligne fait. Donc, si vous le savez, faites-le remarquer dans les commentaires.
Mais après cette ligne nous faisons cette comparaison, donc ceci est la "valeur de comparaison longue", et nous comparons donc
0xff, qui est la représentation hexadécimale de 255,
nous comparons cela à ce qui est dans l'emplacement de mémoire 0x8, qui est x. Nous comparons donc 255 et x.
Et nous disons "sauter si moins que". Donc "jl" est le saut si moins alors,
(basé sur cette comparaison)
et le "saut si inférieur à" nous amène à cette adresse f3d.
Et F3D est ici, la première déclaration qui faisait partie de notre printf. Donc, si x est inférieur à 255,
Nous remontons à la "printf", ce que nous disons ici:
"while (x est inférieur à 255)" nous restons dans cette boucle ... si ce n'est pas moins de 255 alors
Le flux de programme saute juste, descend à la ligne suivante ici,
Ce qui est juste un saut. et ceci est un saut inconditionnel.
Nous irions toujours au f2f. Et f2f est de retour ici, où nous commençons avec le x = 0.
Et bien sûr, vous savez une fois que cette boucle est terminée
nous tombons ici et nous sommes de retour dans cette boucle principale qui dure toujours et à jamais.
Vous pouvez donc voir comment, lorsque nous compilons le programme C,
nous nous retrouvons avec ce code machine.
Et ensuite, je veux prendre le code machine et voir comment nous pouvons utiliser un code machine similaire à celui-ci.
et le charger dans notre ordinateur breadboard construit à la maison. Subtitles End: mo.dbxdb.com