<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>stack frames Archives - NeuralLantern.com</title>
	<atom:link href="https://www.NeuralLantern.com/tag/stack-frames/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.NeuralLantern.com/tag/stack-frames/</link>
	<description></description>
	<lastBuildDate>Sat, 07 Mar 2026 22:50:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.NeuralLantern.com/wp-content/uploads/2025/04/cropped-2025-04-04-Lantern-03-32x32.png</url>
	<title>stack frames Archives - NeuralLantern.com</title>
	<link>https://www.NeuralLantern.com/tag/stack-frames/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>The Call Stack Explained: Call Frames, Return Addresses, Local Variables</title>
		<link>https://www.NeuralLantern.com/the-call-stack-explained-call-frames-return-addresses-local-variables/</link>
					<comments>https://www.NeuralLantern.com/the-call-stack-explained-call-frames-return-addresses-local-variables/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sat, 07 Mar 2026 22:50:18 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[assembly language stack]]></category>
		<category><![CDATA[C++ stack]]></category>
		<category><![CDATA[call frames]]></category>
		<category><![CDATA[call stack]]></category>
		<category><![CDATA[call stack explained]]></category>
		<category><![CDATA[call stack tutorial]]></category>
		<category><![CDATA[computer science fundamentals]]></category>
		<category><![CDATA[function call stack]]></category>
		<category><![CDATA[heap vs stack]]></category>
		<category><![CDATA[how function calls work]]></category>
		<category><![CDATA[local variables stack]]></category>
		<category><![CDATA[memory management]]></category>
		<category><![CDATA[process stack]]></category>
		<category><![CDATA[programming under the hood]]></category>
		<category><![CDATA[recursion stack overflow]]></category>
		<category><![CDATA[return address]]></category>
		<category><![CDATA[stack frames]]></category>
		<category><![CDATA[stack memory]]></category>
		<category><![CDATA[x86-64 call stack]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=314</guid>

					<description><![CDATA[<p>The call stack is a special stack data structure that your computer uses to manage function calls. Every time a function is called, a call frame is pushed onto the stack containing the return address, function arguments (beyond what fits in registers), preserved registers, and space for local variables. When the function returns, its call frame is popped and execution jumps back to the return address - this is how your program knows exactly where to continue after a function finishes.</p>
<p>The post <a href="https://www.NeuralLantern.com/the-call-stack-explained-call-frames-return-addresses-local-variables/">The Call Stack Explained: Call Frames, Return Addresses, Local Variables</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="The Call Stack Explained: Call Frames, Return Addresses, Local Variables" width="1380" height="776" src="https://www.youtube.com/embed/kT_s5XADSgs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Ever wonder how your program remembers where to return after calling a function? That&#8217;s the call stack&#8217;s job.</p>



<p>In this clear, whiteboard-style explanation we cover:</p>



<ul class="wp-block-list">
<li>What the call stack actually is</li>



<li>How call frames are built and what they contain</li>



<li>Return addresses, function arguments, local variables</li>



<li>Why recursion works (until you overflow the stack)</li>



<li>Stack vs heap memory differences</li>



<li>Why too much recursion = crash</li>
</ul>



<p>Great for beginners to intermediate programmers who want to understand what&#8217;s happening under the hood. References Ed Jorgensen&#8217;s excellent (and free) x86-64 assembly book.</p>



<p>00:00 Introduction to the Call Stack<br>00:16 Prerequisites &#8211; Understanding Basic Stacks<br>00:41 Simple Example Program with Function Calls<br>01:24 Function Call Chain and Recursion Example<br>02:20 Visualizing the Call Sequence<br>03:06 Local Variables and Return Values<br>03:55 Quick Recap &#8211; How Generic Stacks Work<br>04:34 Stacks Can Hold Any Data Type<br>05:36 Introducing the Call Frame Concept<br>06:22 What Belongs Inside a Call Frame<br>07:00 Return Address Explained<br>07:44 How the CALL Instruction Works<br>08:32 Function Arguments on the Stack<br>09:57 Extra Arguments Beyond Registers<br>10:19 Preserving Registers (Callee-Saved)<br>11:12 Local Variables on the Stack<br>11:40 Multiple Call Frames Example<br>12:54 Tracing Function Calls Step by Step<br>13:21 Starting with Main&#8217;s Call Frame<br>15:00 Pushing Frames for Nested Calls<br>16:30 Returning &#8211; Popping Frames<br>18:10 Why the Stack is Perfect for Returns<br>19:45 Recursion and Multiple Instances<br>21:30 Stack Grows Downward in Memory<br>23:10 Stack vs Heap Memory Comparison<br>25:12 Local Variables vs Dynamically Allocated Memory<br>26:16 Pointers on Stack Pointing to Heap<br>27:32 Automatic Cleanup of Stack Variables<br>28:00 Memory Leaks with Heap Allocations<br>28:56 Recommended Reading &#8211; Ed Jorgensen Book<br>29:56 Call Frame Layout in x86-64 Assembly<br>31:16 Process Memory Layout Overview<br>32:22 Stack Grows Down, Heap Grows Up<br>33:52 Stack Overflow from Deep Recursion<br>35:09 Summary &#8211; Why the Call Stack Matters<br>35:28 Closing Remarks and Call to Subscribe</p>



<p>=-=-=-=-=-=-=-=-=</p>



<p>Thanks for watching!</p>



<p>Find us on other social media here:</p>



<ul class="wp-block-list">
<li>https://www.NeuralLantern.com/social</li>



<li>Twitter / X: https://x.com/NeuralLantern</li>



<li>Rumble: https://rumble.com/c/c-3696939</li>



<li>BitChute: https://www.bitchute.com/channel/pg1Pvv5dN4Gt</li>



<li>Daily Motion: https://www.dailymotion.com/neurallantern</li>



<li>Minds: https://www.minds.com/neurallantern/</li>



<li>Odysee: https://odysee.com/@NeuralLantern:5</li>
</ul>



<p>Please show your support!</p>



<ul class="wp-block-list">
<li>Buy me a coffee: https://ko-fi.com/neurallantern</li>



<li>Subscribe + Sharing on Social Media</li>



<li>Leave a comment or suggestion</li>



<li>Subscribe to the Blog: https://www.NeuralLantern.com</li>



<li>Watch the main &#8220;pinned&#8221; video of this channel for offers and extras</li>
</ul>



<p>Hello there. In this video we&#8217;re going to talk about the call stack. What is the call stack?</p>



<p>It&#8217;s an important data structure inside of your computer that helps your computer call</p>



<p>functions inside of code. It&#8217;s pretty cool.</p>



<p>So first off, before you watch this video, you should probably already understand</p>



<p>how a stack works, what a stack is in terms of its interface and how to manipulate it</p>



<p>See my previous video if you don&#8217;t understand how to use stacks yet. In this video, I&#8217;m just going to talk about the call stack, which is just a special use of the generic stack abstract data type data structure.</p>



<p>Okay, so let&#8217;s see. First off, let&#8217;s suppose for the sake of argument that I have, you know, a function called main. This is not a C++ video or a coding video, but the call stack is related to coding.</p>



<p>mean when I write down some code. This is just a simple C++ program. You can imagine that</p>



<p>up above main, actually I don&#8217;t want to use prototypes, but I&#8217;m going to put the other</p>



<p>functions below. Please forgive me. You can imagine that main calls on the function f,</p>



<p>so I&#8217;m just going to do a function called f here. And so execution, when it gets to that part of</p>



<p>the program on line three, execution is going to jump down to line nine to just execute the f</p>



<p>And then maybe F calls G and then G it calls H and maybe H sometimes calls itself.</p>



<p>Maybe we&#8217;ll say that it&#8217;s a recursive function.</p>



<p>We&#8217;ll say if, you know, something happens, then we will return a call or we&#8217;ll just call H.</p>



<p>So it calls itself sometimes.</p>



<p>Otherwise, we will have it to call on the I function.</p>



<p>then you know execution just kind of returns to the caller which would be G in</p>



<p>this case and then we have the I function that just you know does whatever</p>



<p>right so the code here doesn&#8217;t really matter what I&#8217;m really trying to show</p>



<p>you is that one function calls another calls another and we can sort of allow</p>



<p>this to happen under the hood with a call stack so I&#8217;m just gonna draw this</p>



<p>and G calls on H and H we&#8217;ll say that we&#8217;ll say for the sake of argument one time H calls on H</p>



<p>just so it&#8217;s easier to draw later and then H eventually calls I for some other reason</p>



<p>maybe the deeper H calls I and then eventually this starts to return right so if you&#8217;re a</p>



<p>programmer you kind of take this situation for for granted you think like well I just kind of</p>



<p>call a function and then and then when the function&#8217;s done I just return to the place</p>



<p>everything is fine. If we had, let&#8217;s say, local variables in here, they would be preserved. Let&#8217;s</p>



<p>say, I don&#8217;t know, maybe h is like a number or something like that. Or how about let&#8217;s do g as</p>



<p>a number. We&#8217;ll say g returns some kind of a number. And then maybe in the f function, when</p>



<p>we call g, we&#8217;ll just print whatever g returned. So g calls h, and then we&#8217;ll just say like return</p>



<p>h and then we&#8217;ll just say like return whatever just trying to show you that we might have</p>



<p>a local variable so that means um in the g function maybe you&#8217;ll have a integer a is equal</p>



<p>to five and integer b is equal to six i&#8217;m just making up stuff here and then when we return</p>



<p>our data we might say you know return a plus b for whatever reason this is a nonsense program again</p>



<p>don&#8217;t take it too seriously but i&#8217;m just trying to show you that we have functions that can call</p>



<p>we have functions that can call each other sometimes call themselves and maybe they have</p>



<p>local variables on top of that so if you understand what is a stack then you understand that a stack</p>



<p>can hold many different types of data just as a quick recap here um you know a regular</p>



<p>generic data structure stack or an abstract data type stack we could say that the stack hold held</p>



<p>integers so if i wanted to put like an eight on there and then put like a five on there it would</p>



<p>it would just kind of stack up as we&#8217;re adding data.</p>



<p>And then when eventually we decided to remove data from the stack,</p>



<p>we&#8217;d pop it by just removing the thing from the top.</p>



<p>But because stacks are supposed to be abstract data types that hold any type of data,</p>



<p>we&#8217;re not limited to putting integers inside of the stack.</p>



<p>So we could invent a totally new data structure</p>



<p>and put instances of that data structure inside of the stack.</p>



<p>For example, if you had a custom class that you wrote yourself</p>



<p>and you just called it my class,</p>



<p>my class let&#8217;s see uh let me do class my class and i&#8217;ll just put braces here again this is not</p>



<p>a c++ video but you know you can imagine that you sort of made a blueprint for a new type of object</p>



<p>and you called it my class and then later on you&#8217;re like let&#8217;s make instances of my class</p>



<p>let&#8217;s make an instance called mc1 and mc2 and mc3 and so forth right so in the stack you could just</p>



<p>instances of my class i&#8217;m just going to put mc1 here if we created mc1 and then pushed it onto</p>



<p>the stack and then we can have mc2 and created an instance of that and just kind of pushed it</p>



<p>on the stack so we can do whatever we want we can put any type of data on the stack m</p>



<p>and this is not exactly the process stack so far i&#8217;m just telling you what a stack</p>



<p>in general can do so now instead of imagining that we have a custom class called my class</p>



<p>made a new class called call frame I&#8217;ll say we have like an instance let&#8217;s say</p>



<p>like a blueprint for a class we&#8217;ll call it a call frame I&#8217;m a penmanship it&#8217;s</p>



<p>because this thing this pen and I push it down and it always like keeps drawing</p>



<p>after I start lifting it up I don&#8217;t know what I&#8217;m doing wrong I&#8217;ve been trying</p>



<p>this for like 50 videos and it&#8217;s always bad and wrong so imagine you have a</p>



<p>class called call frame and inside of it you can just put some sort of data in</p>



<p>some sort of data inside the call frame.</p>



<p>You can imagine defining what an object might look like and then creating instances and</p>



<p>filling it up with data and then every instance just like we did with my class we could just</p>



<p>put that onto a stack right?</p>



<p>So now let&#8217;s try to understand what might be inside a data structure called a call frame</p>



<p>because when we have a stack under the hood in our machine that holds instances of call</p>



<p>frames then we actually have a process stack or a call stack which allows us to implement</p>



<p>which allows us to implement these function calls.</p>



<p>So let&#8217;s see, the first thing that we might imagine,</p>



<p>I&#8217;m gonna maybe just do like a little box here,</p>



<p>just to let you know that we&#8217;re deciding</p>



<p>what will go inside of a call frame.</p>



<p>So this is one call frame.</p>



<p>So you can imagine that the F function here,</p>



<p>in order for the F function to exist,</p>



<p>the particular call to exist,</p>



<p>what you know what it has what it is to be alive you know it needs its return</p>



<p>address I&#8217;m gonna put RA here for its return address what is a return address</p>



<p>well you know when we were inside of the main function let me draw the execution</p>



<p>path real fast when we were inside of the main function then execution was</p>



<p>going from top to bottom when we hit this F function call execution actually</p>



<p>jumped to the first line of the F function under the hood in assembly</p>



<p>there&#8217;s a jump instruction that allows you to just kind of jump to a totally</p>



<p>just kind of jump to a totally different memory location and start executing</p>



<p>instructions over there somewhere. In assembly also we have a call</p>



<p>instruction which means I would like to jump to another location but also I want</p>



<p>to remember where I just came from so that it&#8217;s easy for me to return later.</p>



<p>Okay so we&#8217;ll call that the return address. The return address in this case</p>



<p>would be let&#8217;s just call it line 4 meaning when function f returns then the</p>



<p>is this return zero in well I mean this is C++ we don&#8217;t it&#8217;s not really instructions it&#8217;s more</p>



<p>like statements but you can just imagine that F gets called and when it returns then the next</p>



<p>statement is return zero right so if we say that the memory location of wherever line four starts</p>



<p>is the return address of F then you can imagine that in order for F&#8217;s you know call instance to</p>



<p>exist it has to remember its return address so therefore we would put the return address inside</p>



<p>call frame. So the return address goes in there and function arguments sometimes go in there. If</p>



<p>you know assembly, and that&#8217;s kind of what we&#8217;re talking about right now in this video, then</p>



<p>you&#8217;ll know that function arguments, at least the integer arguments usually come in certain</p>



<p>registers like RDI and RSI, or if you&#8217;re, whoops, or if you&#8217;re passing float arguments,</p>



<p>and XMM1 and so forth right so you just kind of like load up registers with</p>



<p>arguments but if you have more arguments than you have registers you know</p>



<p>there&#8217;s only so many registers you can actually use to pass arguments into a</p>



<p>function that you&#8217;re calling so what if you run out of float registers you run</p>



<p>out of the general purpose registers but you want to have more arguments than</p>



<p>that for example if you look at the ABI then the integer arguments there&#8217;s only</p>



<p>integer arguments there&#8217;s only six registers that we can use to pass integer or pointer arguments</p>



<p>so if you wanted to have seven arguments or more then you know you should be able to do that but</p>



<p>there has to be a different way to accomplish that so the seventh and beyond arguments will</p>



<p>actually uh show up in the call frame oh I guess ra should probably be blue because the the call</p>



<p>frame I&#8217;m just you know making that green I&#8217;ll say return address so the seventh and uh the</p>



<p>the seventh and beyond arguments args we&#8217;ll just say so the call frame contains the return address</p>



<p>and any argument that&#8217;s that&#8217;s like the seventh argument and beyond and if you don&#8217;t have seven</p>



<p>arguments then there&#8217;s not going to be that&#8217;s not going to be in the in the call frame it&#8217;ll just be</p>



<p>blank at that point sometimes when people are messing around with the stack pointer they will</p>



<p>Basically, anytime you push a register in order to preserve it,</p>



<p>then it will end up on the call frame, at least at the assembly level.</p>



<p>So suppose you&#8217;re going to use the base pointer register.</p>



<p>You probably want to preserve the base pointer before you start using it.</p>



<p>So we would push it onto the stack and it would become part of the call frame.</p>



<p>Any registers that are designated as callee saved</p>



<p>would also be pushed into the call frame like R12.</p>



<p>Oh my God.</p>



<p>R13.</p>



<p>my penmanship there&#8217;s like it&#8217;s the ones the ones are always l&#8217;s okay and so forth right so</p>



<p>anything that&#8217;s designated as a callee saved register that you intend to use would end up</p>



<p>getting pushed onto the stack at the assembly level and thus it would end up in the call frame</p>



<p>but you know if you aren&#8217;t going to use any callee preserved registers then you don&#8217;t need to</p>



<p>preserve them and therefore they would not show up in the call frame and let&#8217;s see and local</p>



<p>local variables in assembly, you just basically end up pushing them to the stack.</p>



<p>So I&#8217;m going to put local variables here.</p>



<p>And in a second, I&#8217;ll show you how that kind of works in higher level languages like on</p>



<p>C++.</p>



<p>That&#8217;s why I wrote this down right here, line 12.</p>



<p>We&#8217;re making local variables.</p>



<p>And let&#8217;s see what else.</p>



<p>I should emphasize that local variables are very different from heap variables.</p>



<p>some point let&#8217;s say that when when g was called let&#8217;s say execution came in here</p>



<p>into main and then execution jumped into the f function so it jumped in there and then f wanted</p>



<p>to call on g in order to get some information right so we have a call frame just for g and we</p>



<p>have a call frame just for f and we have a call frame just for main and so we have like three</p>



<p>items on our stack at least just to get to that point of the program and every call frame you</p>



<p>you know, basically has this sort of information inside of it.</p>



<p>The return address, so the function knows where to jump back to</p>



<p>when it&#8217;s time to return from the function.</p>



<p>Seventh and beyond arguments, if any exist.</p>



<p>The base pointer, if you happen to modify that at the assembly level.</p>



<p>And then same thing for Kali saved registers.</p>



<p>And then local variables, which you could probably imagine more clearly.</p>



<p>So now I&#8217;m just going to erase this call frame thing here.</p>



<p>Oh God, this eraser needs to be improved.</p>



<p>god this eraser needs to be improved oh my gosh maybe i should make that bigger i need like a</p>



<p>little shortcut to make it bigger for a second because i don&#8217;t really want to draw that thing</p>



<p>on top again that&#8217;s just annoying i don&#8217;t want to do it i won&#8217;t do it i won&#8217;t do it okay so uh</p>



<p>imagine now that we are trying to sort of trace what&#8217;s happening in our uh call graph you know</p>



<p>in our in our program while we&#8217;re calling functions so first imagine we have an empty</p>



<p>have an empty stack and again if you don&#8217;t understand stacks you better go see my other video</p>



<p>imagine we have an empty stack the stack is not ever really going to be empty when you launch</p>



<p>your program it&#8217;s going to be uh there&#8217;s going to be stuff on it already but let&#8217;s just pretend that</p>



<p>we haven&#8217;t put anything on the stack at this point so there would be a you know a call frame just for</p>



<p>the main function i&#8217;m just going to write main here to say that this is the call frame for main</p>



<p>so it contains all the information that main needs and um if you have a main function in the first</p>



<p>first place then you&#8217;re probably linking against the GCC libraries which means</p>



<p>a main definitely has to return somewhere inside of the GCC library so</p>



<p>this kind of makes sense for our program so it&#8217;s a call frame for main</p>



<p>and then when main calls on F then another call frame gets created for F</p>



<p>and then when F calls on G another call frame gets created for G I don&#8217;t know if</p>



<p>I need to put these parentheses but I guess I&#8217;ve already started to do that</p>



<p>h and then h sometimes calls itself so I&#8217;m gonna put another call frame for h</p>



<p>up here oh my god h&#8217;s look like just crazy okay that&#8217;s been uh every time I</p>



<p>lift up the pen h calls itself sometimes we&#8217;ll just say that it calls itself</p>



<p>once in this case and then h calls i and then that&#8217;s let&#8217;s just say that&#8217;s the</p>



<p>end of our little call graph when i is finished doing whatever it&#8217;s gonna do</p>



<p>to do then it&#8217;ll just return to the caller right so notice how every single time we made a function</p>



<p>call we added a call frame for that particular instance of a call and we called it a call frame</p>



<p>something else that i should point out is that i have been describing to you a call frame as if it&#8217;s</p>



<p>a a data structure with sort of like a fixed amount of data inside of it and you would sort of</p>



<p>blob that whole block of data on at the same time that&#8217;s not really how it works in assembly in</p>



<p>you kind of just push, you know, one tiny piece of data at a time.</p>



<p>But in the abstract, you imagine that there&#8217;s a call frame.</p>



<p>Just keep that in mind.</p>



<p>Anyway, so in the F function, you know, we&#8217;ve been making these calls F and then G and then H and then H and then I.</p>



<p>Eventually, when we got to the, let&#8217;s say, what did I do wrong?</p>



<p>Oh, I did something wrong.</p>



<p>I put the local variables in the wrong function.</p>



<p>Hang on a second.</p>



<p>I want them to be, I mean, it would be okay to have them inside of the G function, but I really want them.</p>



<p>but I really want them, I really want them to be inside the H function for a certain reason.</p>



<p>So I&#8217;m just going to cut and paste here.</p>



<p>And I&#8217;m going to do like local variables inside of the H function and not in the G function.</p>



<p>And then G should maybe return an integer result.</p>



<p>And then this return statement shouldn&#8217;t even be in G.</p>



<p>It&#8217;s just going to be inside of H.</p>



<p>the a and the b variables at some point before returning them modify a and b somehow maybe I can</p>



<p>even put that comment inside of both of the blocks of the if so like so maybe if something happens</p>



<p>we&#8217;ll modify them in one way and if it doesn&#8217;t happen we&#8217;ll modify them in some other way</p>



<p>and then at the very end we return them just to kind of feel like we have more of an excuse</p>



<p>to have return variables in the first place and then when h returns something now we have an excuse to kind of print out whatever h is</p>



<p>doing okay and the reason I moved all that inside of h and not in g is because I just want you to know that</p>



<p>There are two instances of the h, you know call instance on the call stack which means the local variables</p>



<p>They&#8217;re not linked. They&#8217;re two distinct copies of each local variable inside of the stack think of it this way</p>



<p>When we call our h the first time,</p>



<p>we have an integer a and an integer b.</p>



<p>You could imagine that there&#8217;s an integer a</p>



<p>and an integer b sitting inside of the call frame somewhere,</p>



<p>you know, being pushed onto the call stack.</p>



<p>And, but the other called h also has a variable a</p>



<p>and a variable b,</p>



<p>but because those are local variables,</p>



<p>changing one doesn&#8217;t actually modify the other copy</p>



<p>that is in the other call frame.</p>



<p>So you could imagine this as A sub one and B sub one,</p>



<p>and then A sub two and B sub two.</p>



<p>This is kind of important later on when you realize</p>



<p>that your operating system is capable of launching multiple threads for your program</p>



<p>and local variables won&#8217;t potentially become race conditions,</p>



<p>which is just like for a totally different video.</p>



<p>But for now, just to understand these are totally separate instances.</p>



<p>If I change A sub two, it&#8217;s not changing A sub one and vice versa.</p>



<p>And same thing for B.</p>



<p>vice versa and same thing for B so anyway we we make all these calls and</p>



<p>somewhere along the way you know we&#8217;re creating a bunch of data and a bunch of</p>



<p>call frames eventually when we are done with the I function when I wants to</p>



<p>return here we don&#8217;t have an explicit return statement but if you if you know</p>



<p>C++ or higher level languages if there&#8217;s no return statement in most of</p>



<p>the language in most of these languages for a void function it just returns when</p>



<p>when it reaches the end of the function we don&#8217;t really need to say return because it doesn&#8217;t</p>



<p>return anything it just ends so when i is ready to return what happens is we look inside of its</p>



<p>call frame and we look for the return address which is inside of its call frame the return</p>



<p>address specifies exactly where we&#8217;re supposed to return for example maybe we&#8217;re supposed to return</p>



<p>right here maybe we&#8217;re supposed to return right here maybe to make things a little bit more</p>



<p>so maybe if we called h then we increased a and if not then we increased b something like that</p>



<p>so that means the the call frame for the first h function let&#8217;s suppose let&#8217;s see if it called</p>



<p>if it called itself then that means this block right here is the first part of the if block so</p>



<p>the return address for h return address would actually be pointing to</p>



<p>would actually be pointing to the next line right so when h called on h</p>



<p>it would look at line 21 or whatever the address was for that instruction</p>



<p>to begin at you know increasing a and it would just say that&#8217;s the return address so that</p>



<p>whenever h returns from itself it ends up executing a plus plus and then the same thing for i so</p>



<p>i has a return address so when we&#8217;re inside of the i function it&#8217;s got its own call frame and it</p>



<p>knows where it&#8217;s supposed to return which in this case would be that instruction right there or that</p>



<p>statement right there so whatever is the first instruction that implements that higher level</p>



<p>language statement that&#8217;s going to be the return address inside the the i call frame so we look</p>



<p>inside of the call frame for the return address we know where to return it&#8217;s going to return to h at</p>



<p>at this point in time.</p>



<p>And once we&#8217;re done with that,</p>



<p>then we just deallocate the call frame.</p>



<p>In assembly language,</p>



<p>all we&#8217;re really doing is moving the stack pointer</p>



<p>and just sort of ignoring the call frame</p>



<p>from that point forward and we&#8217;ll call it junk data.</p>



<p>So the data is kind of actually still there,</p>



<p>but we&#8217;re just not using it.</p>



<p>And then later, if we wanna start adding more stuff</p>



<p>on top of the stack,</p>



<p>then it will just override that junk data.</p>



<p>But for now, just imagine that it&#8217;s gone.</p>



<p>Anyway, so then we returned from I back to H</p>



<p>from I back to H and so that&#8217;s line 26 right here imagine we perform this</p>



<p>instruction the B++ and then execution falls through down to the very end the</p>



<p>return statement so then same thing happens this version or I guess this</p>



<p>version of H had its own no hang on a second we returned from I yeah yeah this</p>



<p>to h so that means execution will will basically jump from here to right here so it kind of jumps</p>



<p>you know back to that next line like we talked about before when it returns based off the return</p>



<p>address then again you can imagine that that call frame is deallocated or just ignored as junk data</p>



<p>and the top of the stack is kind of like moving and then when that call on h uh finishes so you</p>



<p>executed and then execution falls through down to the return statement then again h has its own</p>



<p>return address in its in its call frame or that instance of h has its own call frame then it knows</p>



<p>where to return and this time it knows to return to whoever called h in the very first place so</p>



<p>it&#8217;s going to be um i guess it&#8217;s going to be like when it returns it&#8217;s going to go back to g</p>



<p>h on g but I guess you could imagine under the hood you know instead of like</p>



<p>another statement you can imagine more stuff is happening right like when we</p>



<p>called h and then we returned then we had an expression that evaluated to</p>



<p>something because h returned to value and then we would send that to the stream</p>



<p>operator so in assembly there are many instructions happening after the call to</p>



<p>h but you could just imagine at this point you know it&#8217;s just gonna finish up</p>



<p>that that existing statement and then move down to finish and return so then</p>



<p>so then again you know we we just returned from h to g so we de-allocated that call frame the top</p>



<p>of the stack is now somewhere around there in that call frame when g finishes and it returns</p>



<p>same thing it&#8217;s got a return address so it knows where to return and then top of the stack kind of</p>



<p>goes down there and g knows to jump to whoever called it because of the return address so it&#8217;s</p>



<p>going to be at this point in time again there&#8217;s more statements that happen after the return</p>



<p>see out in a stream operator uh you know but uh you know basically when f is done then again it&#8217;s</p>



<p>going to use the return address and know where to jump back to which is just going to be this next</p>



<p>line right here so when f was called originally it like ended up calling h and then h uh you know</p>



<p>called itself and h called itself and then it called i and then we returned from i and then we</p>



<p>returned from h and returned from h twice and then eventually we returned to g and then we returned</p>



<p>and all of its calls were finished then execution returned just a line for and</p>



<p>that&#8217;s that&#8217;s basically saying like oh what happens when F is done let&#8217;s look</p>



<p>at its return address hop that off the call stack and then the top of the stack</p>



<p>is basically just sitting inside of the main function so yeah this is how we</p>



<p>implement function calls in the machine you know there&#8217;s there&#8217;s really no so if</p>



<p>you know, from a certain point of view, there&#8217;s no such thing as functions inside the machine.</p>



<p>In assembly language, we certainly see that we have a label and then we have like a return</p>



<p>instruction and we have a call instruction, but you know, there&#8217;s no like function. It&#8217;s all just</p>



<p>ones and zeros all over the place, right? So the idea of labels and functions and things,</p>



<p>that&#8217;s kind of an abstraction just for the human being with feelings to make it a little bit easier</p>



<p>stack we have a stack and we stack things on top of the stack and the things that we stack are</p>



<p>called call frames call frames are kind of flexible because sometimes there&#8217;s more data</p>



<p>sometimes there&#8217;s less data depending on what the function itself is doing but it allows us to have</p>



<p>a function call itself many times it allows us to have many different instances of function calls</p>



<p>exist at the same time even if we&#8217;re only looking at the very top of the call stack in terms of</p>



<p>conflict with each other.</p>



<p>And then, you know, like we have a trail of breadcrumbs when we start returning and</p>



<p>returning and returning, the stack makes it really, really easy.</p>



<p>And so, you know, in the abstract, we can basically say that there are functions in</p>



<p>our machines because this implementation helps make it happen.</p>



<p>One last thing that I wanted to say before I go here is just keep in mind that these</p>



<p>local variables, they&#8217;re on the stack, but dynamically allocated memory is not on the</p>



<p>stack.</p>



<p>stack. Let me just show you what I&#8217;m talking about right here. You probably understand the</p>



<p>heap already at this point. If you&#8217;re watching this video, then you know a little bit about</p>



<p>dynamic memory allocation. So I&#8217;m just going to do, let&#8217;s say we have like an F function void F.</p>



<p>And inside of the F function, we have let&#8217;s say a integer pointer P, and we will allocate P to a new</p>



<p>So just so you know, the variables A and B and also P, they&#8217;re considered local variables</p>



<p>because I just declared them.</p>



<p>I declared a pointer on line four.</p>



<p>I declared two integers on line seven.</p>



<p>Maybe I should put those like at the top, I guess.</p>



<p>Okay, so lines four and five, they declare local variables.</p>



<p>The pointer is a special type of variable, right?</p>



<p>That just points to a memory location.</p>



<p>So the thing that it points to might not be a local variable, but the pointer itself is</p>



<p>a local variable.</p>



<p>The pointer itself is a local variable.</p>



<p>So these three variables on lines four and five, A and B and P, those are on the stack.</p>



<p>Any local variable gets put on the stack.</p>



<p>And then when you allocate a new integer with dynamic memory, maybe you could imagine if</p>



<p>you&#8217;re a C programmer, this would be a call to malloc rather than new.</p>



<p>Then what&#8217;s happening under the hood is that the system goes and tries to find some free</p>



<p>memory in a different area of your process called the heap, not the stack.</p>



<p>heap not the stack it tries to find some free memory in the heap it once it finds some then it</p>



<p>designates that as you know being in use and then it returns to you the memory location of that new</p>



<p>allocation so in this case we&#8217;re allocating a new integer so that&#8217;s going to be 32 bits of data or</p>



<p>four bytes and uh so it just you know it just finds four bytes somewhere in the heap and it finds the</p>



<p>memory location of the very first byte and it returns that to the caller and so p its value is</p>



<p>is now going to be the memory location of the new integer that you allocated.</p>



<p>But P itself is on the stack.</p>



<p>So P is kind of weird, right?</p>



<p>Like P exists on the stack, but it points to something in the heap.</p>



<p>Keep in mind the difference.</p>



<p>And then if we just let this function go to the very end</p>



<p>without cleaning up that memory, we would have a memory leak.</p>



<p>I should probably just do like a dedicated video on pointers</p>



<p>for people who are interested in pointers in higher level languages later.</p>



<p>But keep in mind that when the function ends</p>



<p>and you pop the call frame off the call stack,</p>



<p>then that automatically cleans up all the local variables.</p>



<p>So A and B and P itself will be deallocated</p>



<p>and not become memory leaks.</p>



<p>However, the thing that P pointed to,</p>



<p>that will be a memory leak.</p>



<p>I guess that&#8217;s a topic that&#8217;s too advanced</p>



<p>for this stack video,</p>



<p>but I just want you to know the difference</p>



<p>between something that exists on the stack</p>



<p>and something that exists on the heap.</p>



<p>Okay, so then I think the last thing</p>



<p>that I need to show you here</p>



<p>here is uh let me uh shoot let&#8217;s see shambler okay so here&#8217;s uh uh my favorite book i love to</p>



<p>i love to pump up this book it&#8217;s awesome the author is like a brilliant man very kind man</p>



<p>he offers this book for free it&#8217;s got a copy left license you can literally just download it for</p>



<p>and it&#8217;s legal because this is an open book basically it&#8217;s called x86 64 assembly language</p>



<p>programming with ubuntu by the brilliant dr ed jorgensen phd or professor ed jorgensen</p>



<p>this is the latest version that i&#8217;m working with right now i think it&#8217;s the latest version i don&#8217;t</p>



<p>know he updates this thing all the time it&#8217;s always getting better but um if we look at this</p>



<p>book uh you can get a copy of it on your own or you can just watch this video i&#8217;m going to go to</p>



<p>12.8.3 so 12 section 12 12.8 12.8.3 called the call frame and here you can kind of see a</p>



<p>description of some of the stuff that I talked about in terms of what sort of data you would</p>



<p>expect to see in the call frame but if you just kind of look down a little bit you can see that</p>



<p>we are sort of pushing some preserved registers</p>



<p>sort of like save the stack pointer as the RBP register.</p>



<p>But before we do that, we wanna push the RBP register.</p>



<p>And then notice out here,</p>



<p>it shows that there&#8217;s a return address</p>



<p>and the RIP register.</p>



<p>That&#8217;s actually the instruction pointer register.</p>



<p>The stack pointer is RSP.</p>



<p>And then other arguments that go into it.</p>



<p>So just keep in mind that we have a little layout here</p>



<p>a little layout here and then somewhere else there was something I wanted to show you here</p>



<p>no no no no no no no no no no no no no no no no no no okay I guess I&#8217;m gonna</p>



<p>oh I guess I was just supposed to show you the call frame anyway okay so I guess that&#8217;s pretty</p>



<p>much it I just wanted to show you some extra stuff just so you understand this is the basic</p>



<p>Oh, okay, I found it.</p>



<p>I spent a second scrolling through the book to find the other diagram that I really wanted</p>



<p>to show you.</p>



<p>So same book, X-8664 Assembly with Ubuntu by Ed Jorgensen, Professor Ed Jorgensen, PhD.</p>



<p>And if you look at section 9.3, there&#8217;s another picture here that&#8217;s kind of useful.</p>



<p>And it basically shows, you know, the general idea of how information is laid out inside</p>



<p>information is laid out inside of your process so when you launch a process in</p>



<p>order to execute your program then it&#8217;s kind of laid out like this there&#8217;s like</p>



<p>a little reserved area and then there is the text section for assembly you know</p>



<p>that&#8217;s where you have all your instructions and then there&#8217;s the data</p>



<p>section and then there&#8217;s uninitialized data which is the BSS section if we&#8217;re</p>



<p>talking about Yasm assembly and then notice how in this big blob of an area</p>



<p>and the stack kind of sharing an area inside of available memory it&#8217;s important to understand that</p>



<p>the stack when you actually add things onto the process stack like call like call frame data</p>



<p>you&#8217;re actually decreasing memory location so the stack grows downward in memory so I think I&#8217;m going</p>



<p>to put this in another video but basically right now I just want to show you if we have memory</p>



<p>location let me let&#8217;s pretend that we have like a stack here and there&#8217;s like a couple of frames</p>



<p>there&#8217;s like a couple of frames you know sitting on top of it suppose you had I don&#8217;t know memory</p>



<p>location OX you know 99 or something suppose for the sake of argument we&#8217;re only pushing one byte</p>



<p>at a time so it&#8217;s easier for me to write then that means you know the next thing that shows up</p>



<p>you know a little higher on the stack you would intuitively think that the memory location is</p>



<p>I guess I increased that 9 to a but it actually goes down in memory so I mean</p>



<p>look at this diagram right here the stack goes down in memory so every time</p>



<p>you push to the stack you&#8217;re pushing to a lower and lower and lower memory</p>



<p>location so right here I&#8217;m just gonna write down OX 9 8 and it just keeps</p>



<p>going down and down and down let&#8217;s see 1 2 3 4 5 right and the heap is is</p>



<p>upward in memory so the heap when you call new allocations like if you say new or malloc or you</p>



<p>know some kind of dynamic memory then its memory locations grow up and the stack grows down and if</p>



<p>they ever actually meet then you&#8217;ve ran out of memory just keep that in mind but um you know</p>



<p>in modern systems the heap can kind of grow almost endlessly i&#8217;m sure i&#8217;m sure you&#8217;ve all</p>



<p>been running programs in the past and noticed that the program was consuming gigabytes of data right</p>



<p>gigabytes of data right but it&#8217;s not like you had gigabytes of data allocated to that process</p>



<p>when you first opened it up like if you have a browser with like 100 million tabs open</p>



<p>i know some of you people do that then when you first open your browser it doesn&#8217;t really use</p>



<p>that much memory but then as you start opening more tabs maybe some pages are doing some weird</p>



<p>stuff and you get memory leaks then the heap starts to grow and grow and grow and then you&#8217;ll</p>



<p>notice the process takes way more than did in the beginning so the heap can kind of grow in an</p>



<p>of course that is limited to your physical system ram and eventually in the far off future will be</p>



<p>limited by whatever 64 bits can get us i don&#8217;t think we&#8217;re ever going to reach that in my lifetime</p>



<p>but you know i&#8217;ve been wrong many times before however the stack it grows downward in memory</p>



<p>and it&#8217;s kind of limited you can actually overflow your stack pretty easily so when the stack grows</p>



<p>downward too much then you just you have a stack overflow and the program crashes but when the heap</p>



<p>But when the heap grows, then it can just be resized again and again and again.</p>



<p>Or that little block can kind of expand again and again and again.</p>



<p>If you don&#8217;t believe me, try writing a program with a recursive loop that just goes on forever.</p>



<p>So imagine, actually, I don&#8217;t know, don&#8217;t do this on your boss&#8217;s computer because maybe</p>



<p>it&#8217;ll crash things.</p>



<p>Do it on your own personal computer.</p>



<p>like a function f and uh you know you&#8217;ll probably want to call f inside of main or something so i&#8217;ll</p>



<p>just say like int main and we&#8217;ll just call f right away and then return zero when you&#8217;re inside of f</p>



<p>you just call f right so this is like a horrible program if you ran this very quickly you&#8217;d crash</p>



<p>the program because every single time you call f you&#8217;re adding another call frame on top of the</p>



<p>stack your call stack is going to just be filled with f call frames and then you know it runs out</p>



<p>you know, it runs out of available memory locations to use, and then you&#8217;re just done.</p>



<p>It just crashes the whole program.</p>



<p>So let&#8217;s see.</p>



<p>I think hopefully now you feel like you&#8217;re an expert on the process stack and call frames.</p>



<p>Thank you for watching this video.</p>



<p>And I hope you learned a little bit and had some fun.</p>



<p>I guess I&#8217;ll see you in the next video.</p>



<p>hey everybody thanks for watching this video again from the bottom of my heart I really</p>



<p>appreciate it I do hope you did learn something and have some fun if you could do me a please a</p>



<p>small little favor could you please subscribe and follow this channel or these videos or whatever it</p>



<p>is you do on the current social media website that you&#8217;re looking at right now it would really mean</p>



<p>the world to me and it&#8217;ll help make more videos and grow this community so we&#8217;ll be able to do</p>



<p>better videos or just I&#8217;ll be able to keep making videos in general so please</p>



<p>do do me a kindness and and subscribe you know sometimes I&#8217;m sleeping in the</p>



<p>middle of the night and I just wake up because I know somebody subscribed or</p>



<p>followed it just wakes me up and I get filled with joy that&#8217;s exactly what</p>



<p>happens every single time so you could do it as a nice favor to me or you could</p>



<p>you control me if you want to just wake me up in the middle of the night just</p>



<p>subscribe and then I&#8217;ll just wake up I promise that&#8217;s what will happen also if</p>



<p>if you look at the middle of the screen right now, you should see a QR code, which you can scan</p>



<p>in order to go to the website, which I think is also named somewhere at the bottom of this video.</p>



<p>And it&#8217;ll take you to my main website where you can just kind of like see</p>



<p>all the videos I published and the services and tutorials and things that I offer and all that</p>



<p>good stuff. And if you have a suggestion for clarifications or errata or just future videos</p>



<p>Or if you just want to say, hey, what&#8217;s up? What&#8217;s going on? You know, just send me a comment, whatever.</p>



<p>I also wake up for those in the middle of the night. I get, I wake up in a cold sweat and I&#8217;m like,</p>



<p>it would really, it really mean the world to me. I would really appreciate it. So again,</p>



<p>thank you so much for watching this video and enjoy the cool music as, as I fade into the</p>



<p>darkness, which is coming for us all.</p>



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/the-call-stack-explained-call-frames-return-addresses-local-variables/">The Call Stack Explained: Call Frames, Return Addresses, Local Variables</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/the-call-stack-explained-call-frames-return-addresses-local-variables/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
