<?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>x86-64 assembly Archives - NeuralLantern.com</title>
	<atom:link href="https://www.NeuralLantern.com/tag/x86-64-assembly/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.NeuralLantern.com/tag/x86-64-assembly/</link>
	<description></description>
	<lastBuildDate>Mon, 16 Mar 2026 06:39:34 +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>x86-64 assembly Archives - NeuralLantern.com</title>
	<link>https://www.NeuralLantern.com/tag/x86-64-assembly/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>x86-64 Assembly: Local Variables, Stack Frames &#038; Alignment Explained</title>
		<link>https://www.NeuralLantern.com/x86-64-assembly-local-variables-stack-frames-alignment-explained/</link>
					<comments>https://www.NeuralLantern.com/x86-64-assembly-local-variables-stack-frames-alignment-explained/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Mon, 16 Mar 2026 06:39:32 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[16 byte alignment]]></category>
		<category><![CDATA[assembly array on stack]]></category>
		<category><![CDATA[assembly language]]></category>
		<category><![CDATA[assembly stack allocation]]></category>
		<category><![CDATA[calling convention]]></category>
		<category><![CDATA[computer architecture]]></category>
		<category><![CDATA[local variables stack]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[NASM tutorial]]></category>
		<category><![CDATA[printf crash assembly]]></category>
		<category><![CDATA[rbp rbp stack]]></category>
		<category><![CDATA[reverse engineering]]></category>
		<category><![CDATA[stack alignment]]></category>
		<category><![CDATA[stack frame assembly]]></category>
		<category><![CDATA[sub rsp assembly]]></category>
		<category><![CDATA[systems programming]]></category>
		<category><![CDATA[x64 assembly]]></category>
		<category><![CDATA[x86 assembly tutorial]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[Yasm tutorial]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=317</guid>

					<description><![CDATA[<p>Learn how local variables are allocated on the stack in x86-64 assembly using YASM. See exactly how to reserve space, address variables with offsets, understand downward stack growth, and fix mysterious printf segfaults caused by 16-byte stack misalignment. Includes two alignment solutions and a complete working example with a local integer array.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-local-variables-stack-frames-alignment-explained/">x86-64 Assembly: Local Variables, Stack Frames &amp; Alignment Explained</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="x86-64 Assembly: Local Variables, Stack Frames &amp; Alignment Explained" width="1380" height="776" src="https://www.youtube.com/embed/woCCcOlopNo?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>Quick but deep look at local variables on the stack in x86-64 assembly (YASM). We cover allocation with sub rsp, accessing via offsets, why the stack must be 16-byte aligned when calling libc functions like printf, and two practical ways to fix alignment crashes. Includes live segfault debugging and a full working example with a local array.</p>



<p>Great for anyone studying systems programming, computer architecture, or just trying to figure out why their assembly program randomly crashes on a library call.</p>



<p>Like + subscribe if you want more clear, practical assembly tutorials!</p>



<p>00:00 Introduction to Local Variables on the Stack<br>00:28 C++ Example of Function and Local Variables<br>01:06 Incoming Arguments in RDI vs Stack Variables<br>03:24 Pointers as Local Variables on Stack<br>04:34 Why the Stack – Recursion and Multiple Calls<br>05:18 Visualizing Multiple Stack Frames<br>09:24 How Function Returns Adjust RSP<br>10:35 Stack Grows Downward in Memory<br>11:33 Program Setup – Hybrid C++/Assembly<br>12:46 Assembly Module Overview<br>14:00 Function Prologue – Register Push &amp; Alignment<br>15:30 Allocating Stack Space for Local Array<br>17:45 Initializing Array in Loop<br>20:10 Printing Loop with printf<br>49:48 First Run – Segfault Observed<br>51:00 16-Byte Stack Alignment Requirement<br>51:55 Fix 1 – Extra Push/Pop in Prologue/Epilogue<br>53:15 Fix 2 – Push/Pop Around Each printf Call<br>55:04 Testing Different Array Sizes<br>56:52 Debugging Alignment Behavior<br>58:54 Summary – Creating Any Local Data on Stack<br>59:59 Closing Remarks &amp; Subscribe Call</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>Hi there! Today I&#8217;d like to talk to you about local variables on the stack</p>



<p>in an x8664 assembly program written in YASM.</p>



<p>If you don&#8217;t understand assembly or local variables or other things like that you might</p>



<p>want to see my other videos but I&#8217;m just going to give you a quick example. So what am I talking</p>



<p>about with local variables on the stack? For starters forget what you&#8217;re seeing here for a</p>



<p>blank code page and pretend that we&#8217;re coding in c plus plus just for a moment this is an assembly</p>



<p>video but pretend this is c plus plus so suppose you have c plus plus you have a main function here</p>



<p>and at the end of it you know this is your entry point for your program we return zero and maybe</p>



<p>above it there&#8217;s a function called f i&#8217;m putting it above because i don&#8217;t want to use prototypes</p>



<p>in this video but you should probably use prototypes um maybe main calls on f and so then</p>



<p>what happens? I don&#8217;t know. Maybe we have some arguments. We&#8217;ll call this integer argument A</p>



<p>that comes in. If you&#8217;ve watched my other videos, hopefully you have by now,</p>



<p>you&#8217;ll know that A comes into the function as RDI because that&#8217;s the first integer argument</p>



<p>register. But then when we start creating local variables, we&#8217;ll say integer B equals, let&#8217;s say,</p>



<p>a five and then integer C is equal to an eight for whatever reason. Maybe there will be an array.</p>



<p>So I&#8217;ll call this a int array, I guess.</p>



<p>We&#8217;ll say that we have 100 integers in our array.</p>



<p>We could also have a pointer, int pointer p,</p>



<p>and then allocate it to some kind of new memory just to prove a point.</p>



<p>And then, you know, later in your function,</p>



<p>you&#8217;re probably going to want to do something with your data.</p>



<p>So I don&#8217;t know, maybe a, how about like b is plus equal to a,</p>



<p>of C++ and then oh C++ C is plus equal to B for some reason I&#8217;m just making random nonsense up</p>



<p>honestly I&#8217;m just showing you that we use our variables and then maybe you want to build an</p>



<p>array so we just declared the array up here on line six but maybe you want to actually do something</p>



<p>with it you want to fill it with data maybe so I&#8217;ll do size type I is zero keep going until I</p>



<p>is less than as long as I is less than 100 I plus plus and now I&#8217;m going through every single index</p>



<p>array maybe I&#8217;ll say the array at index i is equal to c and then we&#8217;ll just say c is plus equal to b</p>



<p>and then we&#8217;ll do b plus plus just to have something in there okay so let me explain the</p>



<p>parts of your program real fast if you haven&#8217;t watched my other videos please do because this</p>



<p>should help a little bit anyway so a is an incoming argument like I said before that&#8217;s</p>



<p>usually coming to you in the RDI register because it&#8217;s the first integer argument so we don&#8217;t need</p>



<p>to worry too much about that we know that a is actually just a register in your CPU and b that&#8217;s</p>



<p>created on the stack and c is created on the stack also and the array is created on the stack by the</p>



<p>way I could name the array anything if I wanted to like just v I&#8217;m using the name array because</p>



<p>Notice also that we have a pointer here. I just wanted to make a point that the pointers we make in our function are considered local variables.</p>



<p>And that means they do sit on the stack because what I&#8217;m trying to say is that local variables that are not arguments, they sit on the stack.</p>



<p>But the memory we allocated and then gave to the pointer, that&#8217;s sitting in the heap somewhere.</p>



<p>So when you use the new operator or the malloc operator, or you&#8217;re just like making dynamic memory,</p>



<p>that dynamic memory sits in the heap, but the pointer itself, since we just declared it here,</p>



<p>that sits on the stack. That means later on when your function ends, the p pointer itself will get</p>



<p>cleaned up automatically and itself won&#8217;t be leaked memory. But if you forget to clean up your memory</p>



<p>here, like I did, you&#8217;ll have a memory leak. But I&#8217;m going to talk about memory leaks probably in</p>



<p>some other videos somewhere else at another time. Anyway, so then we have our local variables here.</p>



<p>remember B and C and array are all on the stack and well we just have our</p>



<p>for loop here where we just kind of start modifying data so why would we use</p>



<p>the stack let me just do a quick tutorial this is not a stack video I&#8217;m</p>



<p>gonna make a stack video in the future but I&#8217;ll just do like a quick little</p>



<p>rundown of what is the stack and why is it really good for function calls</p>



<p>consider that sometimes F might want to call itself maybe it&#8217;s a recursive</p>



<p>be like a long chain of function calls like f calls g and g calls h and h calls you know whatever</p>



<p>and it just goes on and on and on as long as it&#8217;s not infinite recursion like all the functions are</p>



<p>calling themselves in one circle that never ends you should be allowed to do that we should be</p>



<p>allowed to have a function f that sometimes calls itself or other functions or maybe it&#8217;s called</p>



<p>multiple times within our giant call stack our call graph and this will work because these</p>



<p>you know a b and c and array are sitting on the stack and the stack allows you to have sort of</p>



<p>different instances of variables so for example and this is just a quick thing i&#8217;m not this is</p>



<p>not supposed to be a full stack tutorial here but um you know if we have like the function f</p>



<p>and let&#8217;s say we call it at some point maybe uh maybe main calls f uh and then let&#8217;s let&#8217;s pretend</p>



<p>f and then f calls h and then maybe h calls f and um did i write an h there no i think that&#8217;s</p>



<p>supposed to be a parenthesis i&#8217;m sorry i have bad penmanship oh god it&#8217;s even worse hang on let me</p>



<p>let me do another h here i&#8217;ll just do it i&#8217;ll just do a g about that f g and then uh</p>



<p>F again. Let&#8217;s just pretend that we can have a call graph where F is sometimes called by something</p>



<p>and sometimes called something else or maybe sometimes F is called by a different thing. So</p>



<p>like I guess this was supposed to be the G function. So maybe that&#8217;s why down here was the H.</p>



<p>Should I delete this video? I don&#8217;t know. You know what? I&#8217;m going to start. I&#8217;m going to delete this</p>



<p>and then G calls H and then H calls F and then F calls I I guess and then</p>



<p>eventually these functions start returning right oops how come my greens</p>



<p>not working green there we go too late now so we can have like a really</p>



<p>complicated call graph and F might appear in there multiple times and the</p>



<p>Each call to F along the call graph should have its own copy, unique copy of local variables.</p>



<p>So the B for this first F call, let me just do an arrow here, will have a B.</p>



<p>And you can imagine it as B subscript 1.</p>



<p>And down here when F executes, you can imagine that it&#8217;s got its own copy of B.</p>



<p>So we can imagine this as B subscript 2.</p>



<p>So these are two totally different Bs.</p>



<p>If you tried to use global variables for this, it would be really, really, really hard to get the code to work.</p>



<p>get the code to work and it would be really, really hard to debug.</p>



<p>So that&#8217;s kind of why we have local variables.</p>



<p>The stack allows us to do this.</p>



<p>So what is the stack itself?</p>



<p>Again, this is not a full tutorial on the stack,</p>



<p>but I just want you to kind of see what&#8217;s happening.</p>



<p>Imagine a data structure that kind of grows upward.</p>



<p>I&#8217;ll say that here&#8217;s the floor at the bottom.</p>



<p>And when you put an item onto the stack,</p>



<p>the items kind of stack on top of each other.</p>



<p>So imagine that this is the call to F.</p>



<p>is the call to f and embedded within this little stack frame area we&#8217;ll call it a stack frame but</p>



<p>actually the stack continues to grow as you create and destroy local variables within a function call</p>



<p>we&#8217;ll just imagine that there&#8217;s i don&#8217;t know a mini stack sitting inside of the stack that</p>



<p>contains all the local variables i&#8217;ll just put i&#8217;m not going to put a because a is an argument so</p>



<p>it&#8217;s sitting in a register but we could do dude i got to learn how to how to draw with this tablet</p>



<p>We got to do B and C and the array.</p>



<p>I&#8217;ll put AR for array.</p>



<p>Sitting in, you know, their own little spots on the stack within the major portion of the stack that is designated for that first F call.</p>



<p>And then, you know, maybe F calls G and some other stuff happens.</p>



<p>I&#8217;ll just pretend that a bunch of other stuff happened.</p>



<p>And then eventually F is called again.</p>



<p>But there&#8217;s a different, this is a different instance of the call to F.</p>



<p>it&#8217;s got its own little area that is separate from the the previous call to f and again we&#8217;ll</p>



<p>also have variables that we can create locally that are supposed to be separate from the original</p>



<p>variables oh god that&#8217;s awful and ugly i need to maybe decrease the size of my eraser or something</p>



<p>but imagine this is uh you know these are two separate copies so that&#8217;s like what i said before</p>



<p>when we have like a b1 and a b2 basically they&#8217;re not going to be called b1 and b2 but they&#8217;re just</p>



<p>They&#8217;re not going to be called B1 and B2, but they&#8217;re just two separate instances.</p>



<p>And I just want you to know.</p>



<p>So then when we start returning from functions, like when this F eventually returns, and by</p>



<p>the way, I know that what I&#8217;m drawing on the right doesn&#8217;t match the code because this</p>



<p>is not a function that calls itself, but just suppose that your code is a lot more complicated</p>



<p>than what I drew up.</p>



<p>When it eventually returns, all that happens is those items on the stack just sort of get</p>



<p>not necessarily deallocated, but ignored.</p>



<p>We&#8217;ll just say that they&#8217;re gone.</p>



<p>They&#8217;re still sitting as junk data in system RAM somewhere.</p>



<p>And in assembly talk, we know that we have a stack pointer called RSP.</p>



<p>We have a register called RSP that just sort of points to the location in the</p>



<p>stack that is considered the top of the stack, like the most recent piece of data</p>



<p>that we have available.</p>



<p>So all the other data is actually still kind of above, but we&#8217;re not pointing to it</p>



<p>anymore, so we consider that it doesn&#8217;t exist.</p>



<p>So then when G eventually returns, you know, we just change the stack pointer,</p>



<p>Rsp, to point to that other piece of data.</p>



<p>The G data frame and the other F data frame are still sitting above somewhere in memory,</p>



<p>but we just ignore them, right?</p>



<p>So that&#8217;s how the stack works.</p>



<p>And that&#8217;s how we have local function call copies of all of our local variables.</p>



<p>Something to note.</p>



<p>Something to note, this is not a stack video, but you know, just something to note that</p>



<p>even though I draw the stack visually as growing vertically up, when you actually manipulate</p>



<p>the stack in assembly or just like in any language, the stack grows downward in terms</p>



<p>of memory locations.</p>



<p>So you can imagine, I&#8217;m trying so hard not to make this like a huge stack video.</p>



<p>Imagine this is a memory location 80, we&#8217;ll say.</p>



<p>You would think that memory location 81 would be the next item of the stack, or I guess</p>



<p>the stack or i guess if you if you&#8217;re considering the fact that the items on the stack are quad words</p>



<p>we would say it goes up to 88 but that&#8217;s not true it goes down to 72 so the memory location goes down</p>



<p>even though we imagine the stack growing uh upward vertically just so you know that&#8217;s the kind of</p>



<p>thing we&#8217;re going to do so what i&#8217;m going to do is just show you an assembly program where we can</p>



<p>create local variables and i&#8217;m just going to show you how to create an array because this array is</p>



<p>just like a bunch of integers and you can imagine it would be really easy to create only one integer</p>



<p>by just imagining an example where the array is a size of one so keep that in mind and i&#8217;m not going</p>



<p>to show you malloc or anything like that we&#8217;re just going to look at the local variables okay</p>



<p>so for starters i have a make file here that&#8217;s just going to compile a hybrid program if you don&#8217;t</p>



<p>know make files or you don&#8217;t know hybrid programs that&#8217;s okay just see my other videos i&#8217;ve explained</p>



<p>The first source code file here is just driver.cpp.</p>



<p>Again, this is a hybrid program,</p>



<p>so I&#8217;m going to mix my C++ modules with my assembly modules,</p>



<p>which is pretty cool.</p>



<p>The whole point of the driver is just to contain the entry point, you know, main.</p>



<p>And I&#8217;m just going to print a hello message.</p>



<p>And then I&#8217;m going to call the real function that I&#8217;m interested in,</p>



<p>which I&#8217;ve named local underscore varrs.</p>



<p>And that&#8217;s going to be all the assembly stuff that we talked about.</p>



<p>block so that C++ can call an assembly module that&#8217;s explained in other videos. And then</p>



<p>here&#8217;s the real heart of what we got to do. Let&#8217;s write up an assembly module</p>



<p>that can do local variables. Okay. So again, if you don&#8217;t know assembly, that&#8217;s okay,</p>



<p>but you need to watch my other videos before you can understand this one. So I&#8217;m going to just</p>



<p>copy paste some starter code here. This is Yasm assembly in x86-64. So I&#8217;ve got a data section up</p>



<p>So I&#8217;ve got a data section up top and I&#8217;m just going to define some messages.</p>



<p>So, you know, I&#8217;ve got like an intro message that just says, hello, I&#8217;m so and so.</p>



<p>And that&#8217;s not my name, but I like those kinds of names.</p>



<p>And then over here, I&#8217;m going to do some printf formatted strings.</p>



<p>That&#8217;s why I&#8217;m using a hybrid program for this video.</p>



<p>I don&#8217;t want to import my own personal library.</p>



<p>I want you to be able to do this at home with just the GCC libraries.</p>



<p>link a hybrid library you know linking against gcc instead of linking against ld again if you don&#8217;t</p>



<p>know that stuff check my other videos then we&#8217;re allowed to call c functions in this case we&#8217;re</p>



<p>going to call printf and we&#8217;re just going to give it the string percent lu meaning i would like you</p>



<p>to print just you know an unsigned long integer so i&#8217;m going to give it a value at some point on the</p>



<p>stack representing a local variable and then i want it to print as just like a long like a string</p>



<p>along like a string that a human can read then after that this is the carriage return line feed</p>



<p>the crlf printf won&#8217;t flush its output unless that is sitting at the very end of the string so</p>



<p>i&#8217;m just going to use printf to also print my new lines and then i&#8217;m going to null terminate the</p>



<p>string so that printf doesn&#8217;t freak out and try to print a bunch of stuff after the crlf and uh</p>



<p>oh i this was from another video let me get rid of that we don&#8217;t really need crlf in this video</p>



<p>CRLF in this video because we&#8217;re just putting it directly inside of the printf string we&#8217;re not</p>



<p>making our own function to do that so then I&#8217;m going to make some defines I&#8217;m going to define</p>



<p>that we&#8217;re going to have 50 integers so I&#8217;m calling this define 50 I&#8217;m calling it num integers</p>



<p>and I&#8217;m saying that it has a value of 50 so I want to make an array that has 50 integers I don&#8217;t</p>



<p>know maybe if you want to imagine 100 you know like the example that I just showed I&#8217;m going to</p>



<p>going to define what is the integer size so i&#8217;m going to use quad words which are 64 bit integers</p>



<p>so i&#8217;m just going to say that there are eight bytes per integer that will help me multiply later</p>



<p>and then i&#8217;m going to decide to fill up the array on the stack with just some numbers just to prove</p>



<p>that i can just to prove that we can like uh you know manipulate and and fetch the values</p>



<p>of all this stuff going on in the stack and i&#8217;m going to say that the starting value is seven so</p>



<p>with this we should expect to see like an array of numbers that starts with seven and it just</p>



<p>kind of increases somehow then i&#8217;m going to do some system call codes we talked about that in</p>



<p>a different video and then some file descriptors i don&#8217;t think we actually need anything but standard</p>



<p>output but i put it in there anyway then the next thing we&#8217;re going to add is the text section</p>



<p>let me just do copy paste on my solution here so here&#8217;s the text section section text</p>



<p>section text in Yasm and I&#8217;m going to let my module know that I want to be able to call printf</p>



<p>which is a function sitting in the GCC libraries when I link against a GCC I have the ability to</p>



<p>do that that way I don&#8217;t have to come up with like a complicated printing method or use one</p>



<p>of my own shared libraries or something so we can just ask printf to do everything so now here&#8217;s the</p>



<p>entry point for the module it&#8217;s just a function called local VAERS I mark it as global so it&#8217;s</p>



<p>it&#8217;s accessible to outside modules ie or eg driver dot cpp and then so here&#8217;s the label saying the</p>



<p>function starts and here&#8217;s the return statement saying that we&#8217;re done with the function i&#8217;m not</p>



<p>going to manipulate any registers inside of the function so i don&#8217;t really need to do any push pop</p>



<p>to preserve them first thing i&#8217;m going to do is call a welcome let me comment this part out by</p>



<p>the way i&#8217;m going to call a welcome a function and the whole job of the welcome function is just to</p>



<p>is just to, you know, print a welcome message to the user.</p>



<p>So nothing that I haven&#8217;t talked about before in other videos.</p>



<p>So it&#8217;s just we&#8217;re using a system call to print a string.</p>



<p>Okay, so with that in mind, let me open this up here and see if this is going to work.</p>



<p>I just want to basically print the welcome message at this point.</p>



<p>Clear and make run.</p>



<p>And again, if you don&#8217;t know make files or anything like that, see my other videos.</p>



<p>So this is the driver, I think, that prints.</p>



<p>think that Prince maybe I should change the driver&#8217;s message to make it more</p>



<p>clear hello about this is the driver and my name is whatever I&#8217;m gonna do it again</p>



<p>and now it says hello this is the driver okay so that&#8217;s the CPP module and then</p>



<p>here is the assembly module and then finally the driver gets control back and</p>



<p>then the program exits so nothing really happened so now let&#8217;s upgrade the</p>



<p>So now let&#8217;s upgrade the assembly module a little bit.</p>



<p>Next thing I want to add is the actual demo function, which is going to be absolutely huge.</p>



<p>So first I&#8217;m going to start off with, how about just the signature here?</p>



<p>Let&#8217;s go right after the welcome module.</p>



<p>And I&#8217;m just going to copy paste the signature, put a return at the end of it.</p>



<p>So we&#8217;ll consider this a function that can be called.</p>



<p>instruction on line 47 of the entry point and then now we have a demo</p>



<p>function that is being called but it does nothing for starters you know I in</p>



<p>my comments I like to put the signature of the function and I like to remind</p>



<p>myself of how I&#8217;m using my registers hopefully I&#8217;m not using the same</p>



<p>register in two different ways but you know sometimes it happens if it does and</p>



<p>I&#8217;m able to break my function up into multiple parts I&#8217;ll probably do it</p>



<p>you know with modular thinking modular programming but in this case I&#8217;m just</p>



<p>using these registers it&#8217;s fine to use them they are all designated per the ABI</p>



<p>as callee saved so that means the callee which is the demo function is</p>



<p>responsible for preserving them so if you don&#8217;t remember that or if you don&#8217;t</p>



<p>know about that see my other videos this is not an ABI video so I&#8217;m just going to</p>



<p>push all of them to make sure that they&#8217;re preserved I&#8217;m gonna call this</p>



<p>call this the prolog then at the end of my function i&#8217;m going to call this the epilog where</p>



<p>i just restore them in reverse order because that&#8217;s the way the stack returns data to you</p>



<p>the stack returns data to you in reverse order so i have to pop in the reverse register order to</p>



<p>un-reverse the reversal if that makes sense pop r13 pop r12 okay so i think 15 14 13 okay</p>



<p>so i got that next thing we&#8217;ll do is um let&#8217;s remember where the stack pointer started because</p>



<p>started because we have our register here that we&#8217;re going to mess with let me just type rsp</p>



<p>real fast so this is the stack pointer register rsp this helps all programs know where where</p>



<p>they&#8217;re looking at in the stack all of your functions have to be really really careful about</p>



<p>messing with the stack pointer if you do it wrong you will crash the entire program because not only</p>



<p>will your local function not really know where its local variables end and begin it probably also</p>



<p>It&#8217;s return address when you try to return from the function because that is also sitting on the stack</p>



<p>And even if you were lucky enough to be able to jump back correctly to whoever called you</p>



<p>If you messed up the stack pointer then you&#8217;ve also messed it up for any caller of you and any of their callers</p>



<p>So the whole program is ruined. So we&#8217;ll start off by trying to remember where the stack pointer was</p>



<p>We&#8217;ll move</p>



<p>The stack pointer into the base pointer</p>



<p>didn&#8217;t do here that I that I want to do we should since we&#8217;re messing with the</p>



<p>base pointer and other programs sorry other functions or modules might also</p>



<p>rely on the base pointer and it&#8217;s considered callie saved we probably also</p>



<p>want to preserve that too so I&#8217;m going to do push RBP to basically say I would</p>



<p>like to restore I would like to preserve the base pointer so I don&#8217;t mess it up</p>



<p>for my callers so that means I have to restore it with the pop so RBP the base</p>



<p>The base pointer isn&#8217;t necessarily a pointer to the stack, but it&#8217;s often used as kind of like a bookmark.</p>



<p>So we have RBP at the front and the back there.</p>



<p>Let&#8217;s see.</p>



<p>Next thing I want to add is, so now that we&#8217;ve restored it, we&#8217;re allowed to just overwrite it because, you know, we&#8217;re kind of like keeping its value at the top.</p>



<p>Then we&#8217;re restoring its value at the bottom.</p>



<p>And that means we can actually mess it up in the middle if we want to, and it&#8217;ll be fine.</p>



<p>let me show you real fast what happens what happens is nothing the program is</p>



<p>still okay because we we restored it so now we&#8217;re using the base pointer to</p>



<p>remember where the stack was now we&#8217;ve got to sort of calculate how much room</p>



<p>we want to make on the stack let me show you what I&#8217;m talking about here</p>



<p>remember all of our local variables are going to be on the stack and before we</p>



<p>drew this thing where it was like well we&#8217;ve got like a stack sitting here and</p>



<p>let&#8217;s just pretend that there&#8217;s some kind of data sitting on the stack data</p>



<p>data data right if the stack pointer dude green green there we go oh I erased my</p>



<p>green RSP if the stack pointer is currently pointing to this frame then</p>



<p>in order for us to make room on the stack to hold our array well if the</p>



<p>whole array is going to be sitting on the stack that just basically means</p>



<p>have five integers suppose five suppose that we want to make five integers on the stack that just</p>



<p>means we need to do five extra slots let me draw it in red here well let&#8217;s see can we get a green</p>



<p>no how about a yellow my green is just having a hard time we can do it in red even though this is</p>



<p>not a bad thing to do so i&#8217;ll just draw like five extra frames on top of on top of the stack here</p>



<p>imagine these are all 64-bit integers and so they take eight bytes on the stack even though in our</p>



<p>previous example we were using just regular ints which are 32 we&#8217;ll just say we&#8217;re going to make</p>



<p>five 64-bit integers because that&#8217;s easier so they&#8217;re quad words so every frame is actually</p>



<p>eight bytes and not just four bytes and it&#8217;s definitely not one byte so we make five of those</p>



<p>how do we make five slots it&#8217;s pretty easy we we literally just move the stack pointer let&#8217;s see</p>



<p>we just move the stack pointer to or the you know the rsp register to just say let&#8217;s let&#8217;s point you</p>



<p>know further out and how do we get that number we&#8217;re just going to multiply the size of one</p>



<p>integer so you know the size of one integer here we know it&#8217;s going to be eight bytes we just</p>



<p>multiply that by the number of integers that we want you know that&#8217;s going to be 40 so we&#8217;ll just</p>



<p>increase uh sorry decrease the stack pointers value by 40 because remember again when the</p>



<p>vertically, it&#8217;s actually growing downward in memory. So we&#8217;re going to decrease by 40 there,</p>



<p>at least in this drawing example. And that gives us a bunch of junk data, you know, because there</p>



<p>is always going to be some kind of a value sitting at every memory location in your computer.</p>



<p>It&#8217;s impossible that there is literally nothing at some memory location,</p>



<p>unless you&#8217;re trying to go beyond your RAM stick. But then the system will still acknowledge that,</p>



<p>you know, you&#8217;ve done that and it won&#8217;t just give you back nothing if you try to read</p>



<p>nothing if you try to read.</p>



<p>So there&#8217;s going to be junk data sitting on there and then we&#8217;ll loop</p>



<p>through all those slots on the stack and we&#8217;ll just modify the data one by one</p>



<p>so that we can control what it is instead of just printing whatever junk data we end</p>



<p>up with.</p>



<p>So really, we&#8217;re just moving the stack pointer, just making room and then just</p>



<p>remembering where our array is.</p>



<p>We could put, you know, another frame on top if we wanted to make just like one</p>



<p>integer as a local variable.</p>



<p>You just got to remember where it is.</p>



<p>You know, what is it?</p>



<p>What is its offset?</p>



<p>is it what is its offset okay so i&#8217;m going to erase this because we&#8217;re going to do a lot more than</p>



<p>than five uh integers on the stack but i just want you to understand what we&#8217;re doing before we do it</p>



<p>okay so the next thing i&#8217;m going to grab is a move instruction and i&#8217;m going to put it right here so</p>



<p>to move the stack pointer rsp so the first thing i&#8217;m going to do is i&#8217;m going to use a temporary</p>



<p>register we don&#8217;t need to preserve this in the push and pop because it&#8217;s marked as temp so we&#8217;re</p>



<p>not responsible for preserving it and so i&#8217;m going to say r10 is just going to be the number of</p>



<p>integers that we want to create if you recall at the top of our program here num integers is just</p>



<p>50 okay so then the next thing that i&#8217;m going to grab is well i&#8217;m not going to grab it i&#8217;m going</p>



<p>it I&#8217;m going to straight multiply by integer size so again if you look at integer size that&#8217;s going</p>



<p>to be eight because we&#8217;re using quad words for our integers so we&#8217;re really just going to take</p>



<p>50 times 8 whatever number that is is that 400 tell me in the comments if that&#8217;s a right or wrong</p>



<p>and so uh you may or may not know if you don&#8217;t see more videos see more textbooks you may or may not</p>



<p>instruction just multiplies two numbers.</p>



<p>If you use the three operand format,</p>



<p>then the last two operands get multiplied</p>



<p>and the results stored in the first operand.</p>



<p>But if we use the two operand format like I&#8217;ve done here,</p>



<p>then both of those operands get multiplied</p>



<p>and then the result gets stored in the first operand.</p>



<p>So basically at this point,</p>



<p>R10 should hold the number of memory locations</p>



<p>that we should move the stack pointer</p>



<p>in order to make room for all those integers</p>



<p>like I showed you a second ago.</p>



<p>showed you a second ago. So then we&#8217;re going to move the stack pointer.</p>



<p>And maybe I&#8217;ll leave a little comment here. Remember, the stack grows downward</p>



<p>in memory. And so all I&#8217;m doing is subtracting the stack pointer. Remember the stack pointer</p>



<p>register, it just holds a number, which is a memory location. So if you subtract some numbers</p>



<p>from it, you&#8217;re really having it go downward in memory. And that&#8217;s what we want to do</p>



<p>memory and that&#8217;s what we want to do to you know grow the stack for a local variable so I&#8217;m going</p>



<p>to say well I should also say that we&#8217;re using the two operand version so just like I&#8217;m all if we</p>



<p>had the three operand version then the last two operands would have one subtracted from the other</p>



<p>and the result will be stored in the first one but since I&#8217;m using the two operand version</p>



<p>basically it&#8217;s taking RSP minus R10 and then storing it in RSP so this this instruction just</p>



<p>this instruction just says let&#8217;s move the stack pointer downward in memory</p>



<p>enough times that we have room for all of our integers okay no problem next thing that we&#8217;re</p>



<p>going to do is um we&#8217;re going to move r12 we&#8217;re going to move into r12 the current value of rsp</p>



<p>word in memory right less okay so the first integer you know it&#8217;s up to you</p>



<p>how you style this because once we do the subtraction then RSP is actually</p>



<p>going to be pointing towards an integer you could consider that to be the first</p>



<p>integer or the last integer because all we have is an array of integers so you</p>



<p>you know rsp wherever it&#8217;s sitting when we&#8217;re finished we could say that&#8217;s pointing to the</p>



<p>first integer or we could say it&#8217;s pointing to the last integer but um if we decide to say that it is</p>



<p>pointing to the let&#8217;s see yeah if we&#8217;re deciding that it points to the first integer let me just do</p>



<p>a little comment here first integer it just makes it a little bit easier for me to write our loop</p>



<p>You could start by pointing to the one that RSP is pointing to,</p>



<p>or you could start by pointing to the other one that was like the first one that you added onto the stack.</p>



<p>You could call either one of those the first integer, as long as you remember where you started.</p>



<p>So you can increase or decrease the memory location to get to the next integer.</p>



<p>So I&#8217;m just going to do it in this style.</p>



<p>But keep in mind, as long as the only thing that you modify and read is within that range, it&#8217;s okay.</p>



<p>So let&#8217;s remember where is RSP.</p>



<p>So that&#8217;s like the top of the stack.</p>



<p>We&#8217;re going to say R12 holds the stack pointer so that we can use R12 as sort of a running</p>



<p>pointer.</p>



<p>I think that&#8217;s the way I&#8217;m going to use it.</p>



<p>Let me just double check my solution.</p>



<p>Yeah.</p>



<p>Okay.</p>



<p>a calculation where we remember where the last integer is so we know where the first integer</p>



<p>we&#8217;re just going to call this the first integer i&#8217;ll put it in quotes just to remind you that</p>



<p>this is just the style i happen to be using so here we&#8217;re going to say that the first integer</p>



<p>is wherever rsp is pointing and then in r13 we&#8217;re going to remember where the other side of the</p>



<p>array is in this case we&#8217;re calling it the last integer and pretty much it&#8217;s just r12 which is</p>



<p>And then we add to it a memory location.</p>



<p>So remember we said before that the stack grows downward in memory.</p>



<p>So if we consider the top of the stack to be the first integer,</p>



<p>then that means previous items, maybe I should draw this,</p>



<p>are going to be increased memory locations.</p>



<p>So that&#8217;s kind of like the backwards of what you imagine a stack is doing,</p>



<p>but it&#8217;s kind of the way that I like it sometimes.</p>



<p>So imagine just in a very simple stack,</p>



<p>let&#8217;s pretend that the stack has one byte values,</p>



<p>one byte of values, which it doesn&#8217;t, but let&#8217;s pretend if you, if you do it,</p>



<p>I got to learn how to draw. I can&#8217;t get that five right. Okay. I&#8217;m defeated. So let&#8217;s pretend</p>



<p>that that address on the thing sitting at the bottom of the stack is five. So then that means</p>



<p>the next address would be four, right? But if we decided, let&#8217;s say that the, well, let&#8217;s do like</p>



<p>like a few more just to make it a little bit more interesting.</p>



<p>Let&#8217;s do a total of five.</p>



<p>So we&#8217;ll say four, three, two, one.</p>



<p>Maybe I should just add some numbers in front of those values.</p>



<p>So it doesn&#8217;t feel like we&#8217;re hitting zero.</p>



<p>But so just pretend we have a memory location of 15.</p>



<p>That&#8217;s not going to be the case in real life.</p>



<p>Pretend that we have one byte integers on the stack, which is not going to be the case.</p>



<p>We&#8217;re going to have quad words.</p>



<p>But you can see the memory locations go downward, right?</p>



<p>to the stack pointer is pointing to the topmost location we have to remember that anything up here</p>



<p>might exist in system ram but it&#8217;s not considered valid data because we didn&#8217;t</p>



<p>you know make it part of the stack by by growing the stack pointer so that means uh these</p>



<p>these items well maybe i&#8217;ll do a check instead of an x because x looks bad i&#8217;ll do a check</p>



<p>check and a check and a check and a check these items are okay to use so if I have</p>



<p>RSP or in this case we just remembered where RSP was by storing r12 if we have</p>



<p>that memory location 11 and we want to get an additional integer like somewhere</p>



<p>else like the next integer well that would be you know this one down here we</p>



<p>wouldn&#8217;t go in the other direction we wouldn&#8217;t go you know up we would just go</p>



<p>know up we would just go down in the stack but down visually is actually growing upwards in memory</p>



<p>because remember when we grow upwards visually we&#8217;re growing downward in memory so and you can</p>



<p>see here too if we&#8217;re if we&#8217;re increasing 11 to 12 that means we&#8217;re adding memory locations to get</p>



<p>to the next uh integer that we have in the stack so that&#8217;s why here my green is just like frustrating</p>



<p>fix this yeah so that&#8217;s why here we&#8217;re adding a little formula instead of subtracting because</p>



<p>the rsp started there we&#8217;re saying that the top of the stack is the first integer</p>



<p>just so we can add in a more convenient nice way so what are we adding to it we&#8217;re just adding to it</p>



<p>the number of integers minus one and then so that&#8217;s that&#8217;s the number of slots that</p>



<p>size. So if you imagine, you know, if we had 10 integers, then, you know, 10 minus one is nine</p>



<p>slots. So if you imagine that zero is the first integer, let&#8217;s say the memory location again,</p>



<p>then that means one, two, three, four, five, six, seven, eight, nine, 10 minus one is nine. So if we</p>



<p>added the number of integers minus one from the start, which we&#8217;ll consider zero here, that means</p>



<p>directly so that&#8217;s just like a little math because sometimes when you when you</p>



<p>think of adding two numbers together or taking the difference or including the</p>



<p>first number or not including the first number it&#8217;s a little confusing right so</p>



<p>keep in mind for this particular calculation we are adding to it the</p>



<p>number of integers minus one so that will be sitting on the last integer</p>



<p>rather than going past it so start with the first integers memory location and</p>



<p>the number of integers minus one or size minus one times the integer size,</p>



<p>because remember, every integer is going to be eight bytes.</p>



<p>And that will give us the memory location of the last integer in R13.</p>



<p>And then I&#8217;ve said this in other videos,</p>



<p>but basically you&#8217;re only allowed to make these sorts of calculations in Yasm</p>



<p>when you have the calculation inside of brackets,</p>



<p>but brackets will automatically dereference the value on the inside.</p>



<p>It&#8217;ll consider it as a pointer that needs to be dereferenced,</p>



<p>but we don&#8217;t want to dereference anything.</p>



<p>anything we don&#8217;t want to go to a memory location and take a value the memory location is the value</p>



<p>so these dereferencing brackets which are required for the formula are kind of bad so that&#8217;s why we</p>



<p>use the lea instruction instead of the move instruction if i put move there it would</p>



<p>definitely dereference the memory location and give me a value in r13 so r13 wouldn&#8217;t actually</p>



<p>be a pointer it would just be the value of the junk data of the last integer keep that in mind</p>



<p>keep that in mind okay so uh where&#8217;s RSP so we got that so now let&#8217;s do a loop</p>



<p>I&#8217;m gonna start off with a label called demo loop init so for me personally when</p>



<p>I&#8217;m looping you know I like to make my labels inside of my loops start with a</p>



<p>prefix that matches the function so it&#8217;s like demo and then everything else is</p>



<p>gonna be demo underscore something so uh init loop init I&#8217;m gonna make a loop</p>



<p>to make a loop where i initialize the values of the array so i&#8217;m calling this loop the init loop</p>



<p>and then the last part is just like this is the initialization part of the loop this is where we</p>



<p>sort of like set up the initial values to loop so we have r12 and 13 that point to the first</p>



<p>and last integers now we&#8217;re going to set up r14 and 15 where r14 is the running pointer i think</p>



<p>before i might have accidentally said that r13 is the running pointer it just points to the last</p>



<p>it just points to the last integer but if you look back up at my comments r14 is the running pointer</p>



<p>to the current integer what is a running pointer it&#8217;s just a pointer that runs it&#8217;s just a pointer</p>



<p>that just keeps increasing so we can look at different data values so i&#8217;m going to start it</p>



<p>by looking at the first integer so now r14 is pointing to the first integer and then r15 is</p>



<p>going to be the value that i want to put into that position in the array so like the first integer</p>



<p>integer I want to put some kind of a starting value into it you can put the</p>



<p>number zero or whatever you want I just wanted to have a start value so that it</p>



<p>sort of looks more like I&#8217;m putting data and less like I have a loop counter so</p>



<p>remember the integer start value up here is just seven so I&#8217;m just going to start</p>



<p>at the number seven and now I&#8217;m done initializing my loop then the next thing</p>



<p>I&#8217;m going to add is the top of my loop so you can imagine this as the top of a</p>



<p>top of a while loop where you start comparing some sort of an expression maybe i&#8217;ll say uh</p>



<p>you know expr to say that we&#8217;re comparing some sort of an expression</p>



<p>and if that expression evaluates to true the loop continues if it evaluates to false</p>



<p>then the loop does not continue let&#8217;s see so i&#8217;m going to compare r14 with r13 inside of the</p>



<p>and 13 remember R14 is the running pointer and R13 is the last integer so basically I&#8217;m trying to</p>



<p>figure out am I looking at or like let&#8217;s compare the running pointer with the pointer of the last</p>



<p>integer then I&#8217;m going to say if the running pointer has a greater memory location than than</p>



<p>the last integer that means I&#8217;ve gone beyond the last integer and again the way I arranged the first</p>



<p>last integers just makes it easier for me to think of them as having increasing</p>



<p>memory locations so I&#8217;m going to jump if the running pointer has already</p>



<p>surpassed the last integer by saying let&#8217;s jump if it&#8217;s greater than so you</p>



<p>can imagine maybe in the expression here I should probably say while not</p>



<p>r14 is greater than r13 not a great expression but it&#8217;ll do so that&#8217;s what</p>



<p>up there at the top let me just put that into my notes too so that my notes match</p>



<p>the video okay so we are comparing and then we&#8217;re jumping to the end of the</p>



<p>loop if we end up you know going beyond the last integer so that labels not</p>



<p>created yet I&#8217;ll create that in a moment but pretty much that&#8217;s a label that&#8217;s</p>



<p>just going to be below the loop just to say like we&#8217;re finished with the loop</p>



<p>the loop body I like to put comments here to help myself remember oh this is</p>



<p>the part of the while loop that I&#8217;m currently inside of just makes things a</p>



<p>little bit easier to understand you know you put a block comment up top of every</p>



<p>label or every you know chunk of instructions just to let you know the</p>



<p>general idea and then you know sometimes you put comments also on the right side</p>



<p>to help you remember what each instruction is actually doing so then</p>



<p>what am I going to do here remember R14 is the running pointer if I D ref R14</p>



<p>ref r14 that means i want to move an actual value into that memory location rather than changing the</p>



<p>memory location that r14 points to so r15 is going to be the uh the integer that we want to</p>



<p>write into the array so all i&#8217;m doing here is i&#8217;m saying let&#8217;s take that value seven which is what</p>



<p>it starts as and just move it in to you know the ram stick at that memory location so i&#8217;m setting</p>



<p>seven right now then I&#8217;m going to increase our 15 so that means every time</p>



<p>we iterate the loop we should see that the value increases so the first integer</p>



<p>should be seven the second one should be eight next one should be nine and so</p>



<p>forth so just a simple loop where I&#8217;m just writing data into my array so now</p>



<p>that we&#8217;ve ended the loop body let&#8217;s write the bottom of the loop which is</p>



<p>just going to increase the running pointer and jump back up to the top and</p>



<p>And this is not necessarily the only style for translating while loops.</p>



<p>I&#8217;m just doing it.</p>



<p>And, you know, I&#8217;m going to make another video in the future where we talk about, you know, for loops and while loops and all that stuff.</p>



<p>But this video is just really about local variables on the stack.</p>



<p>So I&#8217;m not going to go over all the different ways you can do it.</p>



<p>Anyway, so R14 is the running pointer.</p>



<p>So I&#8217;m going to just make the running pointer jump to the next integer.</p>



<p>And we can do that by increasing its memory location by the size of one integer.</p>



<p>Again, this is another benefit of the first and last pointers that I chose at the beginning.</p>



<p>I can just increase to go to the next integer.</p>



<p>So we&#8217;re going to increase by 8 bytes to just go to the next integer.</p>



<p>If you increase by 1 byte, you&#8217;ll probably have a huge corrupted mess because you&#8217;re</p>



<p>messing with 8 byte integers but you&#8217;re only increasing by 1 byte.</p>



<p>And then after we increase, we&#8217;re just going to jump to the top of the loop.</p>



<p>So notice how I have a jump statement here.</p>



<p>It&#8217;s going to go just to loop top.</p>



<p>loop top. So now this part is here is basically just going to execute over and over and over again</p>



<p>until we finally scan through all of the integers in our array. So that&#8217;s the bottom of the loop.</p>



<p>And then I&#8217;ll make the label for the loop being done. It&#8217;s not really going to do anything</p>



<p>except just be done. And do you, you know, I don&#8217;t know, depending on your style, maybe you can let</p>



<p>drop through if the loop&#8217;s done rather than always jumping to the top but i&#8217;m just going to say when</p>



<p>we&#8217;re done we jump to the loop done label and therefore there&#8217;s no more looping of that</p>



<p>initialization loop okay so we got that done let me just run the program real fast to make sure</p>



<p>that i haven&#8217;t screwed it up we actually should not see anything right now oh what did i do</p>



<p>must have done something naughty maybe if i finish</p>



<p>uh this program then everything will be okay oh my gosh what did i even do</p>



<p>well i&#8217;ve got a working solution in the other window so hopefully when i paste all the extra</p>



<p>steps everything will be fine you never know subtract the stack pointer oh did i forget to</p>



<p>oh did i forget to restore something at the very end print body move the base pointer into the</p>



<p>RSP stack pointer oh yeah okay that&#8217;s definitely what you got that&#8217;s why I</p>



<p>crashed okay so um remember I said you got to be very careful about the stack</p>



<p>this is a great lesson so I did preserve the base pointer but I didn&#8217;t actually</p>



<p>preserve the stack pointer notice how right here I subtracted from the stack</p>



<p>pointer but I did not restore the stack pointer anywhere so that means I</p>



<p>corrupted the stack for anyone that called me and also for my return address</p>



<p>address. So I&#8217;m kind of trying to copy paste my instructions from top to bottom, but I think I&#8217;m</p>



<p>just going to copy paste something else to make sure that we can actually run this. So I&#8217;m going</p>



<p>to copy paste into the epilog a restoration of the stack pointer. And that&#8217;s why we saved the</p>



<p>stack pointer in the base pointer, just to remember where it was when we originally started our</p>



<p>function. So now on line 128, it should be restored and the program should work. Let me just double</p>



<p>yeah it worked okay nothing happened that we can see but it did write values</p>



<p>into the array now let&#8217;s do another loop where we just print the array so let&#8217;s</p>



<p>see loop in it done looping it bottom and looping it done okay so now there&#8217;s</p>



<p>like gonna be another loop here we&#8217;re gonna call this the print loop and so</p>



<p>the print loop is gonna be kind of the same pattern we&#8217;re just gonna loop</p>



<p>going to loop through all the integers in the array but instead of modifying them we&#8217;re just</p>



<p>going to print them so now you know the first thing we&#8217;ll do is we&#8217;ll set r12 we&#8217;ll store that</p>



<p>inside of r14 in order to start the loop at the first integer what was r14 again that was the</p>



<p>running pointer remember let&#8217;s see where is that yeah it was the running pointer so now we&#8217;re</p>



<p>resetting the r14 running pointer to the very beginning of the array and we know where the</p>



<p>thing we&#8217;ll do is we will set up the top of the loop and the body so I&#8217;m just</p>



<p>going to copy paste again this stuff right here</p>



<p>right there okay so the top of the loop we&#8217;re asking ourselves you know we&#8217;re</p>



<p>gonna compare I&#8217;m not gonna put all the extra while stuff that I put in the</p>



<p>previous loop because hopefully by now you understand loops a little bit better</p>



<p>and if we&#8217;re beyond the last integer because the running point of r14 is beyond the memory</p>



<p>location of r13 that means we&#8217;re totally done so we should jump if it&#8217;s greater than</p>



<p>now i feel bad let&#8217;s uh let&#8217;s put a comment in here on the top let&#8217;s go uh</p>



<p>basically that you know if uh keep going as long as r14 is not greater than r13 so if it is</p>



<p>in the body and in the body all i&#8217;m going to do is use r14 the running pointer to print uh you know</p>



<p>whatever value is sitting in that particular integer so how do we do that i&#8217;m just going to</p>



<p>use the printf statement or sorry the printf function which is provided by the c libraries</p>



<p>that&#8217;s why we&#8217;re doing you know a modular or a hybrid program with multiple modules and c linking</p>



<p>very quickly there is a function called printf which I can call it it takes multiple arguments</p>



<p>but the first two arguments that I can give it are the string that represents the formatting</p>



<p>that I want to print like I could do like a regular string message I could do tokens</p>



<p>to format some data inside of them and then the second argument is going to be the piece of data</p>



<p>that I actually want to use let me see if I can just type that up for you real fast</p>



<p>So, you know, the printf instruction, or sorry, this is not an instruction.</p>



<p>This is a function in C.</p>



<p>We would typically, you know, give it some kind of string.</p>



<p>The string should be null terminated, and it should have a new line at the very end of it</p>



<p>to make sure that printf actually flushes.</p>



<p>It won&#8217;t flush if you don&#8217;t have a new line, so the program will look really weird.</p>



<p>But I guess it&#8217;s more performant if you have a way to delay the flushing,</p>



<p>flushing and you know that you can flush it later at the very end but for now i&#8217;m just going to</p>



<p>flush every time and then every argument after that is some sort of you know data that we can</p>



<p>print so imagine we have a long and we&#8217;ll call it a and we&#8217;ll say that it has like some giant value</p>



<p>so that means we would give that long as the next argument the rsi argument and then for the string</p>



<p>what I&#8217;m using right here %lu so you can imagine instead of this string it is this</p>



<p>string right here whoops too many too many quotes it&#8217;s just this string right</p>



<p>here and then instead of a 10 13 that&#8217;s the same thing as just doing an or if</p>



<p>you want to be you know more of a windows windows person slash r slash n</p>



<p>it&#8217;s all good and the zero is not needed because the string if you put a string</p>



<p>literal it&#8217;s automatically going to be null terminated which means there&#8217;s just</p>



<p>null terminated which means there&#8217;s just a zero at the end of the string in memory so this is</p>



<p>basically what I&#8217;m doing I&#8217;m making a an integer in the case of the assembly program it&#8217;s going to</p>



<p>grab an integer from that position in the array that we&#8217;re looking at and it&#8217;s going to give it</p>



<p>as an argument and then the first argument is going to say let&#8217;s just print this as a unsigned</p>



<p>long so that&#8217;s why I have that string here let me search for it and go down a little bit again so</p>



<p>I&#8217;m saying first argument is this the format that I want to be printed second argument is the actual</p>



<p>is the actual value and then I&#8217;m gonna make a call to printf why do I have this</p>



<p>weird push and pop pair sitting around printf so this is not a video about</p>



<p>stack alignment in GCC but basically the GCC libraries expect that your stack is</p>



<p>aligned to I think 16 bytes but since we use 8 byte integers every single time we</p>



<p>address to the stack which is eight bytes and then every time we do one single push or pop</p>



<p>we&#8217;re modifying the alignment of the stack by eight bytes so if you think about it when we&#8217;re</p>



<p>programming in assembly for the most part the stack is going in and out of alignment because</p>



<p>every time we modify it by eight bytes it it might line up with a 16 byte alignment or it might not</p>



<p>it&#8217;s just kind of like oscillating right so when I first wrote this solution I wasn&#8217;t doing the</p>



<p>what happened oh actually maybe i guess i don&#8217;t need to jump to the top right now i don&#8217;t need</p>



<p>to finish the loop let&#8217;s see if this prints just one number well let me let me let me see if this</p>



<p>prints one number certainly and if it&#8217;s an okay assembly program just to print one number is it</p>



<p>going to work okay we got to do the done symbol okay so i&#8217;ll show you in a minute why we need</p>



<p>that for stack alignment but i guess i&#8217;ll just finish the loop so demo print loop done so we</p>



<p>just did print loop top and that means we need the bottom and the done so i&#8217;m just going to copy paste</p>



<p>into program here i&#8217;ll just say nada because we&#8217;re not really doing anything and then at the bottom</p>



<p>you know that&#8217;s the epilogue that&#8217;s separate from the the other label so basically now let me finish</p>



<p>know we already know the loops but I&#8217;ll just I&#8217;ll just say it at the bottom of</p>



<p>the loop we do the same thing that we did with the initialization loop we just</p>



<p>increase the running pointer you know we move it along to the next integer and</p>



<p>then we jump to the top of the loop that&#8217;s it and then the done label we</p>



<p>don&#8217;t really do anything we&#8217;re just letting execution drop through down to</p>



<p>that point so that the loop doesn&#8217;t continue so now we should be able to run</p>



<p>the program don&#8217;t get excited oh actually you know what get excited I</p>



<p>was gonna say don&#8217;t get excited because it was gonna totally work now but now</p>



<p>because it was going to totally work now,</p>



<p>but now I think we can just say that it&#8217;s going to crash.</p>



<p>So if I run it, notice how there&#8217;s a segpult.</p>



<p>So the GCC libraries, many functions expect your stack</p>



<p>to be aligned to 16 bytes.</p>



<p>So if you see mysterious crashes</p>



<p>and you are absolutely sure that you&#8217;re not ruining</p>



<p>the stack pointer or ruining something else,</p>



<p>you&#8217;re doing everything correctly,</p>



<p>but the program still crashes, it might be stack alignment.</p>



<p>So one way to get around stack alignment</p>



<p>is just to move the stack pointer.</p>



<p>move the stack pointer like at the top here we could have said oh we&#8217;ve got one two three four</p>



<p>five we&#8217;ve got five pushes and then here we&#8217;re moving the stack by I don&#8217;t know how many other</p>



<p>addresses the stack might be out of alignment somehow so we could add an extra push up here</p>



<p>and then add a corresponding pop down at the bottom like we could easily do this let me just</p>



<p>show you real fast we could push r15 twice for no reason I acknowledge and then at the bottom</p>



<p>and then at the bottom we pop R15 twice,</p>



<p>that would change the alignment because that&#8217;s one more 8 byte push.</p>



<p>But in my case, and actually that would be a little bit smarter</p>



<p>because if you have our loop where it&#8217;s constantly calling on printf,</p>



<p>this is a lot of hits to memory, right?</p>



<p>This is like 100 hits to memory because every single time we do a push-pop pair</p>



<p>around a call to printf, we&#8217;re like touching memory.</p>



<p>Whereas if I did it at the beginning and the end,</p>



<p>Maybe I should just do it this way.</p>



<p>I want to do it both ways so you understand, but it&#8217;s more efficient, I think, if we do</p>



<p>it this way.</p>



<p>Anyway, so we&#8217;ll do pop twice at the bottom and then push twice at the top.</p>



<p>And so then we don&#8217;t really need to surround it with a push-pop pair.</p>



<p>I think I haven&#8217;t tested this.</p>



<p>We&#8217;ll hope now that the stack is in alignment at all times in our functions so that it doesn&#8217;t</p>



<p>crash.</p>



<p>Yeah, so now see how the program works.</p>



<p>So I&#8217;m going to do it the other way now, which is the less efficient way, because here</p>



<p>now which is the less efficient way because here we just have one extra push</p>



<p>pop pair but if we do it the other way it&#8217;ll still work but we&#8217;ll be hitting</p>



<p>memory much more often so I&#8217;m just gonna do it this way just to show you you can</p>



<p>surround any call because sometimes in your programs you might have the stack</p>



<p>like you know modified throughout the function many different times so it</p>



<p>wouldn&#8217;t make too much sense for you to add an extra push pop pair in the prologue</p>



<p>and epilogue because that might not solve it for all of your calls to all of</p>



<p>to all of your seed library functions.</p>



<p>So in that case,</p>



<p>where you can&#8217;t really predict the stack well enough,</p>



<p>you can just surround your call with a push-pop pair.</p>



<p>It hits memory more, but it&#8217;ll work.</p>



<p>So this is basically, you can imagine,</p>



<p>by the time we get to line 139,</p>



<p>the stack is out of alignment.</p>



<p>So I just do a push that puts it into alignment.</p>



<p>And then after the call comes back,</p>



<p>I just pop it so it&#8217;s back out of alignment again,</p>



<p>but I don&#8217;t have extra erroneous data sitting on the stack.</p>



<p>Because if I only had push and not pop,</p>



<p>then it&#8217;s going to push it more and more out of alignment.</p>



<p>It&#8217;s going to push it in and out and in and out,</p>



<p>but it&#8217;s going to add a bunch of junk data to the stack</p>



<p>that I&#8217;ll never recover from.</p>



<p>Or actually, I guess I will recover at the very end</p>



<p>when I restore the stack pointer, but it&#8217;s pointless.</p>



<p>It&#8217;s going to consume too much memory.</p>



<p>What if I was writing like a billion</p>



<p>or like a million items on the stack, right?</p>



<p>a billion iterations of the loop would probably be a bad idea to start adding onto the stack</p>



<p>we&#8217;ll probably end up stack overflowing probably with far less than a billion items so anyway i&#8217;m</p>



<p>going to surround the call with the push pop pair and then at the bottom we just do the same thing</p>



<p>you know increase the integer and then go to the top and so now we you know you already can see it</p>



<p>it starts off printing well it starts off initializing the array but then the thing that we</p>



<p>can see starts off printing the first integer and then the next iteration of the loop prints the</p>



<p>second integer and the third and the fourth and so forth until we get all the way down just to</p>



<p>prove to you maybe we can increase it by two instead of one each time I&#8217;ll just modify that</p>



<p>Oh no, that&#8217;s the print loop. Let&#8217;s do the init loop.</p>



<p>Init loop bottom.</p>



<p>Oh, right there, when we&#8217;re in the body.</p>



<p>So I&#8217;m just going to increase R15 twice.</p>



<p>Just to show you, you know, we can kind of control what&#8217;s going inside of the local array.</p>



<p>So see how it goes from 7 to 9 to 11 instead of 7, 8, 9.</p>



<p>So I&#8217;m going to take that out and then just show you that we can control</p>



<p>how many integers we have in our local array with just the number of integers.</p>



<p>just the number of integers so I&#8217;m going to change the 50 to a 5 and run it again and you can see</p>



<p>what the dang did I do number of integers is 5 and then it was 50 did I put the stack out of</p>



<p>alignment no I I have a push put pair there number 50 is not hard-coded anywhere anywhere</p>



<p>there. Oh, I have a bug that I can debug. That&#8217;s nice. I guess the bug debugging is not for this</p>



<p>video. I wonder if some other value would work for that. There&#8217;s a number of things that could</p>



<p>be the problem. It could be like stack alignment somehow. It could also be, let&#8217;s see, am I making</p>



<p>any calls here inside of my function demo? I&#8217;m saying sub and LEA and then start and then jump</p>



<p>and start and then jump and increase and jump and then RDI.</p>



<p>Not really doing anything else.</p>



<p>So I don&#8217;t think it&#8217;s stack alignment.</p>



<p>I must have miscalculated somewhere somehow for changing that.</p>



<p>All right.</p>



<p>Well, if I figured it out, then I will release another video.</p>



<p>But basically, this is the idea.</p>



<p>100 works, 50 works.</p>



<p>What about 99?</p>



<p>Would that work?</p>



<p>Save faults on 99.</p>



<p>faults on 99 and then 98. 98 works so like every two seems to work but that is</p>



<p>two quad words or 16 oh right so like a hundred integers if we assume that</p>



<p>that&#8217;s in alignment then 99 would be eight bytes less that we&#8217;re moving the</p>



<p>98, notice how it is okay.</p>



<p>And then 97, it&#8217;s going to segfault again.</p>



<p>Watch.</p>



<p>This is a great stack alignment video, I guess.</p>



<p>96, it won&#8217;t segfault.</p>



<p>So it&#8217;s going in and out of alignment.</p>



<p>I think I figured it out.</p>



<p>So if we use the number 100, it&#8217;s in alignment.</p>



<p>Sorry, it&#8217;s out of alignment.</p>



<p>If we use the number 100, the program works because the number 100 throws it out of alignment.</p>



<p>number 100 throws it out of alignment but then we have this push pop pair here around the call to</p>



<p>printf which puts it back in alignment so if I change the number of integers I&#8217;m actually</p>



<p>changing the number of memory locations that I modify the stack pointer so I have to do it by</p>



<p>twos if I wanted to do 99 here then that means the stack is in alignment by the time I call</p>



<p>by the time I&#8217;m getting ready to call printf which means the push pop pair around it throws</p>



<p>push pop pair around it throws the stack out of alignment so just watch here I&#8217;ll</p>



<p>prove it okay so it&#8217;s sake false I comment that out now it won&#8217;t throw it</p>



<p>out of alignment okay should have known that before I recorded the video it&#8217;s</p>



<p>fun to guess sometimes though you know I get a little nervous oh no my program</p>



<p>broke on camera can I debug it live well I guess I can but kind of slowly</p>



<p>anyway so we I think we&#8217;ve gone over every single part that I wanted to show you</p>



<p>we know how to create a local array on the stack and and therefore you also know how to create like</p>



<p>any other data type on the stack if you want you want to create a long a 64-bit integer</p>



<p>just move it by eight bytes instead of moving it by eight times however many integers we were doing</p>



<p>in this video you want to I don&#8217;t know put a character on the stack you can do that if you</p>



<p>Just, you know, move it by one memory location instead of eight memory locations.</p>



<p>So, you know, one byte instead of eight bytes.</p>



<p>You want to store a short, you know, a two byte integer?</p>



<p>Well, just move it by two bytes instead of eight bytes, right?</p>



<p>So you can do this as many times as you want.</p>



<p>You want to have several local variables?</p>



<p>Just move it one time for every local variable.</p>



<p>Same thing for accessing.</p>



<p>You just have to remember where everything is.</p>



<p>offset of the of the first variable local variable and then the offset of the second</p>



<p>local variable you can store those in globals or store those in registers if you can you just</p>



<p>got to remember somehow where everything starts but it&#8217;s all sitting on the stack if it&#8217;s a local</p>



<p>variable okay I guess that&#8217;s everything that I really have to say I hope you enjoyed this video</p>



<p>I hope you learned a little bit of stuff and had a little bit of fun I&#8217;ll see you in the next video</p>



<p>have a good one</p>



<p>you</p>



<p>Hey everybody, thanks for watching this video again from the bottom of my heart. I really appreciate it</p>



<p>I do hope you did learn something and have some fun</p>



<p>If you could do me a please a small little favor</p>



<p>Could you please subscribe and follow this channel or these videos or whatever it is?</p>



<p>You do on the current social media website that you&#8217;re looking at right now</p>



<p>It would really mean the world to me and it&#8217;ll help make more videos and grow this community</p>



<p>more videos, longer videos, better videos, or just I&#8217;ll be able to keep making videos in general.</p>



<p>So please do me a kindness and subscribe. You know, sometimes I&#8217;m sleeping in the middle of</p>



<p>the night and I just wake up because I know somebody subscribed or followed. It just wakes</p>



<p>me up and I get filled with joy. That&#8217;s exactly what happens every single time. So you could do</p>



<p>it as a nice favor to me or you could troll me if you want to just wake me up in the middle of</p>



<p>the night, just subscribe and then I&#8217;ll just wake up. I promise that&#8217;s what will happen.</p>



<p>Also, if you look at the middle of the screen right now, you should see a QR code which you can scan in order to go to the website</p>



<p>which I think is also named somewhere at the bottom of this video and</p>



<p>It&#8217;ll take you to my main website where you can just kind of like see all the videos</p>



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



<p>If you have a suggestion for</p>



<p>Please leave a comment or if you just want to say hey, what&#8217;s up? What&#8217;s going on?</p>



<p>You know just send me a comment whatever I also wake up for those in the middle of the night</p>



<p>I get I wake up in a cold sweat. I&#8217;m like</p>



<p>It would really it really mean the world to me. I would really appreciate it. So again, thank you so much for watching this video and</p>



<p>Enjoy the cool music as I fade into the darkness, which is coming for us all</p>



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-local-variables-stack-frames-alignment-explained/">x86-64 Assembly: Local Variables, Stack Frames &amp; Alignment Explained</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/x86-64-assembly-local-variables-stack-frames-alignment-explained/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mixed Function Arguments in x86-64 Assembly &#8211; Integers &#038; Floats Explained</title>
		<link>https://www.NeuralLantern.com/mixed-function-arguments-in-x86-64-assembly-integers-floats-explained/</link>
					<comments>https://www.NeuralLantern.com/mixed-function-arguments-in-x86-64-assembly-integers-floats-explained/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 01 Mar 2026 02:14:39 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[abi calling convention]]></category>
		<category><![CDATA[assembly language]]></category>
		<category><![CDATA[Ed Jorgensen]]></category>
		<category><![CDATA[floating point registers]]></category>
		<category><![CDATA[function calling convention]]></category>
		<category><![CDATA[integer float arguments]]></category>
		<category><![CDATA[linux assembly]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[mixed arguments]]></category>
		<category><![CDATA[nasm]]></category>
		<category><![CDATA[rax return]]></category>
		<category><![CDATA[rdi rsi xmm0]]></category>
		<category><![CDATA[system v abi]]></category>
		<category><![CDATA[ubuntu assembly]]></category>
		<category><![CDATA[x86 assembly]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[xmm registers]]></category>
		<category><![CDATA[xmm0 return]]></category>
		<category><![CDATA[yasm]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=310</guid>

					<description><![CDATA[<p>In the System V x86-64 ABI, integer and floating-point arguments use separate register assignment sequences. Integer arguments go into rdi, rsi, rdx, rcx, r8, r9 (then stack), while floating-point arguments use xmm0 through xmm7 independently. This means the first integer you see — even if it appears after several doubles — always goes into rdi, and the second float always goes into xmm1 regardless of how many integers came before it.</p>
<p>The post <a href="https://www.NeuralLantern.com/mixed-function-arguments-in-x86-64-assembly-integers-floats-explained/">Mixed Function Arguments in x86-64 Assembly &#8211; Integers &amp; Floats Explained</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="Mixed Function Arguments in x86-64 Assembly - Integers &amp; Floats Explained" width="1380" height="776" src="https://www.youtube.com/embed/ZAY3srLRx8c?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>Quick guide to passing mixed int + float arguments in x86-64 assembly (System V ABI). See why rdi can still be the first integer after several doubles, why xmm registers count separately, and how return values switch between rax and xmm0. Perfect for YASM/NASM programmers interfacing with C/C++.</p>



<p>Intro to Mixed Arguments 00:00<br>Simple Integer-Only Functions 00:46<br>Adding Arguments and Return Values 01:01<br>Integer Arguments in RDI and RSI 01:30<br>Pointers Treated as Integers 02:06<br>Introducing Floating-Point Returns 02:31<br>Returning Double in XMM0 03:06<br>First Float Argument in XMM0 03:36<br>Float Registers Count Separately 04:03<br>Integer Register Order Explained 04:16<br>Separate Counting for Integers and Floats 05:21<br>RSI as First Integer After Float 05:38<br>Reference to Ed Jorgensen&#8217;s Book 07:00<br>Callee-Saved Registers Overview 07:56<br>Complex Mixed Argument Examples 09:48<br>Inserting Integer Among Floats 10:57<br>Skipping Float Registers on Integer 11:18<br>Calling C from Assembly Notes 11:56<br>Name Mangling Reminder 12:21<br>Closing Remarks and Thanks 12:30<br>Call to Subscribe and Support 13:04<br>Website and QR Code Mention 13:38<br>Final Thanks and Outro Music 14:19</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>Hey everybody! In this video I&#8217;m going to talk to you a little bit about using functions with</p>



<p>mixed arguments in a YASM x86-64 assembly language program. Although this</p>



<p>video will probably still be useful to you if you&#8217;re using NASM or MASM because the</p>



<p>mixed arguments and their order and how they work is governed by the ABI which is a system</p>



<p>so what the heck am i talking about okay so the first thing that i want to show you is uh</p>



<p>imagine we have a function here let&#8217;s say void f this function doesn&#8217;t take any arguments and it</p>



<p>doesn&#8217;t return anything congratulations you&#8217;re done that was the easiest thing that you&#8217;ve ever</p>



<p>done in your entire life but as soon as you start adding arguments to it you have to uh</p>



<p>start understanding how to uh how to call registers and stuff so imagine we have like a</p>



<p>a long a and a long b so we give it two arguments and maybe we want it to return a long</p>



<p>this is kind of like level one of writing functions in assembly right we just have</p>



<p>a bunch of integers and we realize okay um this long the return value is going to come to the</p>



<p>Maybe I&#8217;ll do a comment up here, we&#8217;ll do rax, we&#8217;ll say the long is actually coming</p>



<p>back to the user in rax and the long is coming into the function with rdi, the long a and</p>



<p>the long b is coming into the function with rsi.</p>



<p>So if you understand this then you can write a function in assembly where basically you</p>



<p>two incoming integer arguments and then you return to the caller a long value using rax</p>



<p>keep in mind also that if this second argument was a pointer long pointer then it would be the</p>



<p>same thing rsi because pointers are integers they&#8217;re 64-bit unsigned integers even if the</p>



<p>pointer was not to a long even if the pointer was to a double or a character or whatever it would</p>



<p>pointers are integers. It starts getting a little bit more complicated when you want to mix between</p>



<p>floats and numeric arguments. So what I&#8217;ve been saying so far, it&#8217;s all just integers.</p>



<p>Even if we&#8217;re mixing pointers with regular longs, it&#8217;s just, you know, they&#8217;re all longs basically,</p>



<p>right? So, but as soon as we start introducing floats, then things get a little bit more</p>



<p>complicated. So for starters, what if we did a function that was, that returned a double?</p>



<p>that returned a double. So let&#8217;s say we have a function G and it returns a double. Maybe it</p>



<p>still takes in a long and a double pointer. If it returns a double, let&#8217;s see, is this still</p>



<p>lining up? I don&#8217;t think it&#8217;s lining up anymore. There we go. If it&#8217;s returning a double, then</p>



<p>that means we have to return to the caller with the XMM0 register. So XMM0 is always designated as</p>



<p>the well the first float argument but also the float return value so keep in</p>



<p>mind if I&#8217;m returning a double to the caller I&#8217;m not going to use our a X at</p>



<p>all I&#8217;m just going to use XMM zero load it up with the return value and then</p>



<p>return to the caller and that&#8217;s it if I wanted to do another function let&#8217;s say</p>



<p>hmm how about H and then we&#8217;ll say I don&#8217;t know maybe the first argument is a</p>



<p>argument is a float we call it a double a that means rdi is not going to be the argument that</p>



<p>or the register that we look at to see our incoming double it has to be a float register</p>



<p>xmm0 is the float register that we look at for the first argument the float registers are really</p>



<p>easy you just kind of go in order like xmm0 is the first argument xmm1 is the next argument xmm2</p>



<p>the general purpose uh integer registers they&#8217;re a little more complicated you have to remember</p>



<p>their their labels uh you know like the letters have an ordering to it uh suppose for the sake</p>



<p>of argument that we&#8217;re going to return a double from this also uh in that case let&#8217;s see did i</p>



<p>just mess the formatting up again i think that&#8217;s okay um again we&#8217;re going to return xmm0</p>



<p>notice how we&#8217;re returning xmm0 oh that&#8217;s why i spaced it forward notice how we are</p>



<p>forward notice how we are returning xmm0 and we&#8217;re also taking xmm0 these float registers tend to be</p>



<p>reused all over the place none of them are designated as callee saved within the abi</p>



<p>so you always have to stash their values somewhere if you&#8217;re ever going to make a function call or</p>



<p>anything or a system call the other thing to keep in mind is notice how rsi i still have rsi there</p>



<p>for the second incoming argument you would imagine that rsi is supposed to be the second argument</p>



<p>supposed to be the second argument even if it uh you know comes after a double but that&#8217;s not</p>



<p>actually true because the the order i guess like the the ordering of the uh of the registers they</p>



<p>only count against their own class like the float registers the float arguments they only count</p>



<p>against the position of the float and the uh of the float registers and and and the general purpose</p>



<p>they only count against themselves.</p>



<p>What I&#8217;m trying to say is that RSI is the second integer argument,</p>



<p>but if you look at the signature, we only have one integer argument, right?</p>



<p>So RSI is not the second integer argument.</p>



<p>It&#8217;s actually the first integer argument.</p>



<p>So I&#8217;m going to put an RDI there.</p>



<p>You probably can infer that the second float argument should be XMM1 at this point, I hope.</p>



<p>and that&#8217;s true if we just say that there&#8217;s going to be another double</p>



<p>that this function takes then it&#8217;s going to be xmm1</p>



<p>not xmm2 because if you&#8217;re just counting the arguments</p>



<p>and you&#8217;re sort of grouping the integers with the floats together</p>



<p>you might think well first argument is xmm0 second argument would have been xmm1</p>



<p>third argument would have been xmm2 therefore if I see</p>



<p>a float coming into the third argument position it&#8217;ll be xmm2</p>



<p>No, the integers don&#8217;t count against the floats and the floats don&#8217;t count against the integers.</p>



<p>That&#8217;s why RDI is the first argument for integers, even though it&#8217;s in the second position,</p>



<p>it&#8217;s still the first integer that we see.</p>



<p>And XMM1 is the second float argument that we see.</p>



<p>That&#8217;s why it&#8217;s XMM1 instead of XMM2, because we&#8217;re looking at it in the third position.</p>



<p>So you&#8217;re not really looking at, whoops, you&#8217;re not looking at overall position.</p>



<p>at position only counting that type of register let me pull open my favorite book to get a little</p>



<p>bit more clarity on this um this book is written by a wonderful professor dr ed jorgensen phd</p>



<p>this book i did not write it ed jorgensen wrote this book it&#8217;s called x86 64 assembly language</p>



<p>programming with ubuntu this book can turn you into an expert with yasm assembly so uh</p>



<p>I recommend everybody grab a copy. It&#8217;s also free and it&#8217;s got a copy left license.</p>



<p>You can see like the license here. But anyway, I wanted to open up this book real fast</p>



<p>just to show you the registers. Okay. I&#8217;m going to search for Kali saved so I don&#8217;t have to fumble</p>



<p>around the book too long. Kali saved and that brings us to section 12.8.2 register usage.</p>



<p>let&#8217;s see callee saved you&#8217;ll see rbx is callee saved rbp is callee saved probably shouldn&#8217;t</p>



<p>mess with that one too much r12 13 14 15 all callee saved there&#8217;s a couple temporary registers</p>



<p>but if you look carefully rdi is designated as the first argument but it should say really</p>



<p>the first integer argument so rdi is the first integer argument that we see that&#8217;s why</p>



<p>argument that we see that&#8217;s why in all of these examples the first integer argument that we</p>



<p>actually see is rdi so like for function f long a that was the first integer argument</p>



<p>and then in the function g it&#8217;s also the first integer argument and then in function h rdi is</p>



<p>the double pointer b because that is the first integer argument that we actually see</p>



<p>so keep that in mind you would just repeat that pattern you know the second integer argument you</p>



<p>second integer argument you see that&#8217;s RSI. That&#8217;s why RSI is the pointer here because</p>



<p>pointers are integers and the pointer here and we don&#8217;t have anything else but if I guess if we</p>



<p>added another you know let&#8217;s say a long D then it would be RSI right there. Hopefully that makes</p>



<p>sense and you can you can carry this logic forward for the first argument the second argument the</p>



<p>and then R8 for the fifth argument R9 for the sixth argument and then you can</p>



<p>look for further arguments on the stack if you need more than that but basically</p>



<p>that&#8217;s how you count them up and then the float registers are just a lot</p>



<p>easier they always start at zero and they go all the way up to 15 and so I</p>



<p>don&#8217;t know maybe I should just copy paste well maybe I&#8217;ll start it from</p>



<p>scratch we&#8217;ll say dub no let&#8217;s let&#8217;s mix it up a little bit more we&#8217;ll say long</p>



<p>And the long is going to be returned with the RAX.</p>



<p>And I guess I have to space this forward a little bit.</p>



<p>And then if we have a bunch of floats, say double A.</p>



<p>Can I maybe just copy paste this a little bit so I don&#8217;t have to do so much typing?</p>



<p>Okay, so we&#8217;ll do double A, double B, double C, double D, double E.</p>



<p>and then this is going to be xmm zero why did i put the extra comment there i don&#8217;t know</p>



<p>and then we&#8217;re going to have xmm one and then we&#8217;re going to have xmm two xmm three and so forth</p>



<p>and just to make sure you&#8217;re paying attention ask yourself this real fast if i were to insert</p>



<p>z what register would we use for that would it be the one two three four five the fifth argument</p>



<p>would it be uh would it be r8 or would it be something else hopefully you understand now</p>



<p>let&#8217;s say we do a character pointer that it would be rdi because that&#8217;s the first integer argument</p>



<p>that we actually see all right and then you know to return we would return in rax and then the</p>



<p>return in RAX and then the floats just keep counting notice how it skipped from XMM2 or it</p>



<p>went from XMM2 to XMM3 even though we crossed over an integer argument in between because the</p>



<p>float arguments don&#8217;t count against the integers and the ints don&#8217;t count against the floats</p>



<p>let&#8217;s see I think</p>



<p>well if you want you can look at section 18.2 which just sort of talks about the floating</p>



<p>which just sort of talks about the floating point registers we have 0 through 15 but I don&#8217;t think</p>



<p>we really need to do that here I think we pretty much have everything we need to know to to call</p>



<p>on functions with mixed arguments and to have a function within assembly that supports mixed</p>



<p>arguments so again if your C or C++ modules are expecting some kind of signature like this now you</p>



<p>know how to calculate what registers they&#8217;re actually going to populate by the time execution</p>



<p>execution jumps into your assembly function.</p>



<p>And if you want to call a C or a C++ function from assembly,</p>



<p>now you know which registers to populate so that the the other function that</p>



<p>you&#8217;re calling can receive the right data from you.</p>



<p>Don&#8217;t forget about name mangling, which I talked about in another video.</p>



<p>Okay, I think that&#8217;s all I really have to say.</p>



<p>This video was pretty short.</p>



<p>Thank you so much for watching.</p>



<p>I hope you learned a little bit of stuff and had a little bit of fun.</p>



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



<p>make more videos and grow this community so we&#8217;ll be able to do more videos longer videos better</p>



<p>videos or just i&#8217;ll be able to keep making videos in general so please do do me a kindness and uh</p>



<p>and subscribe you know sometimes i&#8217;m sleeping in the middle of the night and i just wake up because</p>



<p>i know somebody subscribed or followed it just wakes me up and i get filled with joy that&#8217;s</p>



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



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



<p>and then I&#8217;ll just wake up. I promise that&#8217;s what will happen. Also, if you look at the middle of</p>



<p>the screen right now, you should see a QR code, which you can scan in order to go to the website,</p>



<p>which I think is also named somewhere at the bottom of this video. And it&#8217;ll take you to my</p>



<p>main website where you can just kind of like see all the videos I published and the services and</p>



<p>tutorials and things that I offer and all that good stuff. And if you have a suggestion for</p>



<p>clarifications or errata or just future videos that you want to see please leave a comment or</p>



<p>if you just want to say hey what&#8217;s up what&#8217;s going on you know just send me a comment whatever i also</p>



<p>wake up for those in the middle of the night i get i wake up in a cold sweat and i&#8217;m like it would</p>



<p>really it really mean the world to me i would really appreciate it so again thank you so much</p>



<p>for watching this video and um enjoy the cool music as as i fade into the darkness which is</p>



<p>for us all.</p>



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/mixed-function-arguments-in-x86-64-assembly-integers-floats-explained/">Mixed Function Arguments in x86-64 Assembly &#8211; Integers &amp; Floats Explained</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/mixed-function-arguments-in-x86-64-assembly-integers-floats-explained/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>x86-64 Assembly Pointers &#038; Dereferencing Explained &#8211; Hybrid C++/YASM Example</title>
		<link>https://www.NeuralLantern.com/x86-64-assembly-pointers-dereferencing-explained-hybrid-c-yasm-example/</link>
					<comments>https://www.NeuralLantern.com/x86-64-assembly-pointers-dereferencing-explained-hybrid-c-yasm-example/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 22 Feb 2026 03:21:32 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[assembly C++ interop]]></category>
		<category><![CDATA[assembly data section]]></category>
		<category><![CDATA[assembly memory addresses]]></category>
		<category><![CDATA[assembly pointers]]></category>
		<category><![CDATA[assembly tutorial]]></category>
		<category><![CDATA[dereferencing assembly]]></category>
		<category><![CDATA[extern C assembly]]></category>
		<category><![CDATA[hybrid C++ assembly]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[passing pointers assembly]]></category>
		<category><![CDATA[stack alignment assembly]]></category>
		<category><![CDATA[systems programming]]></category>
		<category><![CDATA[x86 assembly tutorial]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[x86-64 calling convention]]></category>
		<category><![CDATA[x86-64 pointers]]></category>
		<category><![CDATA[Yasm assembly]]></category>
		<category><![CDATA[Yasm tutorial]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=305</guid>

					<description><![CDATA[<p>This video explains pointers and dereferencing in x86-64 YASM assembly and demonstrates passing pointers between assembly and C++ in a hybrid program. We show how to read a C string from assembly, modify a long via pointer dereference so the change is visible in C++, and send assembly-owned data (string, long, double) back to C++ using pointers.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-pointers-dereferencing-explained-hybrid-c-yasm-example/">x86-64 Assembly Pointers &amp; Dereferencing Explained &#8211; Hybrid C++/YASM Example</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="x86-64 Assembly Pointers &amp; Dereferencing Explained - Hybrid C++/YASM Example" width="1380" height="776" src="https://www.youtube.com/embed/jzj0iqC-XJI?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>Learn pointers &amp; dereferencing in x86-64 YASM assembly and how to pass them correctly between assembly and C++ in a hybrid program. We build a small working example that sends strings, longs, and doubles both directions using pointers, modifies values across module boundaries, and explains why pointer-to-double still uses general-purpose registers. Includes a quick demo of stack misalignment crash + fix.</p>



<p>Great for assembly beginners moving to real programs, systems programming students, or anyone curious how low-level code talks to C/C++.</p>



<p>00:00 Introduction to Pointers and Dereferencing in x86-64 Assembly<br>00:28 Pointers explained in C++<br>01:02 Changing values via pointers in C++<br>01:43 Pointers in assembly basics<br>02:09 Defining variables and pointers in YASM data section<br>03:23 Pointers are always integers even to doubles<br>04:20 Function arguments are pointers treated as 64-bit integers<br>05:00 Driver C++ code overview<br>05:58 Marking extern &#8220;C&#8221; functions<br>06:40 Local stack variables and passing pointers<br>07:51 Stack lifetime warning<br>08:34 Assembly data section strings and numbers<br>09:39 Print null-terminated string helper functions<br>10:38 External symbols and hey_driver_print_this<br>11:29 Point function prologue and stack alignment<br>13:04 Extra push for 16-byte alignment<br>14:20 Printing welcome message from assembly<br>16:00 Driver sees initial long value<br>16:58 Printing received string from C++<br>18:20 Using received char pointer without dereference<br>20:21 Modifying incoming long via dereference<br>21:46 Driver sees modified long value 101<br>22:43 Calling back to C++ to print assembly-owned data<br>23:48 Passing pointers to assembly string long and double<br>25:08 Driver prints assembly-owned values and addresses<br>26:14 Summary of pointer passing between modules<br>26:36 Stack alignment crash demonstration<br>27:39 Adding extra push/pop fixes segfault<br>28:00 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 Blog: https://www.NeuralLantern.com</li>



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



<p>Hey there! In this video we&#8217;re going to talk about pointers and dereferencing in a YASM x8664</p>



<p>assembly program, also as a hybrid program so that assembly and C++ can talk to each other</p>



<p>and send each other pointers and send each other data and things like that.</p>



<p>for what pointers are.</p>



<p>I&#8217;m going to write in C++ for a second.</p>



<p>Suppose you have a pointer for an integer.</p>



<p>We&#8217;ll call it P.</p>



<p>Suppose you have an integer by itself.</p>



<p>We&#8217;ll call it A.</p>



<p>Let&#8217;s say that the value of A is 5.</p>



<p>And if you wanted to say that P points to A,</p>



<p>you could say P equals the address of A.</p>



<p>I&#8217;ll put C++ at the top here.</p>



<p>And so now if I set A to 6</p>



<p>then I print P a dereference of P this is not like a full pointers tutorial</p>



<p>but basically by changing a I&#8217;m changing what P thinks it sees as a value</p>



<p>assuming ID reference it I could also let me do a print 6 here I could also</p>



<p>just change the value through P I could say dereference P and I could say equals</p>



<p>would actually print a seven right so you know you can have regular variables global variables</p>



<p>whatever kind of you know memory stuff on the stack and to get a pointer to it you really just</p>



<p>need to get its memory location in c++ it&#8217;s kind of easy syntactically you can see what&#8217;s happening</p>



<p>in assembly you really just need the memory location stored somewhere you could store that</p>



<p>variable that just simply stored the memory location of some other variable.</p>



<p>You could have a 64-bit register store the value of a variable.</p>



<p>Let&#8217;s say we have like a, I don&#8217;t know, my whatever, my number let&#8217;s say inside of assembly.</p>



<p>I&#8217;ll do ASM here and we say it&#8217;s a quad word and it starts off as this number or whatever.</p>



<p>So if you haven&#8217;t seen my previous videos, go see them for the basics of assembly and</p>



<p>of assembly and linking and make files and all that stuff but you know if you</p>



<p>have an assembly program and you have a data section and you define a global</p>



<p>variable like this what you&#8217;re basically saying is I want to take this giant</p>



<p>number and I want to write it into eight bytes that&#8217;s the DQ it says data quad</p>



<p>word I want to write that giant number across eight bytes and then I want to</p>



<p>get a pointer to it stored in the my number symbol so my number is not</p>



<p>actually the value it&#8217;s a pointer to the value so you know later if you want to</p>



<p>you know later if you want to move you know something into a register if you did this</p>



<p>that would move the pointer into rax but if you did this</p>



<p>with deref symbols after it or around it then you would move</p>



<p>maybe i&#8217;ll put that into rex you&#8217;d move that actual number that we specified into rex</p>



<p>into Rx. It&#8217;s important to understand also that pointers are integers even when we&#8217;re pointing to</p>



<p>doubles. So for example sometimes people make this mistake they&#8217;ll say you know my double</p>



<p>and they&#8217;ll say it&#8217;s a quad word meaning this is going to be a 64-bit double precision floating</p>



<p>point number and they&#8217;ll do like 44.55 or whatever. So that is a double and it is in memory</p>



<p>you know what is the symbol of my double remember it&#8217;s supposed to be just a</p>



<p>pointer right it can&#8217;t be an actual double because a memory location is not</p>



<p>a double a memory location is an integer so that means if you wanted to move a</p>



<p>pointer into a register you would only be able to move the pointer into a</p>



<p>regular general purpose register not a floating point register and you should</p>



<p>use the regular movement instructions for just regular general purpose</p>



<p>So keep that in mind if you see a signature like this like let&#8217;s say function F and we have</p>



<p>You know, let&#8217;s say long a and long B and actually let&#8217;s do pointers</p>



<p>Let&#8217;s say long pointer a and long pointer</p>



<p>B and double pointer C all three of those arguments are actually 64 bit integers</p>



<p>Because they&#8217;re all pointers even if one of the pointers points to adult a double</p>



<p>double why did I say dull pointers aren&#8217;t dull they&#8217;re exciting okay so I&#8217;m gonna open up some</p>



<p>code here real fast so usually I don&#8217;t explain my uh my driver I&#8217;m gonna explain it to you this time</p>



<p>because it&#8217;s kind of doing a little bit more than my other videos um again if you don&#8217;t have uh the</p>



<p>knowledge of how to make a make file see my other videos because that&#8217;s explained there for now I&#8217;m</p>



<p>what we really need to do is write a driver and an assembly module for a</p>



<p>hybrid program again hybrid programs covered in other videos so the driver is</p>



<p>pretty easy I&#8217;m just going to copy paste it honestly here and then just kind of</p>



<p>explain it to you the driver is pretty easy we&#8217;re going to do I O stream so we</p>



<p>can print stuff we&#8217;re going to mark an external function called point as extern</p>



<p>C so that just disables name mangling which means the C++ module will be able</p>



<p>will be able to call on this function called point and it won&#8217;t expect that</p>



<p>the point function has its name mangled like C++ does the reason being is that</p>



<p>point is actually going to be in a side it&#8217;s going to be inside assembly where</p>



<p>its name will not be mangled this disables the ability to overload but</p>



<p>that&#8217;s okay we don&#8217;t care it&#8217;s going to take two pointers a pointer to a character</p>



<p>and a pointer to a long since both of those are pointers they&#8217;re both</p>



<p>64-bit integers even the character pointer and then we have a function that is internal to this</p>



<p>module called hey driver print this remember we&#8217;re inside of the driver program right now</p>



<p>so if you look at the bottom it&#8217;s just a function that takes in some pointers</p>



<p>and then prints some stuff so it&#8217;s going to print like it&#8217;s going to print what the string is</p>



<p>it&#8217;s going to print what the long is my dog&#8217;s growling at me i&#8217;m going to ignore him because</p>



<p>i literally just let him pee and poop at this point now he&#8217;s harassing me for treats</p>



<p>now he&#8217;s harassing me for treats he always does this okay so uh the string the long the double</p>



<p>this function expects to receive three pointers to different data types it&#8217;s just going to print</p>



<p>all of them and the point get it the point of this function is we&#8217;re going to go inside of</p>



<p>the assembly module and then have the assembly module call on this function so that we can we</p>



<p>can prove that we can have stuff sent from assembly to c plus plus or c using pointers</p>



<p>using pointers we can have data sent over so anyway that&#8217;s why both of these</p>



<p>are in here the point needs to be marked as no name mangling because point is</p>



<p>inside of assembly which will not name mangle and then hey driver print this</p>



<p>that needs to have name mangling disabled also so that the assembly</p>



<p>module can call on this other than that we&#8217;re just basically inside of a main</p>



<p>saying hey this is the c string we&#8217;re making a c string inside of the main function notice how</p>



<p>this is a local variable so that c string is going to show up on the stack it&#8217;s going to show up in</p>



<p>the area that is owned by main for main stack area same thing for my long that&#8217;s a local variable on</p>



<p>the stack um and but then we can actually send pointers to those pieces of data to another</p>



<p>function in another module you don&#8217;t have to only transport globals or stuff on the heap</p>



<p>or stuff on the heap, you can transport pointers to local variables. Just make sure that by the</p>



<p>time this function finishes, then nowhere else is actually using that data because,</p>



<p>well, being on the stack, once main function or once any function finishes, then its portion of</p>



<p>the stack will be cleaned up and removed and it&#8217;ll be junk data. You&#8217;ll probably get a seg fault.</p>



<p>But for now, we&#8217;re not going to use anything on the stack. We&#8217;re not going to use these local</p>



<p>just going to use them quickly on this call to point and then we&#8217;re going to return to the</p>



<p>operating system and finish the program. So that&#8217;s the driver. Now the hard part. Let&#8217;s do this in</p>



<p>assembly. So for starters, I&#8217;m going to make a data section and just explain it to you very,</p>



<p>very quickly. Again, if you don&#8217;t understand the basics of YASM x86-64 assembly, did I mention</p>



<p>that that&#8217;s what this language is at the beginning of the video? I guess I should put that in the</p>



<p>put that in the description or record an announcement that I can tack on at the beginning</p>



<p>or something. Anyway, so if you don&#8217;t understand how to do this, see my other videos, but basically</p>



<p>we&#8217;re going to make a data section. We&#8217;re going to define some strings. Here&#8217;s like an announcement.</p>



<p>Oh, we&#8217;re inside of, you know, the module now, the assembly module. And now we&#8217;re going to print</p>



<p>the received string. And then we&#8217;re going to make a string that is owned by assembly, which we can</p>



<p>into C++ when we call the function inside of the driver.</p>



<p>So this string is owned by the assembly module.</p>



<p>Notice how these are null terminated strings.</p>



<p>I just have like a comma zero there,</p>



<p>which means I have some extra functions</p>



<p>I&#8217;m gonna paste in that we&#8217;re not really gonna talk about</p>



<p>because they&#8217;ve been discussed in other videos</p>



<p>just so that we can print null terminated strings.</p>



<p>Then I&#8217;ve got a new line here,</p>



<p>you know, carriage return line feed.</p>



<p>And then I&#8217;ve just got some numbers</p>



<p>that are owned by the assembly module.</p>



<p>Then I&#8217;ve got a system write call,</p>



<p>call code one for the system call writes and file descriptor standard output so I</p>



<p>can print just to the terminal again if you don&#8217;t understand this see my other</p>



<p>videos so now let&#8217;s start the actual text section so this is where our</p>



<p>instructions start so we got the text section here and we&#8217;re going to use some</p>



<p>external symbols don&#8217;t worry about these I&#8217;m just using my own little library to</p>



<p>and input integers if you have access to this library use it if you don&#8217;t if you&#8217;re watching</p>



<p>at home and you don&#8217;t have this library then that&#8217;s fine you can use you know printf or</p>



<p>scanf or something like that to get and print floats from and to the user</p>



<p>but yeah I&#8217;m just using that and then I&#8217;m marking an external function here called hey driver print</p>



<p>this if you recall the driver module has a function called hey driver print this so</p>



<p>just allows my assembly code to call on that external function. Okay now next</p>



<p>piece of code. This is going to be… actually I&#8217;m going to paste the print</p>



<p>null terminated string function and related code because it&#8217;s just like a</p>



<p>big giant mess and we&#8217;re mostly going to ignore it. So just to show you what I&#8217;m</p>



<p>doing here I have a function called print null terminated string so that I</p>



<p>can print these strings up here and then I have it rely on a function called</p>



<p>string length that I have implemented up here and all it does is just</p>



<p>implemented up here and all it does just calculates the length of the string and</p>



<p>then a crlf function so I can just call that so that&#8217;s all explained in other</p>



<p>videos don&#8217;t worry about it for now we&#8217;re going to start the actual entry</p>



<p>point remember the driver was just gonna call point right so now we just have to</p>



<p>implement point in the assembly module so that&#8217;s gonna be like down here our</p>



<p>our entry point so the signature for this function is going to be character</p>



<p>pointer and then a long pointer and it doesn&#8217;t return anything and remember</p>



<p>that if we look back at the driver that should match the signature right it&#8217;s a</p>



<p>character pointer and a long pointer and of course this is just a comment that</p>



<p>reminds me of what to do in assembly you don&#8217;t really have a signature you just</p>



<p>sort of use registers but I&#8217;m reminding myself that RDI is going to be a</p>



<p>character pointer and RSI is going to be a long pointer.</p>



<p>Here&#8217;s a note to myself that I&#8217;m going to use R12 and R13, which means</p>



<p>the first thing that I should do, well actually before I even do that, I should</p>



<p>return from this function because it is a function. I marked it as global</p>



<p>so that the other module could call it, the driver module could call it. Again,</p>



<p>see my other videos for hybrid programs.</p>



<p>But so now the, you know, if the driver calls this function, then now we&#8217;re inside of</p>



<p>and there&#8217;s a return statement so it&#8217;s a valid function I should preserve the</p>



<p>registers that I&#8217;m going to use that are marked as Kali saved for the ABI so I&#8217;m</p>



<p>going to go prologue and then an epilogue and I&#8217;m going to say push r12 and push</p>



<p>r13 and then I&#8217;m going to pop r13 pop r12 they should be in reverse order if</p>



<p>you&#8217;ve seen my other videos you&#8217;ll know this and the the thing about this</p>



<p>the thing about this particular program is we&#8217;re going to run into stack alignment issues</p>



<p>so uh if you don&#8217;t know about stack alignment and how it can crash your program without you</p>



<p>realizing what&#8217;s wrong see my other videos but for now we&#8217;ll assume you know that and uh i i</p>



<p>already know from running this program in advance that it&#8217;s going to be out of alignment by eight</p>



<p>bytes so i&#8217;m just going to push an extra register onto the stack and that&#8217;s going to put it back</p>



<p>I know it looks weird, but this is going to work.</p>



<p>Let me get rid of this here.</p>



<p>Okay, so.</p>



<p>And then maybe if I can remember at the end of the video,</p>



<p>I can just remove that extra push-pop pair,</p>



<p>and you&#8217;ll see the program starts crashing.</p>



<p>But at home, you can do it just to double check.</p>



<p>So the first thing I really want to do is,</p>



<p>after I push and pop,</p>



<p>is save our incoming arguments.</p>



<p>Remember, the first integer argument</p>



<p>and the second integer argument,</p>



<p>argument they come in as RDI and RSI in assembly per the ABI if both of these</p>



<p>things are pointers it doesn&#8217;t matter what the data type is it could be</p>



<p>pointing to anything including a double and these would still be considered</p>



<p>integer arguments because well RDI and RSI are just going to be loaded up with</p>



<p>memory locations which which are integers so I&#8217;m going to save our</p>



<p>arguments to R12 and R13 now justifying our push and pop pair then I&#8217;m going to</p>



<p>little welcome message so print a little welcome message again you don&#8217;t need to know about this</p>



<p>function but it&#8217;s explained in other videos that I&#8217;ve already published we&#8217;re going to print our</p>



<p>hello beginning message I&#8217;m getting nervous he needs to take a second poop sometimes it&#8217;s poopoo</p>



<p>number two time for him and he&#8217;s not really just lying about a treat but he did go pee and poop</p>



<p>But he did go pee and poop already.</p>



<p>Okay, he just left and walked away.</p>



<p>Okay, if he comes back, I&#8217;m letting him out this time.</p>



<p>I&#8217;ll pause the video if he does it again.</p>



<p>Okay, I&#8217;m pausing the video.</p>



<p>No pee lied.</p>



<p>He went outside, lifted up his little leg, and a couple of drops of pee came out.</p>



<p>Now he&#8217;s staring at me like he deserves a treat.</p>



<p>Sorry, buddy.</p>



<p>I wish I could eat constantly all day long, too.</p>



<p>But life isn&#8217;t always fair.</p>



<p>isn&#8217;t always fair anyway let&#8217;s see I might even lined up on the camera</p>



<p>anymore I don&#8217;t even know so we&#8217;re looking at this code here is going to</p>



<p>print a welcome message let&#8217;s see if that actually works so I&#8217;m gonna do make</p>



<p>run again make files are whoops what did I do loader dot asm what did I do what</p>



<p>did I do I somehow copy pasted the wrong make file</p>



<p>What&#8217;s the name of my source code file?</p>



<p>It&#8217;s point.</p>



<p>I guess I&#8217;ll just change it, and then it&#8217;ll probably work.</p>



<p>It&#8217;s still in assembly module.</p>



<p>Hopefully that didn&#8217;t mess it up too bad by copy-pasting the wrong source code.</p>



<p>Okay.</p>



<p>What is going on here?</p>



<p>Floater.</p>



<p>Oh, I need to change that.</p>



<p>Hang on.</p>



<p>Let me fix this.</p>



<p>I don&#8217;t know if I&#8217;m going to edit this out.</p>



<p>out. It&#8217;s fun to watch me struggle sometimes. There we go.</p>



<p>Point.</p>



<p>Alright, let&#8217;s give it another try.</p>



<p>Oh no, star dot so no such file a directory. Dang it.</p>



<p>Okay, now this seems to work. I may or may not have edited</p>



<p>that out. I copy pasted the wrong source code into my make</p>



<p>file. So I had to manually adjust it. Then I forgot to</p>



<p>copy paste my library file into the build directory. So I had</p>



<p>The driver sees my long as whatever.</p>



<p>What&#8217;s going on?</p>



<p>Print an alternate string begin.</p>



<p>Oh, the driver is printing a bunch of stuff.</p>



<p>Okay.</p>



<p>I started to think, why does it look like the program has a lot of stuff going on?</p>



<p>Oh, that&#8217;s the driver.</p>



<p>Okay.</p>



<p>So the driver says it sees its long as 100.</p>



<p>And then now we&#8217;re inside of the point module.</p>



<p>So that&#8217;s the only thing we&#8217;ve done in assembly so far.</p>



<p>so far then the driver has regained control maybe I should add a couple of</p>



<p>new lines in there so I don&#8217;t get confused again we will do a C out and L</p>



<p>and we&#8217;ll do two of those run the program again and then I won&#8217;t get</p>



<p>confused about the messages okay so now we&#8217;re inside of the point module and</p>



<p>nothing is happening so points let me get rid of the make file here and</p>



<p>and we&#8217;re just printing a welcome message nothing else so now let&#8217;s print</p>



<p>the received string so what am I talking about so we&#8217;re gonna print a prefix</p>



<p>basically saying hey we received the following string right so if you look at</p>



<p>the symbol message received string it&#8217;s just gonna say we&#8217;re now printing the</p>



<p>received string and then it&#8217;ll print it so what are we actually printing we&#8217;re</p>



<p>What is R12? R12 is a character pointer to the print me string. And so basically this</p>



<p>function print null terminated string, it takes a character pointer. So we&#8217;re giving it a character</p>



<p>pointer that we received. When point was called by the driver, notice how it gave a pointer to</p>



<p>the C string. You know, all arrays are basically pointers. They&#8217;re just different syntactically</p>



<p>just different syntactically sometimes so if i declare an array of some length and i give the</p>



<p>symbol somewhere that symbol is really a character pointer so um by calling point with my c string</p>



<p>i&#8217;m calling point inside of the assembly module with this character pointer so that means even</p>



<p>though this c string is owned by the driver by the c plus plus module the assembly module has access</p>



<p>So that means we should be able to print it right now already.</p>



<p>So just the rest of it is just like giving a pointer.</p>



<p>And notice how I&#8217;m not dereferencing R12.</p>



<p>If I did dereferencing around R12, then we would be looking to that address and seeing what&#8217;s there,</p>



<p>which wouldn&#8217;t work for printing a null terminated string.</p>



<p>So let&#8217;s just run it again.</p>



<p>I don&#8217;t know if you can hear him.</p>



<p>This dude is growling at me still because he wants another treat.</p>



<p>He just got denied.</p>



<p>He&#8217;s trying to do it again.</p>



<p>do it again. I let him outside people. He&#8217;s been outside like three times already and he just went</p>



<p>out like two minutes ago. Okay. I love him so much. It hurts my heart and he knows eventually he&#8217;s</p>



<p>going to break me because it hurts my heart or I&#8217;m like too distracted. It&#8217;s like, you know,</p>



<p>pulling the crank on a slot machine in Vegas. You know, eventually something comes out.</p>



<p>That&#8217;s what he does to me. I&#8217;ve accidentally trained him. So now printing the received</p>



<p>Now printing the received string and notice how it prints.</p>



<p>Hello, this is a C string owned by me.</p>



<p>So our assembly module is able to print a C string that was created locally by a C++ module.</p>



<p>So we&#8217;re handing around pointers.</p>



<p>Nice.</p>



<p>Can you hear me?</p>



<p>He&#8217;s getting louder.</p>



<p>So now let&#8217;s modify the incoming long.</p>



<p>Can you shush your freaking pants, please?</p>



<p>Shush your pants.</p>



<p>shush your pants you know the sad thing also is he&#8217;s so old that he&#8217;s deaf now</p>



<p>so he used to know what shush your pants meant it meant I&#8217;m not listening to you</p>



<p>and you might as well stop because I&#8217;m not gonna do anything based on your</p>



<p>harassment but now he can&#8217;t hear me say shush your pants so he just harasses me</p>



<p>all day and all night okay um so I&#8217;m gonna copy paste a little bit more code</p>



<p>Modify the incoming long.</p>



<p>So remember again that the point function, it received a pointer to a long.</p>



<p>We&#8217;re calling the long change me on the inside of this, but it&#8217;s coming in as R13.</p>



<p>And if you notice what I&#8217;m doing here is I&#8217;m just saying let&#8217;s increase the long.</p>



<p>So I&#8217;m going to dereference R13 because R13 is a pointer.</p>



<p>So I&#8217;m saying let&#8217;s go to the memory and change the long that is inside of memory.</p>



<p>And we have to specify that it is a keyword.</p>



<p>it as a keyword so that we you know we don&#8217;t confuse the system the system might think are</p>



<p>you modifying a keyword or like a double word or like a word like how big is your data all we know</p>



<p>is it&#8217;s an integer because it&#8217;s the increase instruction so I&#8217;m saying we got a keyword you</p>



<p>know a 64-bit integer sitting at that memory location I want you to dereference it and increase</p>



<p>it and going back to the driver we&#8217;re providing a pointer to our long so the long starts off is 100</p>



<p>and we&#8217;re just giving a pointer to it the next thing that we can do is we can</p>



<p>ask the driver to print our own stuff actually you know what let&#8217;s run the program right now</p>



<p>just to show that the driver can see the change in the long so i&#8217;m going to run it again notice how</p>



<p>first when the driver says hello it sees its own long as 100 then we&#8217;re inside the assembly module</p>



<p>long and then we return to the caller which is the driver notice how at the</p>



<p>very end of the program the driver sees its long as being 101 so we were able to</p>



<p>modify data that was owned by a different module just by passing pointers</p>



<p>and de-referencing them okay cool so now the next thing that we should do is let&#8217;s</p>



<p>ask the driver to print our own stuff that we own because remember if you go</p>



<p>to the very top you know we own some stuff we own some we own a long we own</p>



<p>float, right? So we want to be able to do something with that. So I&#8217;m going to copy paste this,</p>



<p>ask the driver to print our own stuff. So I&#8217;m going to move three items inside of arguments</p>



<p>for a function call. And then I&#8217;m going to make a function call calling the function,</p>



<p>Hey driver, print this again, Hey driver, print this is actually owned by the C++ module.</p>



<p>a pointer to a long and a pointer to a double remember even pointers to doubles are actually</p>



<p>integers so they use the general purpose register so that&#8217;s the three arguments right there rdi rsi</p>



<p>and rdx m and then we&#8217;re giving the first pointer is going to be the c string so message string</p>



<p>inside asm so you can see that&#8217;s this right here and then the next pointer is the long</p>



<p>inside ASM and the third is the float where did I just go I&#8217;m getting confused my dog is harassing</p>



<p>me right now so bad notice how I&#8217;m not dereferencing so like if when we were increasing the incoming</p>



<p>long before R13 was a pointer so we dereferenced while we increased so that we would increase the</p>



<p>actual value and not the pointer and not the pointer&#8217;s memory location but here we&#8217;re not</p>



<p>C++ module the actual pointers to our data. We don&#8217;t want to give it the data itself. We want</p>



<p>to give pointers to the data so we&#8217;re not derefing with the brackets. So then we call it and when we</p>



<p>get back in here it should just be able to print everything. So I&#8217;m going to run it one more time.</p>



<p>We&#8217;re going to make it and run it and so now let&#8217;s see. So here we&#8217;re inside of our assembly module</p>



<p>And then here the assembly module has just called on hey driver print this.</p>



<p>Remember the C++ module doesn&#8217;t actually call this function.</p>



<p>The assembly module calls it.</p>



<p>So we&#8217;re like going back and forth.</p>



<p>We&#8217;re kind of crisscrossing.</p>



<p>So now the drivers print this function says we got the following string.</p>



<p>Notice how that&#8217;s the string that is owned by assembly.</p>



<p>So we define that inside of our data section in the assembly module.</p>



<p>And then it prints the long.</p>



<p>It prints it as hex.</p>



<p>And it just sort of prints the value.</p>



<p>it just sort of prints the value then it prints it as hex again and then prints at the value</p>



<p>i think actually not hex i think this prints the memory location let&#8217;s double check real fast</p>



<p>yeah so remember um in c plus plus i know this is not like a c plus plus video but um</p>



<p>if the long is a pointer then if we just print it without dereferencing it we should see a memory</p>



<p>location so it&#8217;s telling us uh that the long&#8217;s memory location is this and the doubles memory</p>



<p>location is that and if you stare at those two numbers long enough and you understand hex which</p>



<p>And do you understand hex, which you can see my other videos for?</p>



<p>You&#8217;ll see that those memory locations are right next to each other because that&#8217;s the way we define them inside of assembly.</p>



<p>So we now have the ability to have data that is owned by assembly and give it to C++ or C using pointers.</p>



<p>No problem at all.</p>



<p>And then the printing driver thing exits and then the actual driver regains control.</p>



<p>And it just says that it sees it&#8217;s long as 101.</p>



<p>it sees it&#8217;s long as 101 so uh yeah that&#8217;s that&#8217;s pretty much all i wanted to show you for this</p>



<p>now you hopefully are an expert at passing data back and forth between various modules using</p>



<p>pointers we&#8217;re not using references because references are like a little bit a little bit</p>



<p>less compatible pointers are just really easy they totally work in assembly no problem</p>



<p>one more thing i just wanted to show you real fast before we go even though there&#8217;s another</p>



<p>video you should check out for stack alignment I just want you to see what</p>



<p>happens if I remove this extra push-pop pair so now my stack is about eight</p>



<p>bytes off of its previous alignment because you know we&#8217;re not pushing an</p>



<p>extra eight byte value and somewhere inside of the let&#8217;s see print null</p>



<p>terminated string and then the hey driver print this oh and then we go into</p>



<p>like a bunch of C stuff the program should probably crash because anytime</p>



<p>you use a GCC function or a GCC library or something like that the stack has to</p>



<p>be aligned to 16 bytes so if it&#8217;s off by 8 then it&#8217;ll crash and how did I know</p>



<p>that I needed this well I just ran it first and it crashed and then I added</p>



<p>the extra push pop pair and it didn&#8217;t crash and I realized it was definitely</p>



<p>one more time we should get a seg fault yeah we get a seg fault stack alignment oh no with no</p>



<p>description of what&#8217;s going on if you were in gcc you could i mean sorry if you were in gdb you</p>



<p>could probably figure that out eventually but why not just give it a try add another push pop pair</p>



<p>run the program again with no other modifications now it totally works</p>



<p>okay well uh i think that&#8217;s uh that&#8217;s all i have for this video thank you so much for watching i</p>



<p>I hope you learned a little bit of stuff and you had a little bit of fun.</p>



<p>I will see you in the next video.</p>



<p>Hey everybody.</p>



<p>Thanks for watching this video again from the bottom of my heart.</p>



<p>I really appreciate it.</p>



<p>I do hope you did learn something and have some fun.</p>



<p>If you could do me a please, a small little favor,</p>



<p>could you please subscribe and follow this channel or these videos</p>



<p>or whatever it is you do on the current social media website</p>



<p>that you&#8217;re looking at right now.</p>



<p>It would really mean the world to me</p>



<p>would really mean the world to me and it&#8217;ll help make more videos and grow</p>



<p>this community so we&#8217;ll be able to do more videos longer videos better videos</p>



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



<p>kindness and and subscribe you know sometimes I&#8217;m sleeping in the middle of</p>



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



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



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



<p>up in the middle of the night just subscribe and then I&#8217;ll just wake up I promise that&#8217;s what will</p>



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



<p>you can scan in order to go to the website which I think is also named somewhere at the bottom of</p>



<p>this video and it&#8217;ll take you to my main website where you can just kind of like see all the videos</p>



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



<p>for</p>



<p>Clarifications or errata or just future videos that you want to see please leave a comment or if you just want to say hey</p>



<p>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. I&#8217;m like this</p>



<p>It would really it really mean the world to me. I would really appreciate it. So again, thank you so much for watching this video and</p>



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



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-pointers-dereferencing-explained-hybrid-c-yasm-example/">x86-64 Assembly Pointers &amp; Dereferencing Explained &#8211; Hybrid C++/YASM Example</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/x86-64-assembly-pointers-dereferencing-explained-hybrid-c-yasm-example/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>x86-64 Assembly: Floating Point Registers Basics with YASM (MOVSD, MULSD, CVTSI2SD)</title>
		<link>https://www.NeuralLantern.com/x86-64-assembly-floating-point-registers-basics-with-yasm-movsd-mulsd-cvtsi2sd/</link>
					<comments>https://www.NeuralLantern.com/x86-64-assembly-floating-point-registers-basics-with-yasm-movsd-mulsd-cvtsi2sd/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 15 Feb 2026 03:15:33 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[assembly language tutorial]]></category>
		<category><![CDATA[convert integer to float assembly]]></category>
		<category><![CDATA[cvtsi2sd]]></category>
		<category><![CDATA[double precision assembly]]></category>
		<category><![CDATA[ed jorgensen x86 book]]></category>
		<category><![CDATA[floating point registers]]></category>
		<category><![CDATA[movsd]]></category>
		<category><![CDATA[mulsd]]></category>
		<category><![CDATA[nasm yasm floating point]]></category>
		<category><![CDATA[stack alignment assembly]]></category>
		<category><![CDATA[system v abi xmm]]></category>
		<category><![CDATA[x86 assembly floating point]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[x86-64 linux assembly]]></category>
		<category><![CDATA[xmm registers]]></category>
		<category><![CDATA[xmm0]]></category>
		<category><![CDATA[Yasm tutorial]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=302</guid>

					<description><![CDATA[<p>Learn the basics of floating-point registers (XMM0–XMM15) in x86-64 assembly with YASM. Covers MOVSD, MULSD, CVTSI2SD, ABI rules, why floats return in XMM0 instead of RAX, saving/restoring around calls, and common stack alignment crashes when using printf.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-floating-point-registers-basics-with-yasm-movsd-mulsd-cvtsi2sd/">x86-64 Assembly: Floating Point Registers Basics with YASM (MOVSD, MULSD, CVTSI2SD)</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 loading="lazy" title="x86-64 Assembly: Floating Point Registers Basics with YASM (MOVSD, MULSD, CVTSI2SD)" width="1380" height="776" src="https://www.youtube.com/embed/0Wcu_7LDw_w?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>Quick but thorough introduction to floating-point registers in x86-64 assembly using YASM.</p>



<p>Learn why XMM0 is special, how to use MOVSD / MULSD / CVTSI2SD, why you must save floats around function calls, and how easy (or sneaky) stack alignment bugs can crash your program.</p>



<p>Live coding + real examples converting integers to doubles and multiplying them.</p>



<p>Great next step after basic integer assembly tutorials.</p>



<p>00:00 Introduction to Floating Point Registers<br>00:28 Why Floating Point Uses Special Registers<br>01:35 Floating Point Return Value in XMM0<br>02:17 XMM Registers Overview XMM0 to XMM15<br>02:48 ABI Rules No Callee-Saved XMM Registers<br>03:16 128-bit XMM Registers Purpose and Size<br>04:00 Ed Jorgensen x86-64 Textbook Reference<br>05:03 Locating XMM Documentation in Textbook<br>05:20 Earthquake &#8211; I am going to die<br>06:24 Chapter 18 Floating Point Instructions<br>07:34 MOVSS vs MOVSD Single vs Double Precision<br>09:11 Understanding SS and SD Instruction Suffixes<br>10:58 MOVSD Example Register to Register<br>11:03 Conversion Instructions CVT Family<br>13:02 Floating Point Arithmetic ADDSD MULSD SUBSD<br>25:48 Program Demo User Input Section<br>26:01 Converting Integer to Double CVTSI2SD<br>26:29 Multiplying by Constant Float MULSD<br>28:56 Saving Result Printing Modified Float<br>31:38 Multiplying User Integer by User Float<br>33:54 Final Result Display Program Summary<br>35:19 Stack Alignment Crash Demonstration<br>36:24 Conclusion Key Takeaways<br>36:52 Outro Subscribe and Thanks</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 Blog: https://www.NeuralLantern.com</li>



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



<p>Hey there! In this video we&#8217;re going to talk about pointers and dereferencing in a YASM x8664</p>



<p>assembly program, also as a hybrid program so that assembly and C++ can talk to each other</p>



<p>and send each other pointers and send each other data and things like that.</p>



<p>for what pointers are.</p>



<p>I&#8217;m going to write in C++ for a second.</p>



<p>Suppose you have a pointer for an integer.</p>



<p>We&#8217;ll call it P.</p>



<p>Suppose you have an integer by itself.</p>



<p>We&#8217;ll call it A.</p>



<p>Let&#8217;s say that the value of A is 5.</p>



<p>And if you wanted to say that P points to A,</p>



<p>you could say P equals the address of A.</p>



<p>I&#8217;ll put C++ at the top here.</p>



<p>And so now if I set A to 6</p>



<p>then I print P a dereference of P this is not like a full pointers tutorial</p>



<p>but basically by changing a I&#8217;m changing what P thinks it sees as a value</p>



<p>assuming ID reference it I could also let me do a print 6 here I could also</p>



<p>just change the value through P I could say dereference P and I could say equals</p>



<p>would actually print a seven right so you know you can have regular variables global variables</p>



<p>whatever kind of you know memory stuff on the stack and to get a pointer to it you really just</p>



<p>need to get its memory location in c++ it&#8217;s kind of easy syntactically you can see what&#8217;s happening</p>



<p>in assembly you really just need the memory location stored somewhere you could store that</p>



<p>variable that just simply stored the memory location of some other variable.</p>



<p>You could have a 64-bit register store the value of a variable.</p>



<p>Let&#8217;s say we have like a, I don&#8217;t know, my whatever, my number let&#8217;s say inside of assembly.</p>



<p>I&#8217;ll do ASM here and we say it&#8217;s a quad word and it starts off as this number or whatever.</p>



<p>So if you haven&#8217;t seen my previous videos, go see them for the basics of assembly and</p>



<p>of assembly and linking and make files and all that stuff but you know if you</p>



<p>have an assembly program and you have a data section and you define a global</p>



<p>variable like this what you&#8217;re basically saying is I want to take this giant</p>



<p>number and I want to write it into eight bytes that&#8217;s the DQ it says data quad</p>



<p>word I want to write that giant number across eight bytes and then I want to</p>



<p>get a pointer to it stored in the my number symbol so my number is not</p>



<p>actually the value it&#8217;s a pointer to the value so you know later if you want to</p>



<p>you know later if you want to move you know something into a register if you did this</p>



<p>that would move the pointer into rax but if you did this</p>



<p>with deref symbols after it or around it then you would move</p>



<p>maybe i&#8217;ll put that into rex you&#8217;d move that actual number that we specified into rex</p>



<p>into Rx. It&#8217;s important to understand also that pointers are integers even when we&#8217;re pointing to</p>



<p>doubles. So for example sometimes people make this mistake they&#8217;ll say you know my double</p>



<p>and they&#8217;ll say it&#8217;s a quad word meaning this is going to be a 64-bit double precision floating</p>



<p>point number and they&#8217;ll do like 44.55 or whatever. So that is a double and it is in memory</p>



<p>you know what is the symbol of my double remember it&#8217;s supposed to be just a</p>



<p>pointer right it can&#8217;t be an actual double because a memory location is not</p>



<p>a double a memory location is an integer so that means if you wanted to move a</p>



<p>pointer into a register you would only be able to move the pointer into a</p>



<p>regular general purpose register not a floating point register and you should</p>



<p>use the regular movement instructions for just regular general purpose</p>



<p>So keep that in mind if you see a signature like this like let&#8217;s say function F and we have</p>



<p>You know, let&#8217;s say long a and long B and actually let&#8217;s do pointers</p>



<p>Let&#8217;s say long pointer a and long pointer</p>



<p>B and double pointer C all three of those arguments are actually 64 bit integers</p>



<p>Because they&#8217;re all pointers even if one of the pointers points to adult a double</p>



<p>double why did I say dull pointers aren&#8217;t dull they&#8217;re exciting okay so I&#8217;m gonna open up some</p>



<p>code here real fast so usually I don&#8217;t explain my uh my driver I&#8217;m gonna explain it to you this time</p>



<p>because it&#8217;s kind of doing a little bit more than my other videos um again if you don&#8217;t have uh the</p>



<p>knowledge of how to make a make file see my other videos because that&#8217;s explained there for now I&#8217;m</p>



<p>what we really need to do is write a driver and an assembly module for a</p>



<p>hybrid program again hybrid programs covered in other videos so the driver is</p>



<p>pretty easy I&#8217;m just going to copy paste it honestly here and then just kind of</p>



<p>explain it to you the driver is pretty easy we&#8217;re going to do I O stream so we</p>



<p>can print stuff we&#8217;re going to mark an external function called point as extern</p>



<p>C so that just disables name mangling which means the C++ module will be able</p>



<p>will be able to call on this function called point and it won&#8217;t expect that</p>



<p>the point function has its name mangled like C++ does the reason being is that</p>



<p>point is actually going to be in a side it&#8217;s going to be inside assembly where</p>



<p>its name will not be mangled this disables the ability to overload but</p>



<p>that&#8217;s okay we don&#8217;t care it&#8217;s going to take two pointers a pointer to a character</p>



<p>and a pointer to a long since both of those are pointers they&#8217;re both</p>



<p>64-bit integers even the character pointer and then we have a function that is internal to this</p>



<p>module called hey driver print this remember we&#8217;re inside of the driver program right now</p>



<p>so if you look at the bottom it&#8217;s just a function that takes in some pointers</p>



<p>and then prints some stuff so it&#8217;s going to print like it&#8217;s going to print what the string is</p>



<p>it&#8217;s going to print what the long is my dog&#8217;s growling at me i&#8217;m going to ignore him because</p>



<p>i literally just let him pee and poop at this point now he&#8217;s harassing me for treats</p>



<p>now he&#8217;s harassing me for treats he always does this okay so uh the string the long the double</p>



<p>this function expects to receive three pointers to different data types it&#8217;s just going to print</p>



<p>all of them and the point get it the point of this function is we&#8217;re going to go inside of</p>



<p>the assembly module and then have the assembly module call on this function so that we can we</p>



<p>can prove that we can have stuff sent from assembly to c plus plus or c using pointers</p>



<p>using pointers we can have data sent over so anyway that&#8217;s why both of these</p>



<p>are in here the point needs to be marked as no name mangling because point is</p>



<p>inside of assembly which will not name mangle and then hey driver print this</p>



<p>that needs to have name mangling disabled also so that the assembly</p>



<p>module can call on this other than that we&#8217;re just basically inside of a main</p>



<p>saying hey this is the c string we&#8217;re making a c string inside of the main function notice how</p>



<p>this is a local variable so that c string is going to show up on the stack it&#8217;s going to show up in</p>



<p>the area that is owned by main for main stack area same thing for my long that&#8217;s a local variable on</p>



<p>the stack um and but then we can actually send pointers to those pieces of data to another</p>



<p>function in another module you don&#8217;t have to only transport globals or stuff on the heap</p>



<p>or stuff on the heap, you can transport pointers to local variables. Just make sure that by the</p>



<p>time this function finishes, then nowhere else is actually using that data because,</p>



<p>well, being on the stack, once main function or once any function finishes, then its portion of</p>



<p>the stack will be cleaned up and removed and it&#8217;ll be junk data. You&#8217;ll probably get a seg fault.</p>



<p>But for now, we&#8217;re not going to use anything on the stack. We&#8217;re not going to use these local</p>



<p>just going to use them quickly on this call to point and then we&#8217;re going to return to the</p>



<p>operating system and finish the program. So that&#8217;s the driver. Now the hard part. Let&#8217;s do this in</p>



<p>assembly. So for starters, I&#8217;m going to make a data section and just explain it to you very,</p>



<p>very quickly. Again, if you don&#8217;t understand the basics of YASM x86-64 assembly, did I mention</p>



<p>that that&#8217;s what this language is at the beginning of the video? I guess I should put that in the</p>



<p>put that in the description or record an announcement that I can tack on at the beginning</p>



<p>or something. Anyway, so if you don&#8217;t understand how to do this, see my other videos, but basically</p>



<p>we&#8217;re going to make a data section. We&#8217;re going to define some strings. Here&#8217;s like an announcement.</p>



<p>Oh, we&#8217;re inside of, you know, the module now, the assembly module. And now we&#8217;re going to print</p>



<p>the received string. And then we&#8217;re going to make a string that is owned by assembly, which we can</p>



<p>into C++ when we call the function inside of the driver.</p>



<p>So this string is owned by the assembly module.</p>



<p>Notice how these are null terminated strings.</p>



<p>I just have like a comma zero there,</p>



<p>which means I have some extra functions</p>



<p>I&#8217;m gonna paste in that we&#8217;re not really gonna talk about</p>



<p>because they&#8217;ve been discussed in other videos</p>



<p>just so that we can print null terminated strings.</p>



<p>Then I&#8217;ve got a new line here,</p>



<p>you know, carriage return line feed.</p>



<p>And then I&#8217;ve just got some numbers</p>



<p>that are owned by the assembly module.</p>



<p>Then I&#8217;ve got a system write call,</p>



<p>call code one for the system call writes and file descriptor standard output so I</p>



<p>can print just to the terminal again if you don&#8217;t understand this see my other</p>



<p>videos so now let&#8217;s start the actual text section so this is where our</p>



<p>instructions start so we got the text section here and we&#8217;re going to use some</p>



<p>external symbols don&#8217;t worry about these I&#8217;m just using my own little library to</p>



<p>and input integers if you have access to this library use it if you don&#8217;t if you&#8217;re watching</p>



<p>at home and you don&#8217;t have this library then that&#8217;s fine you can use you know printf or</p>



<p>scanf or something like that to get and print floats from and to the user</p>



<p>but yeah I&#8217;m just using that and then I&#8217;m marking an external function here called hey driver print</p>



<p>this if you recall the driver module has a function called hey driver print this so</p>



<p>just allows my assembly code to call on that external function. Okay now next</p>



<p>piece of code. This is going to be… actually I&#8217;m going to paste the print</p>



<p>null terminated string function and related code because it&#8217;s just like a</p>



<p>big giant mess and we&#8217;re mostly going to ignore it. So just to show you what I&#8217;m</p>



<p>doing here I have a function called print null terminated string so that I</p>



<p>can print these strings up here and then I have it rely on a function called</p>



<p>string length that I have implemented up here and all it does is just</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-floating-point-registers-basics-with-yasm-movsd-mulsd-cvtsi2sd/">x86-64 Assembly: Floating Point Registers Basics with YASM (MOVSD, MULSD, CVTSI2SD)</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/x86-64-assembly-floating-point-registers-basics-with-yasm-movsd-mulsd-cvtsi2sd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Implement strlen for Null-Terminated Strings in x86-64 Assembly (YASM)</title>
		<link>https://www.NeuralLantern.com/implement-strlen-for-null-terminated-strings-in-x86-64-assembly-yasm/</link>
					<comments>https://www.NeuralLantern.com/implement-strlen-for-null-terminated-strings-in-x86-64-assembly-yasm/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 08 Feb 2026 01:59:27 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[abi register preservation]]></category>
		<category><![CDATA[assembly language tutorial]]></category>
		<category><![CDATA[assembly length function]]></category>
		<category><![CDATA[assembly string handling]]></category>
		<category><![CDATA[assembly while loop]]></category>
		<category><![CDATA[c strings assembly]]></category>
		<category><![CDATA[callee saved registers]]></category>
		<category><![CDATA[learn assembly 2025]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[NASM vs YASM]]></category>
		<category><![CDATA[null terminated string]]></category>
		<category><![CDATA[reverse engineering]]></category>
		<category><![CDATA[strlen assembly]]></category>
		<category><![CDATA[sys_write tutorial]]></category>
		<category><![CDATA[systems programming]]></category>
		<category><![CDATA[write syscall assembly]]></category>
		<category><![CDATA[x86 assembly linux]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[x86-64 linux assembly]]></category>
		<category><![CDATA[Yasm tutorial]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=298</guid>

					<description><![CDATA[<p>Learn to implement strlen from scratch in x86-64 assembly using YASM. We walk through building a null-terminated string length function with a while loop, proper register preservation, and ABI compliance, then use the length to print the string efficiently via sys_write.</p>
<p>The post <a href="https://www.NeuralLantern.com/implement-strlen-for-null-terminated-strings-in-x86-64-assembly-yasm/">Implement strlen for Null-Terminated Strings in x86-64 Assembly (YASM)</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 loading="lazy" title="Implement strlen for Null-Terminated Strings in x86-64 Assembly (YASM)" width="1380" height="776" src="https://www.youtube.com/embed/KQaIEBP6Qp4?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>Learn how to write your own strlen function in x86-64 assembly (YASM) that finds the length of a null-terminated string using a simple while loop.</p>



<p>We preserve the proper registers, follow the ABI, compute the length safely, and then use that length to print the full string efficiently with a single sys_write call.</p>



<p>Great for anyone studying low-level programming, operating systems, or wanting to understand C strings at the assembly level.</p>



<p>00:00:00 Introduction to implementing string length in assembly<br>00:00:25 What are null-terminated strings and why they exist<br>00:01:59 Pre-computing length vs using null terminators<br>00:02:53 How the null byte (0) actually works in memory<br>00:04:14 Naive approach: printing one character at a time<br>00:05:20 Goal: efficient printing using computed length<br>00:06:00 Program structure overview – two main functions<br>00:06:32 Data section: defining null-terminated strings<br>00:08:19 Additional strings for output (prefix, CRLF)<br>00:09:15 Text section start and global looper function<br>00:10:44 Preserving callee-saved registers (ABI prologue)<br>00:11:28 Calling print_null_terminated_string<br>00:12:43 Simple crlf printing helper function<br>00:13:10 print_null_terminated_string function signature<br>00:14:31 Prologue for print_null_terminated_string<br>00:15:44 Saving arguments and calling strlen<br>00:17:12 Using sys_write with computed length<br>00:18:19 string_length (strlen) function begins<br>00:19:20 Prologue and fake return value testing<br>00:20:44 Planning the while loop in C-like pseudocode<br>00:21:33 While loop initialization (pointer and counter)<br>00:24:23 Loop top: check for null terminator<br>00:26:23 Loop body: increment pointer and counter<br>00:27:37 Done label and return length in RAX<br>00:28:29 First successful run – full string printed<br>00:29:30 Adding direct strlen call and length printing<br>00:31:02 Final run showing both string and its length (54)<br>00:31:53 Summary – benefits of computed length printing<br>00:32:59 Improving loop structure (better jump pattern)<br>00:34:07 Final improved loop verification<br>00:35:03 Closing thoughts and thanks<br>00:35:27 Outro, call to subscribe, website mention</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 Blog: https://www.NeuralLantern.com</li>



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



<p>Hey there, in this video, I&#8217;m going to show you how to implement the function string length.</p>



<p>So you can find the length of a null terminated string in a Yasm x86-64 assembly program.</p>



<p>Although if you&#8217;re using a different assembly language or different architecture, this video</p>



<p>will probably still be useful to you because the concepts are going to be the same.</p>



<p>So what am I talking about?</p>



<p>I&#8217;m not going to be around here with this.</p>



<p>So in a previous video, I discussed null terminated strings.</p>



<p>I should also point out that a lot of basic knowledge is going to be skipped in this video</p>



<p>because I&#8217;ve explained it in other videos.</p>



<p>For example, if you don&#8217;t know how to compile, link, assemble, write a basic assembly program,</p>



<p>write a make file and so forth, then you should see my other videos first.</p>



<p>I&#8217;ve also already published a video about null terminated strings, but I&#8217;ll just do</p>



<p>it again here since that&#8217;s in the title of the video.</p>



<p>of the video so imagine you have a string and it&#8217;s hello right so under the hood uh the string is</p>



<p>probably a collection of characters on some level so we&#8217;ll just say this is h e uh l</p>



<p>l o right um when you&#8217;re printing</p>



<p>it&#8217;s unlikely that your entire memory stick is just done like it just you&#8217;re at the very end of your memory by the time that O hits</p>



<p>So that means you need some way of understanding when the string ends because if the memory is not over at that point</p>



<p>There could probably be some junk data at the end of it</p>



<p>You know like a bunch of other random letters or you can even imagine these as just you know</p>



<p>One byte that&#8217;s not one byte one byte numbers that just go on and on and on forever for the entirety of your RAM stick</p>



<p>of your RAM stick and you have to know how do we actually stop at the O. One thing that you can do</p>



<p>is just pre-compute the length of the string so we do that in assembly a lot before we know how</p>



<p>to scan for null terminators. We&#8217;ll say all right well that string is just five long so I&#8217;ll tell</p>



<p>the system I want you to print five characters starting at that memory location wherever the H is</p>



<p>and then the system knows okay I&#8217;ll just you know print the H-E-L-L-O and just stop after that.</p>



<p>null terminated strings are a lot more convenient because you don&#8217;t have to pre-compute the strings.</p>



<p>I mean, maybe your user entered a string.</p>



<p>Maybe you have a lot of strings or they change quite often.</p>



<p>Maybe you have like a multinational program that has tons of translations,</p>



<p>or I think multilingual is probably the better word for that.</p>



<p>But it can be a pain in the butt to constantly compute the length of strings in advance.</p>



<p>So with a null terminated string, you basically just say,</p>



<p>that I want to print and I&#8217;m just going to stick actually the number zero at the end of the string.</p>



<p>I&#8217;ll leave the junk data there just to let you know that there is some stuff happening in memory.</p>



<p>Notice how this zero, it is not actually the character that looks like a zero to a human.</p>



<p>That&#8217;s actually a totally different code than just zero. So you can imagine just an actual zero here.</p>



<p>You know, each of these characters that a human would look at has a number underneath it.</p>



<p>You know, this H is not really an H.</p>



<p>It&#8217;s just some number between 0 and 255 if we&#8217;re talking about ASCII.</p>



<p>The E is a different number and so forth.</p>



<p>So if we just put the literal number 0 in our data,</p>



<p>or if you want to quote this inside of a single quote,</p>



<p>you can do, I think, slash 0 just to let the compiler know</p>



<p>that you intend to have the number 0 there</p>



<p>instead of something that looks like the number 0, you know, the character.</p>



<p>you know the character but anyways the point is we just have to stick a zero at the end</p>



<p>of the string we call it a null terminator because zero is also you know an alias for null</p>



<p>whenever you have a null pointer or you assign null to a memory location or a pointer or something</p>



<p>you know it&#8217;s zero basically under the hood so a zero will terminate it&#8217;ll be like a token to let</p>



<p>us know that the string is finished and so since zero is also considered null we&#8217;ll say it&#8217;s a</p>



<p>we&#8217;ll say it&#8217;s a null terminator.</p>



<p>It&#8217;s a basic idea for null terminators.</p>



<p>Now the question is, how do we actually know when to stop?</p>



<p>Well, the first thing that you could do if you&#8217;re trying to write a program that is highly inefficient,</p>



<p>which I&#8217;ve definitely done before, is you could just print one character at a time.</p>



<p>You use a for loop.</p>



<p>You start at the very beginning of your string, you know, a pointer,</p>



<p>whatever the user gave you as like this is the first character.</p>



<p>We&#8217;ll just print that letter, and then we&#8217;ll go on to the next letter.</p>



<p>the next letter and before we print it actually before we print the first letter even before we</p>



<p>print this letter we&#8217;ll uh we&#8217;ll say is this like a regular character or is this a null terminator</p>



<p>is this a zero if it&#8217;s not a zero we print that character if it is a zero we terminate the loop</p>



<p>and then we go through every character one by one just you know checking and printing checking and</p>



<p>printing checking and printing unfortunately that&#8217;s kind of inefficient because every time</p>



<p>you call a print you know you&#8217;re you&#8217;re calling on a function you&#8217;re asking the system to do some</p>



<p>for you and it would be a lot better if we could just flush the whole string at</p>



<p>the same time but but know how long the string was that would increase our</p>



<p>efficiency so the program that we&#8217;re going to write together is basically</p>



<p>going to use our knowledge of a while loop which I&#8217;ve explained in other</p>



<p>videos already so see those other videos if you don&#8217;t know how to do while loops</p>



<p>in Yasm we&#8217;re going to use our knowledge of a while loop to sort of scan the</p>



<p>string real fast just you know kind of scan it and figure out how far into the</p>



<p>far into the string until we see a null terminator and use that to determine what is the length of</p>



<p>the string. At that point, we can use a system call in YASM, in assembly, to just say, I want you to</p>



<p>print this sequence of characters and here&#8217;s the length and then let the system worry about</p>



<p>efficiency. So with that said, let&#8217;s look at some code. Okay, it&#8217;s just going to be a simple while</p>



<p>loop. What we&#8217;re going to need to do is break this up into two parts. The first part is going to be</p>



<p>the first part is going to be a function called string length which you&#8217;ve probably already seen</p>



<p>in c if you program in c or c plus plus the second function is going to be called print null terminated</p>



<p>string which will just ask string length what the length of the string is first and then actually</p>



<p>print it with the system call so let me uh i guess let me start off with my data section here</p>



<p>to print I&#8217;m gonna copy paste that for my solution again this is not a not an</p>



<p>assembly basics video so if you don&#8217;t understand what I&#8217;m doing you should</p>



<p>watch my other videos first I&#8217;m assuming you know how to make a data section by</p>



<p>now we&#8217;ll put some C strings I&#8217;m just gonna make one null terminated string</p>



<p>actually I guess I&#8217;m making two but the focus of this program is just the first</p>



<p>one I&#8217;m calling it null terminated string and in assembly it&#8217;s pretty easy</p>



<p>you just make it a you know a character array just like a sequence of bytes with</p>



<p>a sequence of bytes with this DB meaning data bytes.</p>



<p>And I can just put a quoted string like this.</p>



<p>No problem.</p>



<p>As many characters as I want.</p>



<p>I can start injecting specific ASCII values if I wanted to</p>



<p>or byte values if I wanted to just by putting a comma</p>



<p>and then a number.</p>



<p>So I could do something like this.</p>



<p>I could do like, you know, 47, you know, 49, you know, 50, whatever.</p>



<p>If I knew the ASCII codes for the characters,</p>



<p>fortunately, I don&#8217;t need to.</p>



<p>normally into the double quoted area but then i need to be able to put a null terminator at the</p>



<p>end of my string because it&#8217;s not going to happen automatically so then i am going to do comma zero</p>



<p>and you&#8217;ll end up with something like this like if i guess if we look at the previous example real</p>



<p>fast i&#8217;ll call this a hello string just so that you see some similarity from what we just looked</p>



<p>a notepad thing would just be typing the word hello and then putting comma zero.</p>



<p>So it is now a null terminated string and it looks just like this inside of system memory.</p>



<p>Well, not just like that.</p>



<p>There would be numbers where the letters are, but you know, that&#8217;s basically what we have created.</p>



<p>And then of course there&#8217;s junk data afterwards, but we don&#8217;t really care about that.</p>



<p>You know, we&#8217;re just going to ignore it with the null terminator.</p>



<p>So I&#8217;m going to erase that since we&#8217;re not just going to print the word hello.</p>



<p>We have a null terminated string here and then after we print the null terminated string</p>



<p>I&#8217;m just going to print out what was the length of the string.</p>



<p>So this is a prefix string where it&#8217;s just, you know, it&#8217;s a prettier program.</p>



<p>The program is going to say the null terminated string&#8217;s length was something.</p>



<p>And then we&#8217;re going to use the null terminated string printer to print that also.</p>



<p>Convenient, right?</p>



<p>And then I&#8217;m going to actually print the number.</p>



<p>Then we have this down here, crlf, which is just printing a new line in the terminal.</p>



<p>That&#8217;s character code 13 and then 10 and then a null terminator so that we can use the null terminated string printer again.</p>



<p>And then we&#8217;re going to use system call code 1 to print a standard output right here.</p>



<p>If you don&#8217;t understand that, then see my other videos.</p>



<p>But let&#8217;s move on to the text section where all our instructions will go.</p>



<p>Okay, so now the instructions begin in our text section right here.</p>



<p>section.text and I&#8217;m using an external symbol this video is not about this</p>



<p>library here but basically I have a library that will help me print integers</p>



<p>you don&#8217;t need to worry about that you could imagine well I guess in your</p>



<p>example when you&#8217;re practicing if you don&#8217;t have this library you could just</p>



<p>not print the length of the string and just use it only and it all should still</p>



<p>work or you could hard code the thing that you&#8217;re printing if you really</p>



<p>wanted to. Okay, so I&#8217;m just going to continue on here. Now let&#8217;s do our entry point. So again,</p>



<p>this is not a video about hybrid programs. Just assume that there is another module in my program.</p>



<p>It&#8217;s a C++ module. It&#8217;s got the main function, you know, for the entry point for a hybrid program,</p>



<p>and it&#8217;ll just call on my looper function. So that&#8217;s why I&#8217;m marking a looper as global.</p>



<p>So my other module can call it. And well, it is a function that needs to return. So I&#8217;m going to</p>



<p>to return so i&#8217;m going to put ret at the end of it and you can see here i left myself a note saying</p>



<p>i&#8217;m going to use r12 to remember the length of the string so that i can print it back to the user</p>



<p>so that means i have to preserve r12 for the caller because the abi or the application binary</p>



<p>interface says that r12 is a callie saved register and if you don&#8217;t respect the abi</p>



<p>the abi is not going to respect you your program is going to end up crashing eventually</p>



<p>So I&#8217;m just going to do a push pop pair to preserve R12.</p>



<p>Oops, prologue and call that epilogue.</p>



<p>Okay. So we got a push pop pair. We got a return statement.</p>



<p>This program should probably do nothing so far. So let&#8217;s run it and see,</p>



<p>just make sure that it at least compiles.</p>



<p>So I&#8217;m going to say clear and make run running the program.</p>



<p>Hello from the driver. You don&#8217;t know that the driver has that.</p>



<p>that the driver has that. This is not a driver video. And then the driver regains control because</p>



<p>nothing happened inside of the assembly module. We just basically looper got called and then we</p>



<p>preserved R12 and then restored it and then we did nothing. Okay, so now let&#8217;s make a call to</p>



<p>print null terminated string. We have to make another function for this, but right now this is</p>



<p>just the call. So the name of the function that we&#8217;re going to write is called print null terminated</p>



<p>it it will call on the string length function to figure out how long the string is then it will use</p>



<p>a simple system call to print the whole string giving the length to the system call it also takes</p>



<p>two arguments the first argument is a pointer to the null terminated string so that&#8217;s just that</p>



<p>symbol we defined up above remember when you define variables up in the data section then</p>



<p>these symbols tend to be pointers so that symbol is a pointer to the h basically or just the memory</p>



<p>that h is sitting in ram then the second argument that it wants is uh is where we&#8217;re going to print</p>



<p>it so we&#8217;re just going to print it to standard output um which is just file descriptor number one</p>



<p>so again if you don&#8217;t understand arguments or you know file descriptors or function calls</p>



<p>see my other videos because i&#8217;ve explained those already anyway so we&#8217;re going to call</p>



<p>print null terminated string then we&#8217;re going to call on crlf which will just print a new line</p>



<p>So now maybe we should implement, well, let&#8217;s copy paste crlf so that I can implement the</p>



<p>other function a little bit more slowly.</p>



<p>What does crlf do?</p>



<p>It literally just asks the print null terminated string function to just print a crlf for us.</p>



<p>So it&#8217;s very, very simple.</p>



<p>Here&#8217;s the signature.</p>



<p>Nothing much to it.</p>



<p>Okay.</p>



<p>Now, a little bit more complicated is the print null terminated string function.</p>



<p>So in our looper, we&#8217;re going to print the null terminated string.</p>



<p>We have to have a function that actually does that.</p>



<p>So that&#8217;s going to be this one right here.</p>



<p>Here&#8217;s the signature that I&#8217;ve chosen for my print null terminated string function.</p>



<p>Basically, I want to receive a character pointer to the first character in the string that we&#8217;re going to print.</p>



<p>And then a file handle designating where we&#8217;re going to print it.</p>



<p>The reason I want to receive the file handle is so I could print a standard output or standard error.</p>



<p>or standard error, or I could print to a file,</p>



<p>like whatever I want to do.</p>



<p>You don&#8217;t have to have that in there, but it&#8217;s nice.</p>



<p>Anyway, so we have this function set up.</p>



<p>Notice how my notes that I left for myself</p>



<p>is that I&#8217;m gonna use R12</p>



<p>to remember the incoming C string pointer argument,</p>



<p>and I&#8217;m gonna use R13 to remember the file handle.</p>



<p>Remember, it&#8217;s probably not a good idea</p>



<p>to just let the incoming arguments</p>



<p>stay in their original registers,</p>



<p>original registers because those registers tend to get overwritten as you do system calls or</p>



<p>calls to any other function. So I&#8217;m just going to grab them real fast into R12 and R13. And then R14</p>



<p>is the string&#8217;s length, which I&#8217;m going to compute with a call to the function called string length.</p>



<p>So just three things to remember. And that&#8217;s it. So that means I&#8217;m going to have to preserve those</p>



<p>Okay, so we&#8217;re going to do a prologue to preserve those registers.</p>



<p>And then at the very end, we&#8217;re going to do an epilogue where we restore those registers.</p>



<p>Oh, I think I already overwrote my return statement from the previous function.</p>



<p>I think I did that in the last video and I was a little confused as to what was wrong.</p>



<p>So make sure you don&#8217;t accidentally overwrite or push down your return instructions.</p>



<p>Let me just double check here.</p>



<p>Looper&#8217;s got return.</p>



<p>Print and alternated string has got a return.</p>



<p>string has got a return.</p>



<p>CRLF has a return.</p>



<p>What the heck did I do?</p>



<p>Oh, I think I copy pasted in a bizarre place.</p>



<p>That&#8217;s probably what happened because the epilog for for print null terminated</p>



<p>string is like down in CRLF already.</p>



<p>That&#8217;s not good.</p>



<p>Okay, that would have been a crashing program.</p>



<p>Although sometimes if you omit the return statements, execution will just fall</p>



<p>through down to the next label and maybe your program will survive accidentally.</p>



<p>accidentally but for now it&#8217;s just crlf is supposed to be very simple it doesn&#8217;t preserve</p>



<p>any registers so we&#8217;ve got a prologue and an epilogue here notice how the push and pops are</p>



<p>in reverse order you want to know more about that see my other videos but now that we are preserving</p>



<p>the appropriate registers we can actually grab our incoming arguments so first thing i&#8217;m going to do</p>



<p>is i&#8217;m going to say r12 is going to be the first argument that i received and then r13 is going to</p>



<p>okay no problem then let&#8217;s rely on the string length function to compute the actual length of</p>



<p>the string i didn&#8217;t feel like having print null terminated string compute the length of the</p>



<p>string it&#8217;s a good idea especially in assembly or any language when you have multiple distinct</p>



<p>jobs happening within the same function you probably want to break that function up into</p>



<p>multiple functions just to reduce you know strain on your brain right cognitive load</p>



<p>So I&#8217;m going to use this function strlen string length to compute the length of the string.</p>



<p>It&#8217;s only going to take one argument and it&#8217;s going to take the pointer to the null terminated</p>



<p>string which is now in R12. It&#8217;s going to take that as its first argument so that&#8217;s why I&#8217;m loading</p>



<p>that up into RDI. When string length returns it&#8217;s going to give me the length of the string in the</p>



<p>RAX register which is the usual return register for integer or pointer return types. So I&#8217;m just</p>



<p>So I&#8217;m just going to save that in R14.</p>



<p>And that&#8217;s the usage of all those registers R12, 13, and 14.</p>



<p>We still have to implement string length.</p>



<p>Don&#8217;t worry.</p>



<p>Although if you were linking a hybrid program, you could probably just call</p>



<p>STRLEN in the C libraries and be fine.</p>



<p>But this is an assembly video.</p>



<p>We want to do everything in assembly if we can, or at least more of it.</p>



<p>So then finally, when we know what the strings length is, we can just use a</p>



<p>system call to actually print the string we&#8217;re going to say load up call code one to say you</p>



<p>know mr. system I want you to print a string and then r13 is going to be the file handle so we&#8217;re</p>



<p>going to basically say wherever the caller of print null terminated string said to print which</p>



<p>is probably going to be standard output we&#8217;ll just tell the system we want to print to the same place</p>



<p>and then r12 is a pointer to the c string so we just give that to the system call as well</p>



<p>system call wants to know how long the string is that&#8217;s r14 now now that we have used strlen</p>



<p>to determine the length of the string so not really that complicated of a function we just</p>



<p>kind of like grab some arguments preserve those registers and we ask another function to compute</p>



<p>the length of the string and then we actually just print it once we have the length this is still not</p>



<p>getting to the point where we&#8217;re going to use our while loop knowledge to compute the length so i</p>



<p>That&#8217;s probably all I need right now.</p>



<p>And I think we&#8217;re ready to use or to start the string length function.</p>



<p>Okay, so now let&#8217;s make another function called string length.</p>



<p>Hopefully I&#8217;ll paste in the right spot this time.</p>



<p>You&#8217;re cringing at home.</p>



<p>That just tells me that you care.</p>



<p>So the string length function, at least the version that I&#8217;m making right now,</p>



<p>just is going to take one argument.</p>



<p>It&#8217;s going to be a character pointer to the string that you want to compute.</p>



<p>It will expect that the string has a null terminator at the end.</p>



<p>the end if you accidentally didn&#8217;t put a null terminator at the end of the string then this</p>



<p>function definitely won&#8217;t work it&#8217;ll probably give you some huge number because it&#8217;ll go through ram</p>



<p>until it accidentally finds a zero um and then it&#8217;s going to return to you as its return value</p>



<p>and uh assigned a 64-bit integer actually this should be unsigned but i&#8217;m just putting long for</p>



<p>now um to indicate the length of the string okay inside the notes we&#8217;re going to use r12 and r13</p>



<p>So that means I should probably preserve those registers first before I do anything else.</p>



<p>So in the prolog, we&#8217;re going to push R12 and R13 so that we don&#8217;t break this program</p>



<p>for others.</p>



<p>And then we&#8217;re going to do an epilog.</p>



<p>Whoops.</p>



<p>Then we&#8217;re going to do an epilog to restore the registers.</p>



<p>And this is a function.</p>



<p>So it&#8217;s got to return to the caller.</p>



<p>If I didn&#8217;t put a return statement here, then execution is going to just go all the way</p>



<p>down to CRLF.</p>



<p>And this will be an infinite loop.</p>



<p>and this will be an infinite loop because crlf will end up calling null terminated string,</p>



<p>which we&#8217;ll then call string length, which will then fall through to crlf,</p>



<p>so the whole program won&#8217;t even work if we don&#8217;t have return.</p>



<p>And, you know, you don&#8217;t want to omit return statements anyways,</p>



<p>because that&#8217;s always a bad idea.</p>



<p>So now string length will just not do anything right now.</p>



<p>Maybe we could return a fake value for a second before we start implementing the loop.</p>



<p>the number five into RAX so that string length will always trick the caller into thinking that</p>



<p>the length of the string is five let&#8217;s see if that actually works we should get a portion</p>



<p>of the null terminated string unless I screwed something up</p>



<p>hello from the main driver notice how it just says hello here that&#8217;s kind of confusing let&#8217;s</p>



<p>let&#8217;s hard code the five to like a nine we should see more of that null terminated string</p>



<p>I sound when I wake up sometimes hello okay so let&#8217;s finish the str len function so again you</p>



<p>should know how while loops work if you don&#8217;t see my other videos but we&#8217;re going to use a while</p>



<p>loop to count the length of the string so we&#8217;re going to start with a little portion up here</p>



<p>think the string is and a running pointer so rdi is already supposed to come in as a pointer to the</p>



<p>string that we&#8217;re measuring so i&#8217;m going to save um the pointer into r12 so that we can have a</p>



<p>pointer that points to a character we&#8217;re going to use this as a running pointer so it&#8217;s going to like</p>



<p>sweep through the whole entire string until it hits a null terminator and then r13 is going to</p>



<p>keep track of uh how big we think the string is so when we first start we&#8217;re just looking at the</p>



<p>first start we&#8217;re just looking at the first letter and then we think the string has zero length.</p>



<p>So that&#8217;s the initialization part which will not be repeated as we continue looping. Now we&#8217;re</p>



<p>going to implement the top of the loop. I don&#8217;t know should I should I write this out as c code</p>



<p>for you? I don&#8217;t know if I should maybe let me do it. I didn&#8217;t prepare this so if it&#8217;s slow sorry</p>



<p>Maybe this is like a long strln, something like that.</p>



<p>And then we&#8217;ll do if my code is wrong or doesn&#8217;t compile, I&#8217;m so sorry.</p>



<p>I did not, I did not prepare this.</p>



<p>We&#8217;ll say character pointer s and then we&#8217;ll say, uh, maybe we can actually just leave</p>



<p>s alone because it&#8217;s coming in as an argument and in C plus plus you can just continue to</p>



<p>use that symbol.</p>



<p>It&#8217;s not going to get destroyed.</p>



<p>So imagine we&#8217;ve saved it already into R 12 and then we just keep using it.</p>



<p>using it so we&#8217;ll say while a let&#8217;s say a dereferencing of s is not equal to zero meaning</p>



<p>if we look at the value that the pointer is currently pointing to if we assume it&#8217;s just</p>



<p>pointing to one byte is we&#8217;ll keep going as long as that value is not a zero so that means</p>



<p>if the user called this function and gave us a pointer that was already looking at a zero</p>



<p>we would just return whoops we would just return that the length was zero so</p>



<p>that means I should probably keep track of the length here size type actually</p>



<p>long just to just to match the return signature long we&#8217;ll put size equals zero</p>



<p>and then at the very end we&#8217;ll just return the size and so again if the user</p>



<p>gave us a pointer that pointed to a zero already nothing would happen inside the</p>



<p>while loop we&#8217;d break through it right away and we would just return the number</p>



<p>the number zero that makes sense so then as long as it is not pointing at a zero</p>



<p>we&#8217;ll just increase what we think the size is and then we will increase the</p>



<p>pointer we can use s plus plus in C++ that&#8217;s just pointer arithmetic that&#8217;s</p>



<p>just going to tell the pointer to advance you know one memory location</p>



<p>further or whatever the data type is but in this case the data type is a</p>



<p>character so it really is going to be one memory location one byte so we&#8217;re</p>



<p>going to sweep through the string until we see a zero and then we stop and every time we see a</p>



<p>character that&#8217;s not a zero we increase our our measured length of the string by one and then</p>



<p>advance the pointer. So I haven&#8217;t tested this I don&#8217;t know if there&#8217;s an error in it but I hope</p>



<p>you get the basic idea of what we&#8217;re going to do. So that means up here you know this is the</p>



<p>initialization part that we were just talking about so we just set the running pointer to look</p>



<p>okay so then after we do that we are going to make the top of the while loop</p>



<p>so at the top of the while loop where we evaluate you know like right here this</p>



<p>is the top of the while loop it has to have its own label just like we explained</p>



<p>in the other videos and it is basically where we decide if we&#8217;re going to keep</p>



<p>looping or not are we going to jump into the body the loop or are we going to do</p>



<p>a long jump after the body to say that we&#8217;re done so the top of the loop is a</p>



<p>label. We compare the value that R12 is currently pointing at. We say that we only want to look at</p>



<p>one byte. We dereference R12 because remember R12 is supposed to be a pointer. You put the</p>



<p>brackets around it, it&#8217;s going to go to the memory location and then check what the value is that</p>



<p>the pointer is pointing to. That&#8217;s what dereferencing is, right? So we&#8217;re just going to</p>



<p>compare the byte that we&#8217;re looking at with a zero and we&#8217;ll say if it is equal to a zero,</p>



<p>jump to the done this is actually kind of a poor design pattern on my part usually we should jump</p>



<p>if it&#8217;s not equal into the body meaning we&#8217;ll always take a short jump into the body and then</p>



<p>execution will fall through on the next line to a long jump which has the ability to jump further</p>



<p>out of the body i&#8217;ve said in other videos that the conditional branch instructions they can only jump</p>



<p>about 128 bytes so if your if your loop body is too big then they won&#8217;t work but it&#8217;ll work for</p>



<p>But it&#8217;ll work for this example.</p>



<p>I don&#8217;t know, maybe if I have the gumption, I will fix up the loop for you if you want</p>



<p>me to after I copy paste my existing solution.</p>



<p>So for now we&#8217;re going to say, all right, I&#8217;m not going to do it.</p>



<p>I&#8217;m not going to do that.</p>



<p>Maybe in another video, if somebody requested, I might post another video in like five years.</p>



<p>Anyway, so we&#8217;re going to jump if it is a null terminator to the done label.</p>



<p>Otherwise we will fall through to the loop&#8217;s body where we&#8217;re just literally going to increase the pointer and also increase our idea of how big the string is.</p>



<p>So remember R12 is the pointer.</p>



<p>Integer arithmetic doesn&#8217;t, sorry, pointer arithmetic doesn&#8217;t really work here, but it accidentally works here because we&#8217;re looking at a byte array.</p>



<p>So if we just increase by one memory location, it will literally just increase by one memory location and we&#8217;ll be fine.</p>



<p>Just keep in mind that if you were sweeping through an array of, you know, quad words or some larger data type,</p>



<p>then just a simple ink wouldn&#8217;t actually work.</p>



<p>You&#8217;d have to increase by the appropriate number of bytes.</p>



<p>But hey, the number of bytes in one item is just one byte, so it&#8217;s easy.</p>



<p>So we&#8217;re making the pointer go forward by one on line 134 and then in line 135.</p>



<p>line 135 we&#8217;re increasing our idea of how big the string is and then we will unconditionally jump</p>



<p>to the top of our loop and so if you just kind of look at this what did i do i pasted that twice</p>



<p>oh god okay sorry guess i lost track of what i was doing so then we will unconditionally jump</p>



<p>to the top of the loop so basically you can imagine this loop is gonna it&#8217;s just gonna</p>



<p>continue forever just moving the pointer and increasing the counter and moving the pointer</p>



<p>finally when it sees a zero a null terminator then it actually breaks to</p>



<p>the done label and the done label is just doesn&#8217;t really do much it&#8217;s just a</p>



<p>label to get us out of the loop so the top of the loop says if we are done then</p>



<p>just jump to the done area notice how that skips over the the top jump and then</p>



<p>of course under that is going to be the epilog and then we can we can take the</p>



<p>we can take the return value and set that up now because at this point R13 should contain</p>



<p>the actual length of the string. So if we move that into RAX respecting the ABI for return values,</p>



<p>then the caller should be able to get the string length just at that point by itself.</p>



<p>So let&#8217;s see, that might actually be the whole entire program already. Let me</p>



<p>double check here. All right, let&#8217;s run it and see if it actually works.</p>



<p>and then do a make run.</p>



<p>What&#8217;s up with those asterisks?</p>



<p>Did I put that in there?</p>



<p>Oh, I wonder.</p>



<p>Okay.</p>



<p>So the driver comes in,</p>



<p>it calls on our function,</p>



<p>and the whole null terminated string gets printed out.</p>



<p>It says, hello, this is an example</p>



<p>of our null terminated string.</p>



<p>Notice how it printed the full length of the string,</p>



<p>not any less,</p>



<p>and it also didn&#8217;t print more than the length of the string,</p>



<p>i.e. junk data,</p>



<p>because it knew exactly how long the string was.</p>



<p>was and this is way better than printing one character at a time in terms of efficiency we</p>



<p>just pre-compute the length and then print exactly that length and then we&#8217;re done i think there is</p>



<p>one more thing i wanted to do here let me see up at the top yeah okay let me go back up to the top</p>



<p>of the program here so in the looper function we called on print null terminated string and we</p>



<p>didn&#8217;t do anything else so what i would like to do is just make an explicit call to string length</p>



<p>explicit call to string length inside of the lubr function just to get the length of the</p>



<p>null terminated string so we can just print it to the caller or print it to the user</p>



<p>and then I&#8217;m going to use my special library function here actually just just for your</p>



<p>information notice how I&#8217;m calling string length just like the the print null terminated string</p>



<p>function did and I&#8217;m just giving it as an argument a pointer to that null terminated string so then</p>



<p>So now I can just print r12</p>



<p>Well not yet, I&#8217;m gonna print a prefix if you look at the prefix here, it&#8217;s just</p>



<p>The null terminated strings length was and then I&#8217;ll print a number after that</p>



<p>You do it this way, you know your program is more pretty it&#8217;s more</p>



<p>It&#8217;s more nice to the user and so forth so I&#8217;m going to do this</p>



<p>we&#8217;re printing a nice prefix, a hard-coded string to the user to let them know that I&#8217;m about to</p>



<p>show them the length of the string. And then I use my external function that just prints a number to</p>



<p>the user. Again, this video is not about this library. You can use some other library if you</p>



<p>want to print something, or you can omit that part if you don&#8217;t have one set up yet. But</p>



<p>so I&#8217;m going to tell, I&#8217;m going to do first argument is R12, which was the length of the</p>



<p>I&#8217;m going to call this function and say I would like you to print r12 which is the length of the string so</p>



<p>After that we&#8217;ll print a new line to make things a little bit tidier and then I think this program is actually finished</p>



<p>Run it again now it says here&#8217;s the null terminated string and then on the next line it just says</p>



<p>The null terminated strings length was that was the prefix and then when I called my library</p>



<p>the number it says 54. so i don&#8217;t know was it 54? let&#8217;s just double check to make sure that it</p>



<p>actually was 54. 54 should not include the null terminator so i&#8217;m going to go 1 2 3 4 5 6 7 8 9 10</p>



<p>1 2 3 4 5 6 7 9 20 1 2 3 5 6 7 9 30 1 2 3 5 6 7 9 9 30 1 2 3 5 6 7 9 9 50 51 52 53 54 was it 54? i can&#8217;t even remember anymore.</p>



<p>So we have basically proved that this works.</p>



<p>We have leveraged our knowledge of while loops to implement a string length function, which</p>



<p>will let us have a printing function that is very smart.</p>



<p>So we don&#8217;t have to hard code string lengths up at the top anymore.</p>



<p>As long as we&#8217;re working with null terminated strings, everything will just work out now</p>



<p>with less variables or less defines.</p>



<p>Okay.</p>



<p>Let&#8217;s see.</p>



<p>I think that&#8217;s pretty much everything that I wanted to talk to you about.</p>



<p>I don&#8217;t know. Could I do,</p>



<p>could I do this easy, easily?</p>



<p>Loop top.</p>



<p>Okay. Yeah. I think I could probably do this reasonably.</p>



<p>So at this point,</p>



<p>you are satisfied that you understand how to implement this and you&#8217;re happy just cut the</p>



<p>video the rest of this video is going to be me sort of like improvising trying to figure out if</p>



<p>i can rearrange the logic in a fast enough time for a video uh just to show you that you know you</p>



<p>should you should probably write your loops a little bit better than i did so here we go but</p>



<p>this is this is just redundant stuff so we have our loop here and we have our initialization</p>



<p>The loop top, it should compare R12 to 0 and it should break the loop if it is a 0.</p>



<p>So that means I&#8217;m going to comment out this.</p>



<p>And I&#8217;m going to do jump not equal to 0 to the body.</p>



<p>And I just need to make a label for the body here.</p>



<p>So I&#8217;m going to say str lane loop bottom.</p>



<p>So there&#8217;s a label, which is the body.</p>



<p>Maybe I&#8217;ll do a comment here just to remind us that this is actually the body.</p>



<p>I guess I&#8217;ll do another comment right here.</p>



<p>So that&#8217;s the loop&#8217;s body.</p>



<p>So I&#8217;m going to say if R12 is not a null terminator, jump into the loop&#8217;s body.</p>



<p>Otherwise, we fall through to the next instruction,</p>



<p>and that will just be an unconditional jump to the done area.</p>



<p>Okay, and then when we&#8217;re inside the loop&#8217;s body, we&#8217;ll jump back up to the top.</p>



<p>I don&#8217;t know why I thought this was going to be hard.</p>



<p>Let me run this to make sure I didn&#8217;t break the program.</p>



<p>Yeah, it still works.</p>



<p>Okay.</p>



<p>I guess I overestimated the difficulty there.</p>



<p>The point being, the body is a lot closer to the top of the loop.</p>



<p>So that should be the thing that does a conditional branch.</p>



<p>You should conditionally branch to the body because it&#8217;s a shorter jump and therefore</p>



<p>much less likely to be out of bounds of that 128 conditional jump bite restriction.</p>



<p>And then when we fall through to the next line, because we did not do that jump,</p>



<p>because we did not do that jump then we&#8217;ll do an unconditional jump to the done area and you know</p>



<p>our loop is small so it didn&#8217;t really matter the first time we did this but um again imagine your</p>



<p>loop is huge that you definitely want an unconditional jump that goes to the done area</p>



<p>at that point and that&#8217;s also what we&#8217;re doing an unconditional jump to the top here when we get to</p>



<p>the end of the body so when you&#8217;re jumping large uh you know spans you want to use unconditional</p>



<p>Alright, so I guess that&#8217;s it.</p>



<p>I&#8217;m going to erase maybe this comment.</p>



<p>Well, I&#8217;ll leave that in there just for posterity.</p>



<p>And now I will officially say that I hope you had a good time watching this video.</p>



<p>I hope you learned a little bit of stuff and I hope you had a little bit of fun.</p>



<p>I will see you in the next video.</p>



<p>I&#8217;m going to go play some video games.</p>



<p>Maybe I&#8217;m going to eat some soup first.</p>



<p>Hey everybody.</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,</p>



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



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



<p>It would really mean the world to me and it&#8217;ll help make more videos and grow this community.</p>



<p>So we&#8217;ll be able to do more videos, longer videos, better videos, or just I&#8217;ll be able to keep making</p>



<p>to keep making videos in general. So please do me a kindness and subscribe. You know, sometimes</p>



<p>I&#8217;m sleeping in the middle of the night and I just wake up because I know somebody subscribed</p>



<p>or followed. It just wakes me up and I get filled with joy. That&#8217;s exactly what happens every single</p>



<p>time. So you could do it as a nice favor to me or you could troll me if you want to just wake me up</p>



<p>in the middle of the night, just subscribe and then I&#8217;ll just wake up. I promise that&#8217;s what</p>



<p>will happen. Also, if you look at the middle of the screen right now, you should see a QR code,</p>



<p>you should see a QR code which you can scan in order to go to the website which I think is also</p>



<p>named somewhere at the bottom of this video and it&#8217;ll take you to my main website where you can</p>



<p>just kind of like see all the videos I published and the services and tutorials and things that I</p>



<p>offer and all that good stuff and if you have a suggestion for clarifications or errata or just</p>



<p>future videos that you want to see please leave a comment or if you just want to say hey what&#8217;s up</p>



<p>what&#8217;s going on? You know, just send me a comment, whatever. I also wake up for those in the middle</p>



<p>of the night. I get, I wake up in a cold sweat and I&#8217;m like, it would really, it would really mean</p>



<p>the world to me. I would really appreciate it. So again, thank you so much for watching this video</p>



<p>and enjoy the cool music as, as I fade into the darkness, which is coming for us all.</p>



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/implement-strlen-for-null-terminated-strings-in-x86-64-assembly-yasm/">Implement strlen for Null-Terminated Strings in x86-64 Assembly (YASM)</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/implement-strlen-for-null-terminated-strings-in-x86-64-assembly-yasm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>x86-64 Assembly For Loops Explained &#8211; YASM Tutorial</title>
		<link>https://www.NeuralLantern.com/x86-64-assembly-for-loops-explained-yasm-tutorial/</link>
					<comments>https://www.NeuralLantern.com/x86-64-assembly-for-loops-explained-yasm-tutorial/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 01 Feb 2026 02:49:29 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[asm tutorial 2025]]></category>
		<category><![CDATA[assembly for loop]]></category>
		<category><![CDATA[assembly language tutorial]]></category>
		<category><![CDATA[assembly while loop]]></category>
		<category><![CDATA[computer architecture]]></category>
		<category><![CDATA[conditional jump assembly]]></category>
		<category><![CDATA[implementing for loop in assembly]]></category>
		<category><![CDATA[inc instruction assembly]]></category>
		<category><![CDATA[learning assembly language]]></category>
		<category><![CDATA[loop in assembly]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[NASM vs YASM]]></category>
		<category><![CDATA[reverse engineering basics]]></category>
		<category><![CDATA[systems programming]]></category>
		<category><![CDATA[x86 assembly loops]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[x86-64 linux assembly]]></category>
		<category><![CDATA[Yasm tutorial]]></category>
		<category><![CDATA[yasm x86-64]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=295</guid>

					<description><![CDATA[<p>This tutorial explains how to implement a C-style for loop in x86-64 assembly using YASM by converting it to while-loop logic with initialization, conditional jump (jl), increment (inc), and unconditional jump back to the loop top. Demonstrates register usage (r12/r13), loop structure, and printing numbers inside the body.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-for-loops-explained-yasm-tutorial/">x86-64 Assembly For Loops Explained &#8211; YASM Tutorial</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 loading="lazy" title="x86-64 Assembly For Loops Explained - YASM Tutorial" width="1380" height="776" src="https://www.youtube.com/embed/pftzv5lIPso?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>Quick practical guide showing how to implement a classic for loop (i=0; i&lt;n; i++) in x86-64 assembly with YASM. We break the for loop into init/check/update parts, convert it to while-style logic, then build it with compares, conditional jumps, inc, and unconditional jumps back to the top. Includes real working code, user input, and printed output.</p>



<p>Great for students learning assembly after C/C++, OSdev hobbyists, or reverse engineering beginners.</p>



<p>Introduction to For Loops in Assembly 00:00:00<br>For Loop Structure in High-Level Languages 00:00:28<br>Breaking Down For Loop Parts: Init, Check, Update 00:01:04<br>Converting For Loop to While Loop 00:01:52<br>Why While Loop Style Helps in Assembly 00:03:16<br>Program Overview and Setup 00:04:12<br>Data Section &#8211; Strings and Messages 00:04:40<br>External Functions and Hybrid Program 00:06:11<br>Entry Point &#8211; Looper Function 00:07:12<br>For Test Function and Register Usage 00:07:42<br>Preserving Callee-Saved Registers 00:08:05<br>Printing Welcome Message 00:09:00<br>Prompting User for Number 00:09:48<br>Getting User Input 00:10:25<br>For Loop Structure in Assembly &#8211; Comments 00:11:12<br>Initialization &#8211; Setting Counter to Zero 00:12:50<br>Loop Top Label and Condition Check 00:14:28<br>Conditional Jump Setup (jl) 00:15:07<br>Handling Jump Distances 00:15:34<br>Loop Body &#8211; Printing Current Number 00:16:58<br>Update Part &#8211; Increment Counter 00:18:40<br>Unconditional Jump Back to Loop Top 00:19:14<br>Loop Done Label and Exit 00:19:55<br>Printing Goodbye Message 00:20:23<br>Testing the Program 00:22:08<br>Final Results and Demo 00:22:24<br>Outro and Call to Action 00:23:25<br>Thanks and Subscribe Request 00:23:45<br>Website and QR Code Mention 00:24:38<br>Closing Thanks 00:25:16</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 Blog: https://www.NeuralLantern.com</li>



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



<p>Hey there! In this video I&#8217;m going to teach you how to implement for loops in YASM x86-64 assembly.</p>



<p>Although if you&#8217;re using a different type of machine or a different assembler,</p>



<p>this video should still be useful to you because it&#8217;s mostly about the concepts involved in implementing a for loop.</p>



<p>Okay, so for starters here, what am I even talking about? Let&#8217;s do…</p>



<p>are you even talking about dude imagine in a higher level language we have a for loop here</p>



<p>and so we have like four size type i equals zero i is less than 99 i plus plus right probably most</p>



<p>programmers looking up assembly uh on the internet probably are interested in uh or probably already</p>



<p>know how to implement for loops in c plus plus so let&#8217;s just pretend that you do and so inside of</p>



<p>your for loop we&#8217;ll do stuff and what happens here is uh well you know this for loop is going to run</p>



<p>Well, you know, this for loop is going to run 99 times.</p>



<p>It&#8217;s going to start at zero.</p>



<p>And, you know, so we have like an initialization part right here.</p>



<p>Maybe I should copy paste this and kind of break down the parts.</p>



<p>We have an init part here for the for loop.</p>



<p>We&#8217;ll say init part.</p>



<p>And then here we have a check part.</p>



<p>We&#8217;ll continue to loop as long as this expression is true.</p>



<p>You can make a big complicated expression if you want to,</p>



<p>but we&#8217;ll just keep it simple for this video.</p>



<p>So I&#8217;ll call this the check part.</p>



<p>And then we have sort of an update or a maintenance part.</p>



<p>an update or a maintenance part. So I&#8217;m going to call this the update part where we increment our</p>



<p>counter variable, move pointers, even call functions, do whatever it is you think you need</p>



<p>to do to update the loop so that it runs it, you know, so that the loops don&#8217;t actually have to be</p>



<p>integers. But in this case, I think it&#8217;s better, it&#8217;s easier to understand what the loop is doing</p>



<p>if we just kind of break down these parts. Anyway, so what is really a while loop? Sorry,</p>



<p>but a while loop that breaks and has break has like a nit logic and breaking logic and checking logic just in specific places.</p>



<p>Imagine this. What if I said before the loop starts, I&#8217;ll let&#8217;s let&#8217;s say we&#8217;re going to do a while loop before the loop starts.</p>



<p>I&#8217;m going to initialize a variable size type I equals zero, right?</p>



<p>That&#8217;s the initialization part that&#8217;ll only happen one time.</p>



<p>And then when you have a while loop and it checks to see if it should keep going, that&#8217;s</p>



<p>the check part of the for loop.</p>



<p>So I&#8217;ll just say while i is less than 99.</p>



<p>And then for the update part, we just have to stick that inside of the while loop somewhere.</p>



<p>Depending on your logic, you might want to put it at the top or the middle or the bottom.</p>



<p>I&#8217;m going to put it at the bottom because I&#8217;m going to expect that it happens right</p>



<p>before we do the next check.</p>



<p>So I&#8217;m going to maybe do a comment here and call it the update part and I&#8217;m just going</p>



<p>So maybe if I update this code to print something, it&#8217;ll seem a little bit more clear.</p>



<p>Value of I is, and then I&#8217;ll just say I end L, and then I&#8217;ll copy paste that to here.</p>



<p>And then I can also put this inside of the while loop.</p>



<p>And now we have transformed our for loop into a while loop.</p>



<p>transform your for loop into a while loop it&#8217;s pretty easy to implement in assembly if you</p>



<p>already know how to implement while loops so i should again say that there are lots of parts</p>



<p>i don&#8217;t know if i said that during this video but there are lots of things in this video that i&#8217;m</p>



<p>not going to that i&#8217;m not going to explain specifically because i&#8217;ve already explained</p>



<p>them in other videos so for example implementing a while loop is in another video so if you don&#8217;t</p>



<p>already know how to implement while loops if you don&#8217;t know how to use conditional branching or</p>



<p>If you don&#8217;t know the basics of assembly, hybrid programs, make files, all the basic stuff that I&#8217;m going to skim over in this video,</p>



<p>then you should probably check out my other videos first.</p>



<p>But for now, I&#8217;m just going to assume that you know how to implement a while loop.</p>



<p>And really the lesson is, hey, just take your for loop and convert it into a while loop.</p>



<p>And then you can implement the while loop pretty easily.</p>



<p>That&#8217;s the secret as far as I&#8217;m concerned.</p>



<p>So imagine this now. Let&#8217;s do some assembly code.</p>



<p>I have a source code file here called looper.asm for assembly.</p>



<p>And you can imagine that I have a hybrid program running under the hood.</p>



<p>I&#8217;m not going to show you all the code involved.</p>



<p>I&#8217;m not going to show you the make file or the C++ driver that calls on this module.</p>



<p>We&#8217;re just going to write the assembly here.</p>



<p>So, you know, if you&#8217;re writing pure assembly at home to practice, that&#8217;s fine.</p>



<p>Just keep in mind, there&#8217;s like a few things under the hood that I&#8217;m not showing in this specific video.</p>



<p>So first off, I&#8217;m going to copy paste my data section.</p>



<p>paste my data section of my assembly program. The first thing to note is we have a bunch of</p>



<p>C strings here. We&#8217;re basically going to be telling the user, hey, we&#8217;re going to begin</p>



<p>the four tests. Maybe I should have capitalized for, I&#8217;ll leave it. And then we&#8217;re going to prompt</p>



<p>the user for a number. We&#8217;re going to say, please enter a number. The loop will print from zero to</p>



<p>the number minus one, which is like the typical four loop that you usually write in the most</p>



<p>and then we&#8217;re going to have a little prefix we&#8217;re going to say you know like an arrow and then we&#8217;re</p>



<p>going to print the number back to the user that we&#8217;re looping through so if the user enters a</p>



<p>10 it&#8217;s going to print the arrow 0 and then arrow 1 arrow 2 all the way up to arrow 9</p>



<p>and then when we&#8217;re done we&#8217;re going to print an ending message so this is nothing new if you know</p>



<p>assembly already just c strings that will print with system calls see my other videos if you don&#8217;t</p>



<p>And then a CRLF string, just basically doing a new line, a carriage return new line feed</p>



<p>on the system.</p>



<p>And then we&#8217;re going to output using system call code one.</p>



<p>And we&#8217;re going to use file descriptor one so we can print to standard output.</p>



<p>Okay.</p>



<p>So now the real fun begins.</p>



<p>Let&#8217;s start our text section, which is where the instructions of our assembly program go.</p>



<p>So I&#8217;m going to do text section, section text right there.</p>



<p>And I&#8217;m going to use two external functions to just help me input and output numbers to the user.</p>



<p>If you wanted to, you could use a system call that just inputted a character.</p>



<p>And then you could just kind of like loop printing various characters.</p>



<p>And like, let&#8217;s say if the user typed A, maybe you could imagine doing a loop that increases the character that they typed all the way until it hits Z.</p>



<p>Or if they hit, you know, F, it&#8217;ll just print F all the way to Z.</p>



<p>to z you could do that without using an external library for printing integers this video is not</p>



<p>about this library right here so i&#8217;m not really going to go over it but uh you know you could</p>



<p>hard code the start and end points when you&#8217;re practicing um you could you could use a different</p>



<p>library or a different function call to get the inputs you could use a system call just to input</p>



<p>one character um or you could you know use a hybrid program to to utilize printf and scanf</p>



<p>f. Either way I&#8217;m just going to be using these two functions just to like get input and output.</p>



<p>It&#8217;s not really part of the idea of looping. So now let&#8217;s start our entry point.</p>



<p>Our function is called looper. Since this is a hybrid program you can imagine there&#8217;s a C++</p>



<p>module elsewhere calling on the looper function and so that&#8217;s why I mark it as global so it can</p>



<p>be called upon. And then I have another function called for test. I don&#8217;t really know why I chose</p>



<p>it this way but i wanted to make another function that was called upon by our entry point here</p>



<p>so the looper function really doesn&#8217;t do anything except recall the for test function</p>



<p>so now let&#8217;s start the for test function actually maybe this is where the fun begins</p>



<p>so i&#8217;m gonna put it down here and so you can see the signature it doesn&#8217;t take any arguments it</p>



<p>doesn&#8217;t return anything it just does stuff and then i have a note to myself this is how we&#8217;re</p>



<p>going to use the registers we&#8217;re going to use r12 for the user&#8217;s number and then we&#8217;re going to use</p>



<p>And then we&#8217;re going to use R13 to keep track of where we&#8217;re going.</p>



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



<p>I&#8217;m going to start by saying let&#8217;s preserve R12 and R13</p>



<p>because you have to respect the application binary interface, the ABI,</p>



<p>and that designates R12 and R13 as Kali saved registers.</p>



<p>If I don&#8217;t preserve those and my program is even a little bit complicated,</p>



<p>I&#8217;m probably going to be debugging forever</p>



<p>debugging forever or I&#8217;m going to just crash my program for no reason. So I&#8217;m going to just</p>



<p>do a push pop pair. Notice how the pops are in reverse order. This is not a push pop video,</p>



<p>but just so you know, I guess while I&#8217;m here, I&#8217;m going to copy paste my crlf function,</p>



<p>which really does nothing. It just prints out the crlf string with a system call. That&#8217;s all</p>



<p>Okay, so do I even need CRLF in this program?</p>



<p>I think I just modified this.</p>



<p>Maybe I don&#8217;t even need it anymore.</p>



<p>No, I guess I do.</p>



<p>The first thing we&#8217;ll do is we&#8217;ll print an introduction message to the user.</p>



<p>So inside of the for test, we&#8217;ll just use a system call to print out, you know, a welcome</p>



<p>message to the user.</p>



<p>And then I&#8217;m going to call CRLF, which will just give us a new line.</p>



<p>And yeah, you can hard code, you know, the 13, 10 at the end of these strings, but I</p>



<p>don&#8217;t really like doing that.</p>



<p>doing that. Okay, so we should have a working program at this point. Let me see if it actually</p>



<p>does work. Clear and make run. Okay, so the driver prints a little welcome message. You don&#8217;t see the</p>



<p>driver code, but that&#8217;s what it&#8217;s doing. And then the for test prints the welcome message that we</p>



<p>just added. And then the driver lets us know it&#8217;s retained control. And then it&#8217;s responsible for</p>



<p>returning to the operating system for us. Okay, so then the next thing we&#8217;re going to do is we&#8217;re</p>



<p>we&#8217;re going to ask the user for a number so that we know how many times to loop.</p>



<p>And again, you could hard code this number if you don&#8217;t want to do IO right now.</p>



<p>You could even print a character a certain number of times</p>



<p>if you don&#8217;t want to even deal with printing an integer.</p>



<p>But I&#8217;m going to ask the user for a number.</p>



<p>That&#8217;s going to be the prompt string.</p>



<p>And if we run it again, now you should see it asks the user for a number.</p>



<p>So it&#8217;s going to say, please enter a number.</p>



<p>The loop will print from zero to N minus one.</p>



<p>print from 0 to n minus 1. It doesn&#8217;t actually ask for the number though. It doesn&#8217;t actually</p>



<p>I guess take the number so that&#8217;s going to be my external library that this video is not about</p>



<p>where I just call a function called input assigned 64 integer and I&#8217;m going to receive that back in</p>



<p>rax and I&#8217;m just going to save rax into r12. So r12 is now going to be the number that the user</p>



<p>inputted and that&#8217;s why up here I have it designated as the user&#8217;s number. So really not a big deal but</p>



<p>a big deal but uh you know if we run it again it&#8217;ll ask for a number and then it won&#8217;t do</p>



<p>anything else it&#8217;ll just kind of quit okay so now we can implement our for loop this is going to be</p>



<p>a little tricky so we&#8217;re going to start off with the initialization part remember we had several</p>



<p>parts here if i just kind of drag this off to the side maybe pin it up to the top so we can see it</p>



<p>aren&#8217;t we? If I move it a little bit to the side. So remember that for loop, it&#8217;s got an init part</p>



<p>and a check part and an update part. And I&#8217;ve kind of added that as a comment just to remind myself</p>



<p>of the way my mind is supposed to be wrapped around this concept. And so I made another comment</p>



<p>here with four and then empty parentheses just to denote that some comments that come below</p>



<p>I guess the top of the for loop</p>



<p>So now I&#8217;m going to make a label here and what I like to do with my labels is I like to</p>



<p>prefix them with the name of the function that I&#8217;m currently in and then an underscore and that kind of helps me keep track of</p>



<p>My symbols a little bit more easily, especially if I have a large module the symbols are less likely to overlap if I prefix them with the</p>



<p>The function names</p>



<p>to be Fortest underscore something and since I&#8217;m only doing one thing inside of the Fortest function</p>



<p>I&#8217;m just going to have a suffix only for the most part but you can imagine if you had more</p>



<p>parts inside of your function and it started getting a little cluttered you might want to have</p>



<p>you know another label you know that just sort of another I guess like part to your label that names</p>



<p>the part of your function you&#8217;re in although this is assembly it gets really hard really fast so</p>



<p>really hard really fast so if your function is even a little bit complicated you should probably</p>



<p>consider breaking it up into multiple functions if you can. We can&#8217;t really do that at this point</p>



<p>because it&#8217;s just a for loop but keep that in mind. Okay so we&#8217;re going to initialize. Remember</p>



<p>the first thing we had to do to initialize was you know setting i to zero or you know whatever</p>



<p>it is that we&#8217;re going to set up in the init part so I&#8217;m just going to do that here. I&#8217;m going to say</p>



<p>That&#8217;s the first part, the update part where we set size type i equals zero.</p>



<p>In fact, maybe I could do another copy paste of this.</p>



<p>Where instead of using a size type, we&#8217;ll just say that the register r13 equals zero.</p>



<p>I know that&#8217;s not going to make sense in a higher level language right now,</p>



<p>but just so that the for loop looks a little bit more like assembly.</p>



<p>We&#8217;ll keep going as long as r13 is less than r12.</p>



<p>and then we increase R13.</p>



<p>So I&#8217;m just going to put ink R13</p>



<p>so it looks more assembly-like,</p>



<p>even though this completely and totally</p>



<p>would not compile in C++.</p>



<p>I hope that this helps your understanding a little bit.</p>



<p>So yeah, we can do everything</p>



<p>except for just the increase part at the very top.</p>



<p>I&#8217;m going to choose to increase it at the bottom.</p>



<p>If you wanted to, I guess you could start off R13</p>



<p>as a negative number and then increase it at the top.</p>



<p>But I personally don&#8217;t feel that&#8217;s like very clean.</p>



<p>feel that&#8217;s like very clean it also forces you to use signed integers maybe you wanted to use an</p>



<p>unsigned integer so you could get like a gigantic um maximum number that you looped up to i don&#8217;t</p>



<p>know so we&#8217;ll just initialize here and we&#8217;ll say r13 is equal to zero the init part should not be</p>



<p>part of the actual like looping like every time you loop up to the top of the for loop you should</p>



<p>not repeat that part again it should only happen once so the next label that i have is called loop</p>



<p>have is called loop top and that&#8217;s just going to be the top of the loop that I</p>



<p>continue to go back up to every time I want to see if we&#8217;re supposed to</p>



<p>continue looping and then go into the loops body so maybe I should say that&#8217;s</p>



<p>why this is named to underscore loop top and I don&#8217;t know you don&#8217;t have to do</p>



<p>camel casing and your labels you know you could just do loop in it or whatever</p>



<p>but I&#8217;m just choosing to do it this way so at the top of our loop we&#8217;ll be</p>



<p>Remember that was the check part, right?</p>



<p>So we&#8217;re going to check to see that R13 is still less than R12.</p>



<p>If it is, we&#8217;ll continue with the for loop.</p>



<p>If it&#8217;s not, then we jump out of the for loop.</p>



<p>So that means probably the true case where R13 is indeed less than R12,</p>



<p>that&#8217;s going to be a short jump just into the loop&#8217;s body.</p>



<p>And the false case where R13 is not less than R12,</p>



<p>that should probably end up being a much longer jump.</p>



<p>on how big your your loop is maybe that jump is too long too far away for a conditional branching</p>



<p>instruction to reach if you&#8217;ve watched my previous videos you should know already that</p>



<p>the conditional branching instructions like jl like jump less than they can only reach about 128</p>



<p>bytes away if you try to go further than that the assembler will actually stop and block you from</p>



<p>finishing your compilation it&#8217;ll say i think it&#8217;s like jump out of range or something like that</p>



<p>So you want to try to keep the short jump points with your conditional branches.</p>



<p>And then in the false case, where the conditional branch doesn&#8217;t actually do anything,</p>



<p>then it falls through to the next instruction where you will have an unconditional jump.</p>



<p>And remember, the unconditional jumps, they don&#8217;t have a limitation of 128 bytes.</p>



<p>They can jump like all over the place.</p>



<p>Like they can jump anywhere, basically.</p>



<p>that means if you think about it, we come in to the loop top right here.</p>



<p>We immediately do a compare instruction and a conditional branch.</p>



<p>So if R13 is less than R12, meaning we should continue to for loop,</p>



<p>then we&#8217;ll just do a short jump into the loop&#8217;s body and actually execute its body.</p>



<p>And if not, we will end up falling through to line 92,</p>



<p>where there&#8217;s just an unconditional jump instruction that just says,</p>



<p>all right, let&#8217;s jump all the way down to being done.</p>



<p>Let&#8217;s jump all the way down to being done, which could be very far away for all we know.</p>



<p>Okay, so we&#8217;ve done that.</p>



<p>Now let&#8217;s implement the loops body because the first thing that we did is we wanted to</p>



<p>jump into the loop body to actually execute our instructions, which in this case, we&#8217;ll</p>



<p>just be, you know, printing a number every time we loop and then increasing that number.</p>



<p>So I&#8217;m going to do a little like new line there.</p>



<p>I&#8217;m going to paste the loop body.</p>



<p>little comments to help remind myself that this is actually the loop&#8217;s body. So for test loop body</p>



<p>that takes care of the branching instruction, hitting on that and actually going into the body.</p>



<p>And then later we&#8217;re going to have to implement a label for the loop being done. But for now,</p>



<p>we&#8217;ll just say the body. What does it do? It just prints a little message to the user.</p>



<p>If you look at the message for current number string, if I go up real fast,</p>



<p>message for current number, it&#8217;s just an arrow. So the user&#8217;s going to see an arrow and then</p>



<p>So the user is going to see an arrow and then their current number, I guess of the loop&#8217;s</p>



<p>current number.</p>



<p>And then every time it loops, it&#8217;s just going to continue printing that arrow with a number</p>



<p>on it.</p>



<p>So we&#8217;re doing that.</p>



<p>And then we&#8217;re going to say R13, which is the current counter variable, which started</p>



<p>at zero is going to get loaded into RDI, which if you watched my other videos, it&#8217;s just</p>



<p>the first integer argument for a function call.</p>



<p>So I&#8217;m just going to call this other function here, which is not part of the video to just</p>



<p>which is not part of the video to just say hey please print this number for me so the first</p>



<p>time this iterates it&#8217;s going to print zero because it&#8217;s going to print r13 and then it&#8217;s</p>



<p>going to print a new line so that the cursor goes to the next you know line of the terminal</p>



<p>so that&#8217;s all the body does it just kind of like prints the current number with an arrow and does</p>



<p>a new line and then at the very bottom of the loop body we just sort of maintain the for loop this is</p>



<p>for loop this is going to be the update part so like let&#8217;s see maybe scooch this up a little bit</p>



<p>the update part where we have let&#8217;s see on the very right side of the for loop which is like i</p>



<p>plus plus or in more assembly speak increasing the counter variable so i&#8217;m just going to increase r13</p>



<p>and then that way the loop can progress you know we&#8217;re always looking at r13</p>



<p>to decide if we need to stop or not you know we&#8217;re comparing r13 to r12</p>



<p>So we&#8217;re just increasing at the very bottom of the loop and then we unconditionally jump back up to the top.</p>



<p>Probably a better idea to unconditionally jump back up to the top because maybe the jump to the top is very very far and if it&#8217;s greater than 128 bytes it won&#8217;t work.</p>



<p>So the regular jump instruction doesn&#8217;t have that limitation. So now we&#8217;re jumping up to the loop top.</p>



<p>So you can imagine now that you know we&#8217;re not going to the initialization part. That would be bad.</p>



<p>We&#8217;re just jumping up to the top here where we immediately ask you know are we done?</p>



<p>If we&#8217;re not done, we jump into the loop body and print another number.</p>



<p>And then at the very bottom of the body, we say, all right, increase the counter and then jump back up to the top.</p>



<p>So this is a simple for loop, but you can see what it&#8217;s doing, right?</p>



<p>It&#8217;s just going to be printing a number over and over again as the number increases.</p>



<p>And then eventually it&#8217;ll stop when it hits the correct number.</p>



<p>The last thing we need is the loop done label.</p>



<p>If you look back up at the top here on line 92, if R13 was not less than R12,</p>



<p>less than r12 then execution would fall through to line 92 and there is our unconditional jump</p>



<p>instruction basically saying if r13 is not less than r12 then we&#8217;ll jump to the loop done label</p>



<p>which means we&#8217;re just totally finished with this loop so we have to make that real fast</p>



<p>and all it&#8217;s going to do is just basically say goodbye it&#8217;s just going to print a message to</p>



<p>to the restoration functions.</p>



<p>Oh, did I ruin my return somewhere?</p>



<p>Uh-oh, what did I do wrong?</p>



<p>I lost my return statement.</p>



<p>Did I accidentally delete that somehow?</p>



<p>That&#8217;s a bad program.</p>



<p>Or did I not even…</p>



<p>Hmm, I wonder if it like…</p>



<p>I wonder if I didn&#8217;t have my return statement</p>



<p>and it fell through into the CRLF function</p>



<p>and then the CRLF function returned to the caller</p>



<p>to the caller on behalf of the for test function I don&#8217;t even know only all only</p>



<p>the spirits know at this point I don&#8217;t know leave a comment or something if</p>



<p>you know what happened but every function has to have its own return for</p>



<p>sure so you know the loop done label is usually where you want to jump to when</p>



<p>you know the for loop is finished or the while loop is finished when it comes to</p>



<p>saying goodbye it probably would be a little bit more clear of me to add an</p>



<p>you know for test you know say goodbye just so that I that I remember that this</p>



<p>is this is the place where we&#8217;re done and this other place this is just</p>



<p>something else that&#8217;s happening maybe I&#8217;m doing more instructions or more</p>



<p>operations or calling a function or whatever so obviously if I did it this</p>



<p>way then the loop done label would just end up falling through to the goodbye</p>



<p>label and it would be fine but it&#8217;s just more visually clear I&#8217;m gonna take it</p>



<p>Anyway, so at this point we might have a program that actually works.</p>



<p>Let&#8217;s see if it does.</p>



<p>What else do I need to add?</p>



<p>No, I think we&#8217;re done with that.</p>



<p>Okay, let&#8217;s try it.</p>



<p>So we&#8217;ll do a make run and we&#8217;ll enter the number five and let&#8217;s see if it works or it</p>



<p>crashes.</p>



<p>It worked on the first try.</p>



<p>So I had a solution though.</p>



<p>Not fair, but I could have typoed.</p>



<p>Anyway, so it says we entered a five, the loop will print from zero to N minus one.</p>



<p>print from zero to n minus one so we should see from zero to four and so then every iteration of</p>



<p>the loop it&#8217;s just that little message we&#8217;re just printing a zero printing one printing a two you</p>



<p>know the number increases because we did did that little inc instruction the increase instruction</p>



<p>we unconditionally jump to the top of the loop where we decide if we&#8217;re supposed to uh finish</p>



<p>you know be done with the loop by jumping to the done label eventually after we uh let&#8217;s see</p>



<p>it prints this four here it&#8217;ll do the increase instruction at the bottom of the loop&#8217;s body</p>



<p>and then it&#8217;ll jump to the loop&#8217;s top then the loop&#8217;s top will see that it&#8217;s a five because we</p>



<p>just increased the four it will see that five is definitely not less than five so that&#8217;s a false</p>



<p>which means execution will you know fall through where the heck is that it&#8217;ll fall through to the</p>



<p>line 92 jump instruction which is just the loop being done so that&#8217;s here where it says goodbye</p>



<p>says goodbye and then we have successfully implemented a basic for loop</p>



<p>all right so thank you so much for watching this video I hope you learned</p>



<p>a little bit and had a little bit of fun I will see you in the next video happy</p>



<p>coding and happy studying hey everybody thanks for watching this video again</p>



<p>from the bottom of my heart I really appreciate it I do hope you did learn</p>



<p>hope you did learn something and have some fun. If you could do me a please, a small little favor,</p>



<p>could you please subscribe and follow this channel or these videos or whatever it is you do on the</p>



<p>current social media website that you&#8217;re looking at right now. It would really mean the world to</p>



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



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



<p>and subscribe. You know sometimes I&#8217;m sleeping in the middle of the night and I just wake up because</p>



<p>I know somebody subscribed or followed. It just wakes me up and I get filled with joy. That&#8217;s</p>



<p>exactly what happens every single time. So you could do it as a nice favor to me or you could</p>



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



<p>and then I&#8217;ll just wake up. I promise that&#8217;s what will happen. Also if you look at the middle of the</p>



<p>screen right now you should see a QR code which you can scan in order to go to the website which</p>



<p>at the bottom of this video and it&#8217;ll take you to my main website where you can just kind of like</p>



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



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



<p>that you want to see please leave a comment or if you just want to say hey what&#8217;s up what&#8217;s going on</p>



<p>you know just send me a comment whatever I also wake up for those in the middle of the night I get</p>



<p>I wake up in a cold sweat and I&#8217;m like,</p>



<p>it would really mean the world to me.</p>



<p>I would really appreciate it.</p>



<p>So again, thank you so much for watching this video</p>



<p>and enjoy the cool music as I fade into the darkness,</p>



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



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-for-loops-explained-yasm-tutorial/">x86-64 Assembly For Loops Explained &#8211; YASM Tutorial</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/x86-64-assembly-for-loops-explained-yasm-tutorial/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>x86-64 Assembly While Loops Explained Step by Step in YASM &#8211; From Concept to Working Program</title>
		<link>https://www.NeuralLantern.com/x86-64-assembly-while-loops-explained-step-by-step-in-yasm-from-concept-to-working-program/</link>
					<comments>https://www.NeuralLantern.com/x86-64-assembly-while-loops-explained-step-by-step-in-yasm-from-concept-to-working-program/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 25 Jan 2026 01:02:57 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[assembly control flow]]></category>
		<category><![CDATA[assembly language loops]]></category>
		<category><![CDATA[assembly language tutorial]]></category>
		<category><![CDATA[assembly while loop example]]></category>
		<category><![CDATA[computer architecture]]></category>
		<category><![CDATA[conditional jump assembly]]></category>
		<category><![CDATA[learn assembly language]]></category>
		<category><![CDATA[low level loops]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[NASM vs YASM]]></category>
		<category><![CDATA[systems programming]]></category>
		<category><![CDATA[unconditional jump]]></category>
		<category><![CDATA[while loop assembly]]></category>
		<category><![CDATA[x86 assembly loops]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[x86-64 linux assembly]]></category>
		<category><![CDATA[x86-64 programming]]></category>
		<category><![CDATA[Yasm tutorial]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=291</guid>

					<description><![CDATA[<p>This video teaches how to implement a classic while loop structure in x86-64 assembly language using YASM. We cover the conceptual mapping from C-style while(condition) { body } to assembly labels (while_top, while_body, while_done), conditional jumps (jne, je, etc.), and the unconditional jump back to the top of the loop. A complete runnable example repeatedly reads integers from the user and echoes them until 99 is entered.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-while-loops-explained-step-by-step-in-yasm-from-concept-to-working-program/">x86-64 Assembly While Loops Explained Step by Step in YASM &#8211; From Concept to Working Program</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 loading="lazy" title="x86-64 Assembly While Loops Explained Step by Step in YASM - From Concept to Working Program" width="1380" height="776" src="https://www.youtube.com/embed/JnkyFMw09Us?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>In this detailed tutorial I walk you through exactly how to implement while loops in x86-64 assembly language using YASM. We start with the basic concept of a while loop as it exists in higher-level languages like C/C++, then break it down into labels, conditional jumps, and unconditional jumps so you can see exactly how the control flow works at the assembly level.</p>



<p>I explain why we usually put the condition check at the top, how to handle the jump distances (especially the ~128-byte limit of conditional branches), why unconditional jumps are preferred for the loop-back, and how to structure init / top / body / done sections clearly.</p>



<p>We then build a complete, runnable hybrid program (assembly + tiny C++ driver) that:</p>



<ul class="wp-block-list">
<li>prints an intro message</li>



<li>repeatedly asks the user to enter numbers</li>



<li>echoes each number back</li>



<li>continues until the user enters 99</li>



<li>prints a goodbye message when finished</li>
</ul>



<p>Lots of practical tips about label naming conventions, register preservation (R12 in this case), and debugging flow are included along the way.</p>



<p>Assumed knowledge: basic x86-64 assembly, how to use a makefile, simple system calls, and calling external functions. If you&#8217;re new to those topics, check my earlier videos first.</p>



<p>Hope this helps someone finally &#8220;get&#8221; while loops in assembly!<br>Thanks for watching &#8211; subscribe if these kinds of low-level explanations are useful to you.</p>



<p>Introduction to While Loops in x86-64 YASM 00:00:00<br>While Loop Concept in High-Level Languages 00:00:56<br>Breaking Down While Loop Structure 00:02:00<br>Labeling Key Sections Top Body Done 00:02:40<br>Conditional and Unconditional Jumps Explained 00:03:26<br>Why Prefer Shorter Conditional Jumps 00:04:40<br>Diagram of While Loop Flow 00:06:52<br>Alternative While True with Internal Break 00:08:08<br>Do-While vs Regular While Difference 00:09:32<br>Program Setup and Data Section Overview 00:09:53<br>Hybrid Program Structure and External Functions 00:10:56<br>Main Function and While Test Call 00:12:56<br>While Test Function Prologue 00:13:21<br>CRLF Helper Function 00:14:00<br>Intro Message and Loop Initialization 00:14:50<br>While Top Comparison with 99 00:16:57<br>Entering the Loop Body 00:19:08<br>User Input and Echo Output 00:19:38<br>Jump Back to While Top 00:20:29<br>Exit to While Done Section 00:21:39<br>Goodbye Message and Function Epilogue 00:22:14<br>Live Demo Running the Program 00:22:30<br>Summary and Closing Remarks 00:23:12<br>Call to Subscribe and Website Mention 00:23:46</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 Blog: https://www.NeuralLantern.com</li>



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



<p>All right, hello there. In this video, I&#8217;m going to teach you how to implement while loops in YASM</p>



<p>x86-64 assembly. Although you probably don&#8217;t need to be using YASM assembly to understand</p>



<p>this video or to benefit from it. So what am I talking about? First off, okay, so we&#8217;re going</p>



<p>to do while loops. There&#8217;s a lot of assumed knowledge in this video. If you don&#8217;t know how</p>



<p>assembly program, if you don&#8217;t know how to make a make file, if you don&#8217;t know a lot</p>



<p>of the basics that I&#8217;m just skimming over in this video, you&#8217;ll need to see my other</p>



<p>videos because I explain all of those things at length.</p>



<p>For this video, I&#8217;m just going to be talking about while loops only.</p>



<p>So for starters, let&#8217;s see here and open up a little notepad here and just type a while</p>



<p>loop and try to explain a little bit about it conceptually.</p>



<p>And then after that, we&#8217;re going to, we&#8217;re going to write a program in Yasm to show that</p>



<p>we can get this to work.</p>



<p>So what is a while loop in a higher level language?</p>



<p>We&#8217;ll just suppose C or C++.</p>



<p>You can imagine whatever language you want, but typically in a while loop,</p>



<p>we&#8217;re not talking about a do while loop, although that would be really easy</p>



<p>to implement after watching this video.</p>



<p>But in a regular while loop, you have the keyword while usually,</p>



<p>and then you have some sort of an expression like does a equal B or whatever.</p>



<p>So maybe I&#8217;ll just say does a equal B?</p>



<p>Expression evaluates to true then the body of the while loop will execute and then when it&#8217;s done executing</p>



<p>Execution will go back up to look at the expression again and make sure that it&#8217;s still true</p>



<p>So the loop will run forever until that expression evaluates to false</p>



<p>Maybe that&#8217;s what you want. Maybe that&#8217;s not what you want, but that&#8217;s what it&#8217;ll do</p>



<p>And that means the body runs an endless number of times</p>



<p>Also, if the expression evaluates to false on the very first run</p>



<p>then the body of the while loop will just never run at all.</p>



<p>So that&#8217;s, you know, a basic idea of a while loop in a higher level language.</p>



<p>Hopefully you kind of already know that.</p>



<p>So let&#8217;s look at the parts right here.</p>



<p>If we imagine this as assembly,</p>



<p>then probably the first thing we should do is label the part</p>



<p>where we look at the expression and decide whether we&#8217;re going to continue or not, right?</p>



<p>So I&#8217;m going to put a little label here</p>



<p>and maybe we&#8217;ll call it a while top or something.</p>



<p>You know, whatever you want to do.</p>



<p>just to label the part of the code</p>



<p>So that we know when we write assembly</p>



<p>We&#8217;ll be able to put the appropriate labels on the different parts of the while loop and we&#8217;ll be able to imagine</p>



<p>The while loop that we&#8217;re implementing in assembly</p>



<p>So I&#8217;m gonna say this is the top or you can call it the eval part whatever you want</p>



<p>Then we&#8217;ll make another label down here. We&#8217;ll call it</p>



<p>You know while body something like that and so basically if we want to jump up to the top of the while loop to evaluate the</p>



<p>expression, we just have to basically jump to that label called while top.</p>



<p>And if we want to jump to the body to actually execute the code,</p>



<p>then we just have to jump to that other label instead. We should also have a label at the</p>



<p>very bottom after the whole while loop is over and we&#8217;ll call it, you know, while finished</p>



<p>or while, whoops, finished or while done or while over something like that. So I&#8217;m just going to</p>



<p>Now you can imagine that when we&#8217;re at the top of the while loop and we see that the</p>



<p>expression is false, then we can just jump down to the done label, thereby exiting the</p>



<p>entire while loop.</p>



<p>Then of course we probably want to have some jump statements in here.</p>



<p>So for example, the expression part here, it&#8217;s probably going to jump either to the</p>



<p>body or either to the done area based on whether or not the expression evaluated to true or</p>



<p>false.</p>



<p>label while top you know which contains a conditional branch and then like an unconditional</p>



<p>jump so if a condition is true maybe we can jump into the body if the condition is false we&#8217;ll fall</p>



<p>through to the next statement and do an unconditional jump to the done label if you don&#8217;t</p>



<p>know conditional branching this is another one of the topics that i&#8217;ve covered in previous videos</p>



<p>as we implement the while loop.</p>



<p>So just keep in mind, there are other videos that I have</p>



<p>that you should watch first</p>



<p>if you don&#8217;t understand conditional branching or jumps.</p>



<p>The reason that I&#8217;m going to kind of design</p>



<p>the jumps like this where I&#8217;m going to say,</p>



<p>let&#8217;s do a conditional branch.</p>



<p>And basically if the loop evaluates to true,</p>



<p>we&#8217;ll jump into the body of the loop.</p>



<p>And if it doesn&#8217;t evaluate to true,</p>



<p>then the conditional branch will allow execution</p>



<p>to fall through down to the next statement,</p>



<p>which will simply contain a jump to the done portion.</p>



<p>to the done portion so basically as soon as the while loop is ready to break it gets uh implemented</p>



<p>by an unconditional jump which was fallen through to by the conditional branch that would only jump</p>



<p>into the body if uh expression was true i&#8217;m doing it this way because it&#8217;s usually a shorter jump</p>



<p>uh to jump to the true area you know the the body of the while loop and remember conditional</p>



<p>branching instructions have a maximum you know jump reach of about 128 bytes so if you try to</p>



<p>128 bytes. So if you try to jump too far, like for example, if you wanted to, you could reverse</p>



<p>the logic to where you could say, if an expression is true, let&#8217;s jump to the done portion and say,</p>



<p>we&#8217;re going to break the loop. If the expression was false, we&#8217;ll jump into the body. You could</p>



<p>do that. But then if the body of your while loop was too long, maybe it was so long that the last</p>



<p>instruction was greater than 128 bytes away from the top. Then by the time you wanted to</p>



<p>let&#8217;s see yeah if you have if you have too long of while loops you can&#8217;t jump more than 128</p>



<p>instructions away so that&#8217;s a limitation of contentional branching so I just I want to put</p>



<p>the biggest jump on an unconditional jump instruction because it doesn&#8217;t have a limitation</p>



<p>like that I was having a hard time imagining what I was about to say just now for the</p>



<p>the reversal I guess I&#8217;m just going to ignore the reversal scenario and we&#8217;ll just do it the</p>



<p>and we&#8217;ll just do it the regular way.</p>



<p>Anyway, so we want to have a conditional jump that either jumps into the body or to the done area.</p>



<p>And then at the very bottom, we want to have an unconditional jump to the top,</p>



<p>which basically means every time we get to the bottom of the while loop body,</p>



<p>we&#8217;re just going to jump up to the while top.</p>



<p>Actually, I&#8217;ll just say to while top.</p>



<p>Remember again, the regular jump instructions,</p>



<p>maybe I&#8217;ll take out the U here.</p>



<p>The regular jump instructions don&#8217;t have a limitation</p>



<p>on how far they can jump.</p>



<p>So that should be fine.</p>



<p>And that&#8217;s the basic idea of implementing a while loop.</p>



<p>Maybe I should draw just a quick diagram</p>



<p>before we start looking at the code,</p>



<p>just to make sure everybody of different learning styles</p>



<p>understands what I&#8217;m talking about.</p>



<p>So we&#8217;ll, let&#8217;s see, eval.</p>



<p>I&#8217;m still adjusting my pen and you know what?</p>



<p>You know what? It looked a lot better before I hit record.</p>



<p>Eval the expression.</p>



<p>So I&#8217;m going to first evaluate the expression.</p>



<p>If it evaluates to true, we&#8217;ll put a green arrow here and I&#8217;ll put like a T for true.</p>



<p>Then this will be the body of the while loop.</p>



<p>I&#8217;ll say like the body.</p>



<p>If it evaluates to false, let&#8217;s see.</p>



<p>I&#8217;ll just put that in red and I&#8217;ll put an F here then this is just going to be the done area</p>



<p>right so you can imagine we evaluate an expression using the compare instruction in assembly and</p>



<p>based on the results of comparing something whatever it is that your condition is then we</p>



<p>you know we we either branch to the done area or we branch to the to the body area</p>



<p>want to have a more complicated while loop and you don&#8217;t want to put a huge</p>



<p>amount of expressions or if you don&#8217;t want to logically concatenate a bunch of</p>



<p>different components into the expression you know that&#8217;s fair I usually write my</p>



<p>while loops in real life as just while true and then I break when certain</p>



<p>conditions are met you can do that too we&#8217;re not going to talk about that in</p>



<p>this video but you could just have a while true so you always jump to the top</p>



<p>and there&#8217;s no branching that goes to while done but then throughout the loop</p>



<p>loop you can just sort of check to see if certain conditions are met and if they are then you&#8217;ll do</p>



<p>a branch to the done area and if they&#8217;re not then by the time you make it down to the bottom of the</p>



<p>loop then it just automatically jumps to the top although you got to make sure with the the reach</p>



<p>of conditional branching you probably want to test to see if your condition is true or false or</p>



<p>whatever if it means we&#8217;re going to continue the loop then you probably just want to do a conditional</p>



<p>then you probably just want to do a conditional branch that jumps down a little bit</p>



<p>so that it can continue the body of the loop.</p>



<p>And then the part that it skipped over,</p>



<p>just a little part should be an unconditional jump that jumps out of the loop.</p>



<p>That way, it doesn&#8217;t matter how big your while loop body is,</p>



<p>you can always jump out of the loop.</p>



<p>But we&#8217;re not going to talk about that in this video.</p>



<p>Anyway, so we evaluate the expression.</p>



<p>If it&#8217;s true, we go to the body.</p>



<p>If it&#8217;s false, we go to done.</p>



<p>After the body is done executing,</p>



<p>then we just jump back up to the top where we evaluate the expression.</p>



<p>where we evaluate the expression.</p>



<p>I&#8217;ll put while here just to make it more clear that we&#8217;re talking about the basic</p>



<p>idea of a while loop.</p>



<p>Not too hard, you know.</p>



<p>And then if you wanted to implement a do while loop, just make sure that you always</p>



<p>evaluate the body at least once.</p>



<p>That&#8217;s really the only difference.</p>



<p>But that&#8217;s up to you.</p>



<p>This is just a regular while loop video.</p>



<p>Okay.</p>



<p>So we&#8217;ve kind of talked about it a little bit.</p>



<p>We&#8217;ve sort of, you know, drawn it out in a diagram and put some regular code in.</p>



<p>and put some regular code in let&#8217;s set up an actual assembly program that will do this so for starters</p>



<p>again i&#8217;m not going to show you my make file because i&#8217;ve already made other videos where i</p>



<p>explained how to make a make file from scratch same thing goes for hybrid programs i&#8217;m going</p>



<p>to have a driver which is a c plus plus module that just sort of calls on this assembly module</p>



<p>if you want to know how to make hybrid programs or you know drivers or you know whatever see my</p>



<p>to be talking about looping only. Okay, so let me get my solution up here. My source code is called</p>



<p>looper. And I&#8217;m just going to copy paste the data section for my program real fast, just so you can</p>



<p>see it. Okay, so here&#8217;s the data section. Again, this is not a basics for assembly video. If you</p>



<p>don&#8217;t know how to do a data section in Yasm, see my other videos. But for now, I&#8217;m just going to say</p>



<p>like the actual array of bytes and then a length and all I&#8217;m doing is printing out messages you</p>



<p>know begin the wild test your numbers will be printed back to you until you decide to quit so</p>



<p>that&#8217;s going to be printed to the user right away then every time the program wants a number from</p>



<p>the user it&#8217;ll just ask you know please enter a number or 99 to quit and then it&#8217;ll prefix</p>



<p>the echo back it&#8217;ll say you entered and then it will actually print the number and then when you</p>



<p>we&#8217;re done and i&#8217;m going to use an external uh function that i have available to just kind of</p>



<p>like input and output numbers this video is not about uh input and outputting and external libraries</p>



<p>if you&#8217;re interested you could probably just link a hybrid program and use printf and scan</p>



<p>f to very easily do input and output but that&#8217;s not what this video is about see my other videos</p>



<p>then i have crlf which is just a carriage return in line feed uh you know select the cursor goes</p>



<p>You know select the cursor goes to the next line and then I have like a system call code to just print and</p>



<p>Then a file descriptor just to print a standard output again. That&#8217;s explained in other videos</p>



<p>So now I&#8217;m ready to start copy pasting the main portion of my program</p>



<p>So first off I&#8217;m going to start the text section, which is where the instructions go in the ASM</p>



<p>So there it is and then I&#8217;m going to copy paste</p>



<p>of external symbols. So I just have a little library that I&#8217;m using that makes it easier for</p>



<p>me to input and output integers. So you can do this any way you want, or you can hard code a</p>



<p>number in the globals area. If you don&#8217;t want to deal with input and output while you&#8217;re learning</p>



<p>how to do loops, that&#8217;s totally fine. But then the entry point is going to be a function called</p>



<p>looper. So this is my function. And again, this is a hybrid program. So the main function or the</p>



<p>be present in my assembly module the driver is going to be a c plus plus module that just calls</p>



<p>on a function named looper so that means this function is going to get called from another</p>



<p>module and that&#8217;s why i have to mark it as global and then it is a function so i&#8217;m going to call</p>



<p>return at the end of it to say we&#8217;re done and then within this function i&#8217;m just going to call two</p>



<p>other functions that i&#8217;m about to create one is called while test which is going to actually do</p>



<p>the while loop and the other is called crlf which just print which just prints a new line for me i</p>



<p>which just prints a new line for me.</p>



<p>I don&#8217;t know why I do it that way, but I want to.</p>



<p>Sorry, not sorry.</p>



<p>So this is the real meat of the function here.</p>



<p>Let&#8217;s start, well, the real meat of the code or the video.</p>



<p>Let&#8217;s start a function called while test.</p>



<p>You can see it&#8217;s got a void signature with no arguments,</p>



<p>so it doesn&#8217;t really, you know, take anything or return anything.</p>



<p>I&#8217;m going to use register R12 to hold the user&#8217;s input</p>



<p>so that I can, you know, print it out and stuff.</p>



<p>print it out and stuff so that means I have to do a preservation of R12 because it&#8217;s a</p>



<p>callee saved for the ABI which you should respect so I&#8217;m going to push it at the beginning</p>



<p>and then I&#8217;m going to pop it at the end and then this is a function so I have to return</p>



<p>at the end of the function let me just double check that there&#8217;s nothing else weird at the</p>



<p>bottom of that nope okay so we&#8217;ve got the prologue and epilogue the wild test function</p>



<p>maybe I should copy paste my crlf real fast my crlf function it&#8217;s just sad but</p>



<p>it&#8217;s also kind of cute right it does nothing except just print out a new line</p>



<p>that&#8217;s all it does this video is not about that so at this point I should</p>



<p>have a program that probably works let&#8217;s see if it does I&#8217;m gonna do clear and</p>



<p>make run again if you want to know how to use make files or compile or link or</p>



<p>anything like that see my other videos so I&#8217;m gonna run it and it just says</p>



<p>which is some code that we&#8217;re not looking at.</p>



<p>And then it says it&#8217;s regain control.</p>



<p>And this line in the middle, which is just an empty new line,</p>



<p>that&#8217;s definitely from the assembly program.</p>



<p>Because at the top here we have CRLF.</p>



<p>If I call it multiple times CRLF,</p>



<p>then you&#8217;ll see there are multiple blank lines.</p>



<p>All right, I&#8217;m gonna take that out.</p>



<p>Now let&#8217;s continue with while test.</p>



<p>So what should we do here?</p>



<p>The first thing that we should do is print an intro message</p>



<p>message just to let the user know that we&#8217;re about to you know begin our while</p>



<p>tests and if we run the program one more time we should see that message now</p>



<p>begin the while test your numbers will be printed back to you system calls and</p>



<p>simple printing is covered in other videos so now uh you know for me I kind</p>



<p>of like to init all of my loops even if it&#8217;s a while loop and not just a for</p>



<p>loop or anything so I always have an extra label that I like to call init</p>



<p>or before or something like that.</p>



<p>So I have a label now called while test underscore init,</p>



<p>and it&#8217;s just where I&#8217;m gonna initialize</p>



<p>whatever it is that I think I need to initialize</p>



<p>so that the loop will actually work.</p>



<p>If you look here, all I&#8217;m really doing is setting R12 to zero</p>



<p>because what I&#8217;m gonna do is stop the loop.</p>



<p>I&#8217;m gonna break the loop whenever the user enters a 99.</p>



<p>So I don&#8217;t know what&#8217;s inside of R12</p>



<p>when we first start this function.</p>



<p>And I just wanna make sure that it&#8217;s not 99,</p>



<p>the stopping number at the very start so I&#8217;m just going to set it to zero. So</p>



<p>another note about my labels you don&#8217;t have to do it this way but I love to</p>



<p>write labels where the first part of the label is always the function that the</p>



<p>label is inside of so notice how the function is named while test and so my</p>



<p>label is always while test underscore something and I&#8217;m putting init here</p>



<p>just to say we&#8217;re initializing the loop but if you had a function that had a</p>



<p>had a lot of stuff going on in it for starters you should probably be breaking up that function</p>



<p>into multiple functions but but assuming you didn&#8217;t uh you should probably do another underscore</p>



<p>and then like another component and then another underscore based on what giant chunk of your</p>



<p>function you&#8217;re inside of so if there was like an if part a while part an input part an output part</p>



<p>you probably want to you know stick that into your labels your labels will get huge but for me</p>



<p>infused in assembly and this makes it easier.</p>



<p>So we&#8217;re going to initialize so that we can run our while loop and then the next thing</p>



<p>we&#8217;re going to do is implement the top of the while loop.</p>



<p>So remember if we looked at this code up here, maybe if I drag this over to the side and</p>



<p>pin it to the top for a little while, you can see that the top of the while loop is</p>



<p>where we kind of evaluate the expression to see if we need to keep going or not.</p>



<p>jump into the ending area, the done area. So the top, whoops, the top is always for that.</p>



<p>We&#8217;ll say first, I&#8217;m going to ask, are we done? So, you know, how do we know if we&#8217;re done?</p>



<p>In this particular while loop, we want to compare the user&#8217;s input, which is R12 to the number 99.</p>



<p>And if it&#8217;s equal, then we will quit, which means also if it&#8217;s not equal, we will jump into the</p>



<p>So by the way, you&#8217;re probably wondering how did R12 get the user&#8217;s input?</p>



<p>Well, we&#8217;re going to do that as the next step.</p>



<p>And of course, your design pattern may vary a little bit.</p>



<p>No, that&#8217;s okay.</p>



<p>I just like to implement it this way.</p>



<p>So first thing we&#8217;re going to do is compare R12 with 99.</p>



<p>And that&#8217;s why I&#8217;ve written this comment here, just like the blank while comparison part.</p>



<p>And I guess I could have put this R12 not equal to 99 up at the top, but then it kind</p>



<p>of feels like I&#8217;m leaving these other two instructions.</p>



<p>So I moved it down one.</p>



<p>these other two instructions so I moved it down one so basically as long as you know we compare</p>



<p>R12 and 99 compare and conditional branching is covered in other videos but we compare those two</p>



<p>values and then we say if R12 is not equal to 99 then jump to the body and we expect that the body</p>



<p>will be like a short jump which will be within the range of a conditional branch</p>



<p>So anyway, if the not equal branch didn&#8217;t happen, that means R12 is equal to 99.</p>



<p>At that point, execution falls through to line 84, and we&#8217;ll just unconditionally jump out of the while loop.</p>



<p>So basically we&#8217;re saying, if it&#8217;s true, we continue looping.</p>



<p>If it&#8217;s not true, we just jump outside of the loop.</p>



<p>We&#8217;re just totally done with the while loop.</p>



<p>Okay.</p>



<p>So then we need a body, because obviously we&#8217;re going to jump into the body here.</p>



<p>that means I&#8217;m going to just copy paste another little set of code here.</p>



<p>Right after that unconditional jump.</p>



<p>So now we got the body.</p>



<p>Notice how I put a little comment here that has a brace just to indicate to you,</p>



<p>hey, this is the beginning of the actual while loop body,</p>



<p>just to make it a little bit more clear.</p>



<p>And what are we going to do inside of the body?</p>



<p>We&#8217;re just going to ask the user for some input.</p>



<p>So I&#8217;m printing a simple message here,</p>



<p>and then I&#8217;m calling on my helper function</p>



<p>to just actually input a number from the user.</p>



<p>I&#8217;m going to store that number into R12.</p>



<p>So that&#8217;s how R12 gets the numbers, gets the user&#8217;s input.</p>



<p>And the way I&#8217;ve written this, if the user enters a 99,</p>



<p>it&#8217;ll echo it back to the user and then it&#8217;ll break the loop afterwards.</p>



<p>So, you know, if you wanted to rearrange things like I talked about before,</p>



<p>where you input before you check to see if you&#8217;re going to keep going, you could do that.</p>



<p>But it would be a little harder to echo the user&#8217;s input back to them before you break.</p>



<p>I don&#8217;t know. It&#8217;s up to you.</p>



<p>I don&#8217;t know it&#8217;s up to you anyway so we grab input from the user and then we print another</p>



<p>message basically saying here&#8217;s the thing that you inputted no problem and then again we use</p>



<p>one of my helper functions to actually spit the number back out at them so this is not</p>



<p>a very complicated body it&#8217;s just asking for a number and then printing the number back to them</p>



<p>and then after that I&#8217;m going to do another label and I&#8217;m going to call it the body bottom</p>



<p>we don&#8217;t really have to do this label but for clarity I think it&#8217;s probably a good idea</p>



<p>I think it&#8217;s probably a good idea.</p>



<p>So the very bottom of the while loop&#8217;s body is usually where you don&#8217;t do any more instructions</p>



<p>that are part of the work of the while loop&#8217;s body,</p>



<p>but just sort of the place where you jump back up to the top</p>



<p>so you can evaluate and decide to continue or not again.</p>



<p>So notice how I&#8217;m using an unconditional jump here.</p>



<p>That&#8217;s a good idea because again, if you have like a huge while loop body,</p>



<p>you might end up surpassing the threshold of 128 bytes</p>



<p>of 128 bytes and then you&#8217;ll get a assembler error that says</p>



<p>I can never remember this. It&#8217;s like a</p>



<p>jump out of range error or something like that. Basically, if you do a conditional branch to jump up the top</p>



<p>because some people like to check to see</p>



<p>if they should continue the loop, they like to check for that at the bottom. I&#8217;ve done that before.</p>



<p>And then if true, then we&#8217;ll jump to the top of the loop. But if the loop is too big, that won&#8217;t work. So</p>



<p>I just like to take a long jump to the top of the loop and then decide if I&#8217;m going to keep going at the very top.</p>



<p>if I&#8217;m going to keep going at the very top. And then there&#8217;s a comment saying, hey, that&#8217;s the</p>



<p>end of the body. Okay, no problem. Now let&#8217;s do the done label, which is basically where we jump</p>



<p>if the loop is actually finished. So remember, if this expression right here evaluates to false,</p>



<p>then execution is going to fall through to line 84, where we jump to this while test done label.</p>



<p>And so I&#8217;m just going to put the while test done label right here. So we&#8217;re done. So the done is</p>



<p>So we&#8217;re done. So the done is not part of the loop. It comes after the loop. That&#8217;s this right</p>



<p>here on line nine of the little notepad. And we can just kind of do whatever we want. At that</p>



<p>point, we can return to a caller, we can just do other stuff, we can, you know, do a different</p>



<p>loop or, you know, whatever, we&#8217;re just done with the original loop. For me, I&#8217;m just going to say</p>



<p>goodbye with this little print to just sort of like, you know, print an exit message. And then</p>



<p>we&#8217;ll do the epilogue where we restore R12. And then we just return to the caller,</p>



<p>the driver worry about exiting the program okay so if we&#8217;ve done this correctly we should now have</p>



<p>a working program let&#8217;s see let&#8217;s see okay let&#8217;s enter a number let&#8217;s do 22 and it says you enter</p>



<p>22 and let&#8217;s do 55 and we just we can enter any numbers we want and as long as we&#8217;re not entering</p>



<p>99 the program will just continue forever so this is a while loop if i want to quit i do 99</p>



<p>breaks at the top it breaks by jumping down to the done area where we print our goodbye message</p>



<p>which just is end while test and then if we run this again if i do 99 from the start then it just</p>



<p>immediately breaks you know it prints out what you entered but then it immediately breaks</p>



<p>and that&#8217;s it that&#8217;s uh the basics for how to write a while loop you just use basically</p>



<p>layered on top of an abstract concept of what you think a while loop is,</p>



<p>or what I guess the world thinks a while loop is.</p>



<p>Okay, thank you so much for watching this video.</p>



<p>I hope you learned a little bit of stuff and had a little bit of fun.</p>



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



<p>Hey everybody.</p>



<p>Thanks for watching this video again from the bottom of my heart.</p>



<p>I really appreciate it.</p>



<p>I do hope you did learn something and have some fun.</p>



<p>if you could do me a please a small little favor could you please subscribe and follow this channel</p>



<p>or these videos or whatever it is you do on the current social media website that you&#8217;re looking</p>



<p>at right now it would really mean the world to me and it&#8217;ll help make more videos and grow this</p>



<p>community so we&#8217;ll be able to do more videos longer videos better videos or just i&#8217;ll be able</p>



<p>to keep making videos in general so please do do me a kindness and uh and subscribe you know</p>



<p>I&#8217;m sleeping in the middle of the night and I just wake up because I know somebody subscribed or followed.</p>



<p>It just wakes me up and I get filled with joy.</p>



<p>That&#8217;s exactly what happens every single time.</p>



<p>So you could do it as a nice favor to me or you could troll me if you want to just wake me up in the middle of the night.</p>



<p>Just subscribe and then I&#8217;ll just wake up.</p>



<p>I promise that&#8217;s what will happen.</p>



<p>Also, if you look at the middle of the screen right now, you should see a QR code which you can scan in order to go to the website,</p>



<p>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 all the videos</p>



<p>i published and the services and tutorials and things that i offer and all that good stuff and</p>



<p>if you have a suggestion for uh uh clarifications or errata or just future videos that you want to</p>



<p>see please leave a comment or if you just want to say hey what&#8217;s up what&#8217;s going on you know</p>



<p>just send me a comment whatever i also wake up for those in the middle of the night i get</p>



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



<p>So again, thank you so much for watching this video and</p>



<p>enjoy the cool music as I fade into</p>



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



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-while-loops-explained-step-by-step-in-yasm-from-concept-to-working-program/">x86-64 Assembly While Loops Explained Step by Step in YASM &#8211; From Concept to Working Program</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/x86-64-assembly-while-loops-explained-step-by-step-in-yasm-from-concept-to-working-program/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Learn Conditional Branching in x86-64 Assembly (YASM/NASM) &#8211; CMP, JE, JNE, JL, JG &#038; More</title>
		<link>https://www.NeuralLantern.com/learn-conditional-branching-in-x86-64-assembly-yasm-nasm-cmp-je-jne-jl-jg-more/</link>
					<comments>https://www.NeuralLantern.com/learn-conditional-branching-in-x86-64-assembly-yasm-nasm-cmp-je-jne-jl-jg-more/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 18 Jan 2026 00:49:38 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[assembly language tutorial]]></category>
		<category><![CDATA[assembly programming]]></category>
		<category><![CDATA[cmp instruction]]></category>
		<category><![CDATA[computer architecture]]></category>
		<category><![CDATA[conditional branching]]></category>
		<category><![CDATA[conditional jumps]]></category>
		<category><![CDATA[Ed Jorgensen]]></category>
		<category><![CDATA[JE JNE]]></category>
		<category><![CDATA[JL JG]]></category>
		<category><![CDATA[jump out of range]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[NASM tutorial]]></category>
		<category><![CDATA[operating systems programming]]></category>
		<category><![CDATA[reverse engineering]]></category>
		<category><![CDATA[signed unsigned jumps]]></category>
		<category><![CDATA[x86 assembly]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[Yasm tutorial]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=287</guid>

					<description><![CDATA[<p>Learn how conditional branching really works in x86-64 assembly using CMP and conditional jumps like JE, JNE, JL, JG. See signed vs unsigned comparison instructions and real code examples that show how if-statements are implemented at the machine level.</p>
<p>The post <a href="https://www.NeuralLantern.com/learn-conditional-branching-in-x86-64-assembly-yasm-nasm-cmp-je-jne-jl-jg-more/">Learn Conditional Branching in x86-64 Assembly (YASM/NASM) &#8211; CMP, JE, JNE, JL, JG &amp; More</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 loading="lazy" title="Learn Conditional Branching in x86-64 Assembly (YASM/NASM) - CMP, JE, JNE, JL, JG &amp; More" width="1380" height="776" src="https://www.youtube.com/embed/aB_BOp0KCh8?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>In this practical x86-64 assembly language tutorial we dive deep into conditional branching using YASM (also works with NASM) on Ubuntu/Linux.</p>



<p>We cover:</p>



<ul class="wp-block-list">
<li>The CMP instruction and how it sets the RFLAGS register</li>



<li>All major conditional jump instructions (JE, JNE, JL, JLE, JG, JGE, JB, JBE…)</li>



<li>Important difference between signed (JL/JG) vs unsigned (JB/JA) jumps</li>



<li>Real code examples showing how to implement if-style decisions</li>



<li>How to handle the &#8220;jump out of range&#8221; assembler error</li>



<li>Visual flow diagrams explaining control flow</li>
</ul>



<p>Perfect for students learning low-level programming, reverse engineering, operating systems, or anyone who wants to understand how if-statements, comparisons, and decisions are actually implemented at the machine level.</p>



<p>Highly recommended companion resource: Professor Ed Jorgensen&#8217;s free x86-64 Assembly Language Programming book (linked in comments).</p>



<p>Enjoy learning assembly!</p>



<p>Intro to Conditional Branching in Assembly 00:00:00<br>Recommended Book: x86-64 Guide by Ed Jorgensen 00:00:23<br>Unconditional vs Conditional Jumps 00:01:39<br>How Conditional Branching Works 00:02:06<br>The CMP Instruction Explained 00:03:21<br>Overview of Conditional Jump Instructions 00:04:50<br>Signed vs Unsigned Jump Instructions 00:06:10<br>Jump Equal &amp; Jump Not Equal (JE/JNE) 00:07:00<br>Main Conditional Jumps Summary 00:08:14<br>Starting the Code Example 00:09:09<br>Program Structure &amp; Printing Setup 00:10:35<br>Function Prologue &amp; Getting User Input 00:13:21<br>First Branch: Is Number Greater Than 0? 00:15:17<br>Live Demo: Testing Greater Than Zero 00:21:53<br>Second Branch: Is Number Less Than 10? 00:22:52<br>Live Demo: Testing Range 0-10 00:26:06<br>Third Branch: Is Number == 5? 00:26:52<br>Live Demo: Testing Equal to 5 00:28:00<br>Jump Out of Range Error &amp; Workaround 00:29:00<br>Final Summary &amp; Closing 00:32:17<br>Thanks &amp; Call to Subscribe 00:32:57</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 Blog: https://www.NeuralLantern.com</li>



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



<p>Hey there. In this video,</p>



<p>we&#8217;re going to talk about conditional branching in an assembly program.</p>



<p>We&#8217;re going to be looking at YASM x86-64 assembly or AMD 64 assembly</p>



<p>within Ubuntu, but this will probably be a useful video.</p>



<p>If you&#8217;re just thinking about how to branch in assembly in general.</p>



<p>So for starters, I&#8217;m going to promote one of my favorite books,</p>



<p>as I often do. This is a book that is free and open source. You can get a copy yourself. I did</p>



<p>not write this. The author of this book is a genius. His name is Professor Ed Jorgensen, PhD.</p>



<p>He made this whole book and released it under an open source license. So you can literally just go</p>



<p>to his website and get a copy of this for free. You can use this to make yourself into an assembly</p>



<p>expert. So I highly recommend this to everybody. Anyway, so I&#8217;m going to open up this book. I&#8217;m</p>



<p>up this book i&#8217;m going to assume that maybe you&#8217;ll get a copy or you&#8217;re just going to follow along</p>



<p>with what i&#8217;m doing on the screen but i&#8217;m going to open this book and i&#8217;m going to go to section 7</p>



<p>which is entitled instruction set overview i&#8217;m going to double click it so open out open the</p>



<p>subsections and then i&#8217;m going to click on 7.7 control control instructions and then under that</p>



<p>i&#8217;m going to click on 7.7.3 conditional control instructions so uh that&#8217;s a lot of subsections</p>



<p>So that&#8217;s a lot of subsections, isn&#8217;t it? I love a book with a ton of subsections. It makes things so much easier to find</p>



<p>If you or someone you know is going to write a book, especially if it&#8217;s technical, please use lots and lots of subsections</p>



<p>Anyway, so conditional control instructions in my last video</p>



<p>We talked about the jump instruction where we can just be sitting somewhere in our program and then just jump somewhere else</p>



<p>Anywhere we want based on the label so conditional branching or conditional control instructions</p>



<p>conditional control instructions are kind of the same thing except they will</p>



<p>decide whether or not to actually jump they might fall through to the next</p>



<p>instruction or they might jump away to somewhere else so conditional branching</p>



<p>or conditional jumping it basically kind of goes like this step one you compare</p>



<p>two values to each other they will probably be sitting in registers and then</p>



<p>conditional branching instruction or a conditional jump instruction there&#8217;s</p>



<p>lots of synonyms for these but basically in the regular jump instruction that I</p>



<p>just talked about in the last video you just jumped and it was only one thing</p>



<p>that you had to do but in this case we first have to compare two items and then</p>



<p>we&#8217;ll issue the jumping instruction because the jumping instruction will</p>



<p>have to decide whether to jump or not based on the result of your comparison</p>



<p>which makes sense right like if you&#8217;re going to implement something that&#8217;s like</p>



<p>if you know I&#8217;ll put like a expr for expression then well the first thing that we have to decide</p>



<p>before we jump either into the block of the if or if we jump into the block of the else is whether</p>



<p>or not that expression is true right so that&#8217;s kind of what the compare instruction is doing</p>



<p>sort of in higher level languages like c++ it can get a lot more complicated than that but you know</p>



<p>Okay, so we&#8217;re going to do conditional branching instructions.</p>



<p>Let me show you a few of those.</p>



<p>Okay, so for starters, here&#8217;s the compare instruction right here on page 126.</p>



<p>I think it&#8217;s actually 127 in the PDF, but basically, you know, 126.</p>



<p>We do CMP followed by two operands.</p>



<p>So if we want to compare, I don&#8217;t know, let&#8217;s say R12 with R13, that&#8217;s how you would do it.</p>



<p>just a two operand instruction there&#8217;s no results that are going to get stored in one of these</p>



<p>operands both of these operands are just for input the result actually gets stored in a special</p>



<p>register called r flags which we hardly ever use or look at in in the most common assembly</p>



<p>instructions and design patterns we just kind of like let the r flags do whatever it&#8217;s going to do</p>



<p>and the compare instruction will fill that up so imagine that you know depending on whether r13 is</p>



<p>is like greater than r12 or less than or they&#8217;re equal or something else is going on between the</p>



<p>two of them the compare instruction just fills up all sorts of flags defining the relationship</p>



<p>between those two registers or those two operands r12 and r13 and then after the r flags register</p>



<p>is all set up then the conditional branching instruction will sort of rely on r flags in</p>



<p>order to decide whether or not it&#8217;s going to jump or not okay so let&#8217;s see there are tons</p>



<p>there are tons of conditional well not tons i guess like half a page worth but there are lots</p>



<p>of conditional branching instructions we can use the first two i want to show you and after this</p>



<p>by the way i&#8217;m going to write a sample program just to show you how it is in practice but so the</p>



<p>first one is je which means let&#8217;s jump if the two operands were equal so again you know we compare</p>



<p>here we&#8217;ll say sets up r flags and then we&#8217;ll decide like what we&#8217;re going to do are we going</p>



<p>to jump if they&#8217;re equal to some label i&#8217;ll write some label here so that means uh the je instruction</p>



<p>will look at the r flags register and decide did compare think that r12 and r13 were equal if it</p>



<p>did then we&#8217;ll jump if not execution will fall down to the next line so i&#8217;ll put a nope instruction</p>



<p>So if they were equal, then we&#8217;ll end up jumping to some label.</p>



<p>And if they were not equal, we&#8217;ll end up letting execution fall through to the nope on line 10.</p>



<p>And same thing for jump not equal and all these other ones.</p>



<p>But there are actually two different versions of some of these instructions that kind of seem the same.</p>



<p>Like for instance, this one right here, JL, that means jump if the first operand was less than the second operand.</p>



<p>is a jump below that jumps also if the first operand was less than the second operand so</p>



<p>what&#8217;s the difference between these two let me get my pen I love excuses to do my little pen now</p>



<p>well I&#8217;ve got my pen it&#8217;s working oh I erased it okay okay it&#8217;s working anyway so notice how jump</p>



<p>less than and jump below are basically doing the same thing but there&#8217;s one difference one of them</p>



<p>One of them works on signed operands and one of them works on unsigned operands.</p>



<p>So keep this in mind.</p>



<p>If you&#8217;re comparing two signed integers, you want to use this group up here of instructions.</p>



<p>But if you&#8217;re using unsigned integers or just bits, then you want to use this group of instructions down here.</p>



<p>And you definitely want to know what kind of data you have that you&#8217;re comparing.</p>



<p>Notice though that jump equal and jump not equal, they don&#8217;t really care.</p>



<p>not equal they don&#8217;t really care if the operands are signed or unsigned that&#8217;s because if you want</p>



<p>to check to see if two things are equal you just look at all of their bits and if all of their</p>



<p>bits are the same then you just say they&#8217;re equal you don&#8217;t even care actually if it&#8217;s a signed or</p>



<p>unsigned integer if it&#8217;s a float if it&#8217;s a whatever you just you just go are all the bits equal or are</p>



<p>at least one of the bits unequal then we&#8217;ll say it&#8217;s equal or not equal that&#8217;s it so keep that in</p>



<p>mind for all of your jump instructions where you&#8217;re trying to see if things are equal or not</p>



<p>or not equal you&#8217;re going to definitely be using these whether you&#8217;re using signed or unsigned</p>



<p>integers or floats or anything else like that but when it comes to actually you know integers that</p>



<p>are signed or unsigned these are the instructions you use for signed and these are the instructions</p>



<p>whoops that you use for what have i done that you&#8217;ll use for unsigned i keep confusing the on</p>



<p>off button for the red button is what i&#8217;m doing oh okay whatever i guess we&#8217;re done anyway</p>



<p>I guess we&#8217;re done anyway.</p>



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



<p>In this video, we&#8217;re just going to be using the signed integer instructions</p>



<p>because that&#8217;s the example that I have set up.</p>



<p>But just imagine you could very easily translate this to unsigned integers or floats.</p>



<p>Okay, so let&#8217;s see.</p>



<p>We&#8217;ve got jump less than, we&#8217;ve got jump less than or equal to,</p>



<p>then we&#8217;ve got jump greater than, and then we&#8217;ve got jump greater than or equal to.</p>



<p>And when you combine those with jump equal to or jump not equal to,</p>



<p>jump not equal to that&#8217;s pretty much all the comparison that you need and if you want to do</p>



<p>something much much more complex well then you can just you know start stacking logic on top of</p>



<p>logic and and branching on top of branching to do something that&#8217;s like this is what i&#8217;m talking</p>



<p>like if you want to do this expression and expression or expression and then maybe like a</p>



<p>expression, right? If you want to do something super complicated, like we can do in a higher</p>



<p>level language, you&#8217;re just going to have to make a bunch of mini jumps or find another</p>



<p>way to reduce your logic. But in this video, we&#8217;re just going to be taking a very simple</p>



<p>comparison. All right. So I think that&#8217;s everything that I can show you inside of this book. Let&#8217;s</p>



<p>go to the code now. So here&#8217;s a little empty code, source code, a page. I&#8217;m going to stick</p>



<p>all my code inside of it. Another reminder that if you don&#8217;t know how to write assembly</p>



<p>you don&#8217;t know how to write assembly at all you should see my other videos because i&#8217;m not going</p>



<p>to cover the basics of assembly in this video if you want to learn how to make a make file or compile</p>



<p>or assemble or like do all the basics that i&#8217;m not talking about in this video i&#8217;ve covered them all</p>



<p>in my other videos up to this point so for now we&#8217;re just going to focus only on conditional</p>



<p>branching conditional jumping inside of an assembly module so i&#8217;m going to start off by setting up my</p>



<p>and i&#8217;m gonna say paste and again you know this is covered in other videos but long story short</p>



<p>i&#8217;m just going to be printing out a bunch of strings while this program executes so</p>



<p>i&#8217;m going to announce that the branching test is going to begin and then i&#8217;m going to ask the user</p>



<p>for some input and then i&#8217;m going to based on whatever the user inputs i&#8217;m going to just print</p>



<p>out a message that sort of you know understands what the user inputted so if the user inputted</p>



<p>something greater than zero it&#8217;s going to output that if they entered something that was less than</p>



<p>10 it&#8217;s going to print that if they entered something that was equal to five it&#8217;s going to</p>



<p>print that and then it&#8217;s going to say we&#8217;ve ended the branching tests then i have like a crlf again</p>



<p>all this stuff is explained in other videos but we&#8217;re just basically printing so i&#8217;m going to</p>



<p>start the text section of my program which is where all the instructions are and i&#8217;m going to</p>



<p>a function that I can call on. Again, this video does not cover a bunch of other extra stuff. I&#8217;m</p>



<p>just going to show you how to branch. Just trust me when I say that this helps me easily print</p>



<p>numbers and things, or I guess in this particular case, it&#8217;ll help me input a number from the user.</p>



<p>But for you, if you&#8217;re trying to run this at home, you can just start hard coding numbers just to</p>



<p>make sure that you can branch correctly and then eventually work your way up to a library that can</p>



<p>videos in the distant future. I don&#8217;t know years from now. I don&#8217;t know.</p>



<p>I might release the library or some other stuff to the casual viewer.</p>



<p>So now here&#8217;s our entry point. Again,</p>



<p>I mentioned that there&#8217;s going to be other parts of this program that I&#8217;m not</p>



<p>showing. So this is a hybrid program where a C++ driver actually will call on</p>



<p>my cool function. So just imagine from somewhere else in the program,</p>



<p>you&#8217;re calling on the cool function. How do we know it&#8217;s a function?</p>



<p>a label called cool and then it has a return statement at the very end.</p>



<p>That&#8217;s pretty much all we need to know right now.</p>



<p>Let me get rid of that load.</p>



<p>I don&#8217;t know why I always have the word load in all of my things.</p>



<p>I think I put it in there on an early example</p>



<p>and then I just kept copy pasting to my heart&#8217;s content and never stopped.</p>



<p>We mark the function cool as global so that other modules can call on it</p>



<p>like the C++ module that I&#8217;m not showing you.</p>



<p>But if you&#8217;re writing a pure assembly module,</p>



<p>you don&#8217;t really need to mark your functions as global.</p>



<p>if everything&#8217;s within the same piece of source code it&#8217;s totally fine so then I&#8217;m going to make</p>



<p>a function call to a function called branch test so very quickly before I actually add branch test</p>



<p>I&#8217;m just going to add another function that we&#8217;re not covering in this video called crlf and long</p>



<p>story short all it does is just it prints a new line in the terminal and that&#8217;s it like it&#8217;s just</p>



<p>it&#8217;s a convenience function I like to be able to call crlf and have a new line okay so let&#8217;s start</p>



<p>our branch test function so here&#8217;s the signature it is just branch test with a</p>



<p>void in front of it I&#8217;m gonna put a ret to say that this is a function that we</p>



<p>will return from and I left myself a little note here saying that I&#8217;m gonna</p>



<p>use register r12 as the number that the user inputs so that means I&#8217;m gonna have</p>



<p>to preserve that because you have to respect the ABI and the ABI says that</p>



<p>The ABI says that R12 is a Kali saved register.</p>



<p>Again, see my other videos if you don&#8217;t know what I&#8217;m talking about.</p>



<p>But I&#8217;m just going to preserve it in a section that I call the prologue, or actually the</p>



<p>book calls the prologue.</p>



<p>I do that now though too.</p>



<p>And, you know, restore it in a section called the epilogue.</p>



<p>So we have prologue and epilogue.</p>



<p>We can have a push-pop pair.</p>



<p>And then in between, we can have, you know, the meat of our function.</p>



<p>Okay, so for the introduction, I&#8217;m just going to write a few instructions that just print</p>



<p>out a message.</p>



<p>print out a message. So we&#8217;re going to print out that intro message and then call</p>



<p>CRLF to print a new line and then return. So maybe actually at this point we could</p>



<p>probably check to see if this program works by trying to run it.</p>



<p>So let me say clear and make run.</p>



<p>Okay. So now the driver just prints hello. The driver is</p>



<p>elsewhere and we get that welcome message that says begin</p>



<p>branching test and then the driver retains control after that. So</p>



<p>let&#8217;s do let&#8217;s do a goodbye message real fast so we&#8217;ll do our goodbye message</p>



<p>it&#8217;s just another string that I&#8217;m printing it&#8217;s no big deal right now but</p>



<p>if I run the program again you can see that begin branching test and end</p>



<p>branching test okay so far we&#8217;re not really doing branching yet the next thing</p>



<p>we need to do is ask for a number so this is how I&#8217;m going to do it in my</p>



<p>this is how I&#8217;m going to do it in my program. In your program it might be different or you might</p>



<p>have a hard-coded number or something like that. So for now just trust me when I say that I&#8217;m going</p>



<p>to print a prompt basically saying could you please enter a number and then the next two lines</p>



<p>are going to be just calling on one of my custom functions that will input a number from the user</p>



<p>so the user can type at the terminal and we will receive their number through REX which is the</p>



<p>return value register for integer return values and we&#8217;re going to store it in R12. So that&#8217;s why</p>



<p>And we&#8217;re going to store it in R12.</p>



<p>So that&#8217;s why I had to preserve R12,</p>



<p>because I&#8217;m actually going to start,</p>



<p>you know, messing with the value of R12 now.</p>



<p>Okay, so we ask for a number,</p>



<p>and then we sort of don&#8217;t do anything after that.</p>



<p>If we run the program again,</p>



<p>it&#8217;s just asking for a number,</p>



<p>and I can just like type some stuff and hit enter,</p>



<p>and then the program ends, nothing actually happens.</p>



<p>We&#8217;re building, we&#8217;re building.</p>



<p>So now let&#8217;s ask ourselves,</p>



<p>is the number greater than zero?</p>



<p>So let me copy paste some code here.</p>



<p>some code here so right now we&#8217;ve just finished inputting a number from the user and we&#8217;ll ask</p>



<p>you know is that number that they inputted greater than zero so again the first thing we do is we use</p>



<p>a compare instruction cmp we give it two operands the order doesn&#8217;t necessarily matter um for</p>



<p>instance uh right now i&#8217;m asking is r12 greater than zero so i can do a jump less than or equal</p>



<p>to like a different branch or i can jump greater than equal to if i switch the operands or if i</p>



<p>in a different order, but I&#8217;m just choosing to say, let&#8217;s compare the two and then let&#8217;s jump</p>



<p>if R12 is less than or equal to, which basically means not greater than, this label right here,</p>



<p>which is just branch test after greater test. So I&#8217;m going to do a print statement right after that</p>



<p>and then I&#8217;m going to draw out what the code is kind of doing. So let me make a label here so</p>



<p>actually will compile. Whoops. I&#8217;m in the wrong window. Okay. There we go. So what am I saying</p>



<p>here? Okay. Do the comparison. And then if the condition seems to be satisfied, then we&#8217;ll jump</p>



<p>to this, which means we&#8217;ll just say goodbye and then exit the program because we&#8217;ll return to the</p>



<p>caller. But if that condition was not satisfied, then we&#8217;re going to end up executing this stuff</p>



<p>in the middle. So think about this. This is kind of the idea. Let&#8217;s see if I can remember how to</p>



<p>idea let&#8217;s see if I can remember how to draw this right now off the top of my head suppose we have</p>



<p>like some sort of an input I&#8217;ll call this in put and then maybe the input is going to be you know</p>



<p>whether r12 and r0 are equal or greater than or whatever so I&#8217;m just gonna say r12 and 0</p>



<p>god that&#8217;s awful I really need to practice this draw pad I spend like a whole week practicing</p>



<p>whole week practicing with a different draw pad and then when I come back to</p>



<p>this one I&#8217;m even worse than when I started so we we come in and we kind of</p>



<p>look at our 12 versus zero and then we will jump in one direction if that&#8217;s not</p>



<p>you know greater than or equal to or less than or equal to and we&#8217;ll jump in</p>



<p>another direction otherwise so basically here we&#8217;ll say jump less than equal to</p>



<p>um less than or equal to whoops maybe i&#8217;ll do r12 uh i need to somehow adjust the pressure on this</p>



<p>thing r12 less than or equal to and so this is sort of uh has to do with you know this branching</p>



<p>path that we take like if r12 was less than or equal to zero then we&#8217;ll take the right branching</p>



<p>to after, I&#8217;ll just put the word after,</p>



<p>we&#8217;ll jump to the after greater test sub label.</p>



<p>And otherwise, if R12 is, sorry,</p>



<p>I said less than or equal to, yeah,</p>



<p>if R12 is greater than zero,</p>



<p>then we jump to this other thing,</p>



<p>which is gonna be the fall through.</p>



<p>So it&#8217;s gonna be line 96, but I&#8217;ll just say,</p>



<p>I&#8217;ll say fall for fall through.</p>



<p>basically the jump won&#8217;t happen if it&#8217;s greater than or equal to so you could imagine if you</p>



<p>wanted to reverse the logic so you can use a jump greater than instruction you could but I&#8217;m choosing</p>



<p>to do it this way and then both of those will eventually reach let&#8217;s see will eventually</p>



<p>actually yeah the fall through instructions those will eventually reach the after instruction I&#8217;ll</p>



<p>here and then the after instruction will just kind of like finish the program</p>



<p>and exit and all that stuff. So if you think about the control path here,</p>



<p>we have an input we&#8217;re looking at R12 with the zero with the compare instruction</p>



<p>and then we use a conditional branching instruction. So maybe I should write,</p>



<p>what do you want to write here? Maybe I&#8217;ll just put JLE up here because usually the compare</p>



<p>usually the compare instruction and the conditional jump or branching instructions</p>



<p>kind of you know come as a pair so both of these combined mean let&#8217;s look at r12 versus zero and</p>



<p>if r12 is less than or equal to zero meaning if it will jump if we&#8217;re less than or equal to the</p>



<p>the right operand r12 less than equal to the right operand then we go down this path on the right</p>



<p>to the after label if that is false meaning r12 was greater than zero then we&#8217;ll fall through</p>



<p>this stuff right here and then whether or not we actually fall through will always end up at the</p>



<p>at the after area because we&#8217;re either going to jump directly to the after area or we&#8217;re going</p>



<p>to fall through and then the fall through falls through to the after area anyway as well let me</p>



<p>just show you that real fast oh man i&#8217;m having a hard time with this okay so let&#8217;s pretend that r12</p>



<p>less than or equal to. So that means instructions are coming, you know,</p>



<p>instructions are getting executed. We&#8217;re going down and down and down and down and down.</p>



<p>Once we see jump less than or equal to, if that&#8217;s true, then we jump to the after label,</p>



<p>which means we just kind of jump around this message. And so we&#8217;re not going to exit,</p>



<p>sorry, we&#8217;re not going to execute that code. So in the case where that is true,</p>



<p>where it is less than or equal to, we&#8217;re not going to execute those instructions.</p>



<p>So we&#8217;re not going to say their number was greater than zero. We&#8217;re just going to simply</p>



<p>We&#8217;re just going to simply say goodbye.</p>



<p>However, on the other hand, if that is not true, meaning if R12 was indeed greater than</p>



<p>zero, then we&#8217;re going to fall through because this jump less than or equal to instruction,</p>



<p>it will only jump if the R flags, if the comparison instruction thought that R12 was less than</p>



<p>or equal to zero.</p>



<p>If that&#8217;s not true, if it&#8217;s greater than, then instructions, the control path is just</p>



<p>the control path is just going to fall through.</p>



<p>So that means we will actually execute these.</p>



<p>And then when they&#8217;re done,</p>



<p>execution will continue to fall through to the rest.</p>



<p>So that means we&#8217;re either going to see a message saying</p>



<p>their number was greater than zero or not,</p>



<p>based on whether their number actually was greater than zero.</p>



<p>Okay, hopefully I explained that somewhat clearly.</p>



<p>Now let&#8217;s run the code and see if it works.</p>



<p>Hopefully I didn&#8217;t forget anything.</p>



<p>This is kind of a partial program at this point.</p>



<p>program at this point I&#8217;m gonna add a bunch more stuff to it so hopefully</p>



<p>this actually compiles enter an integer five notice how it says your number was</p>



<p>greater than zero and if I run it again and I just type zero it does not say</p>



<p>that it was greater than zero if I run it again I type like a negative five it</p>



<p>also does not say that it was greater than zero you know a huge giant number</p>



<p>here it&#8217;ll say your number was greater than zero you could probably type a</p>



<p>number that was just absolutely huge and have it overflow I actually don&#8217;t know</p>



<p>nines I need to type and I don&#8217;t even know what the behavior is going to be.</p>



<p>I don&#8217;t know if it&#8217;s just going to crash the program because this also relies on my ability</p>



<p>to input a number which is happening in a different library.</p>



<p>Let&#8217;s see if that even works greater than zero.</p>



<p>Okay.</p>



<p>It probably overflowed and went to a very, very low negative number.</p>



<p>So okay.</p>



<p>I guess at least I know my library will probably work sort of.</p>



<p>Okay.</p>



<p>So let&#8217;s go back to the code here and let&#8217;s upgrade it.</p>



<p>how to to check for jump less than or equal to um we&#8217;re going to say goodbye right there so now the</p>



<p>next thing we should do is check to see if the number was less than 10. so after the greater test</p>



<p>it&#8217;s going to be here so again the same thing like we can just reuse r12 because we&#8217;re not really</p>



<p>modifying it and we&#8217;re not calling uh well i guess even if we were calling a function r12 was supposed</p>



<p>supposed to be Kali preserved so we&#8217;re just comparing it and then maybe</p>



<p>printing a message if we want to and regardless we&#8217;re going to end up at 103</p>



<p>this after greater test label so then we&#8217;ll compare again r12 with the number</p>



<p>10 and we&#8217;ll say jump if it&#8217;s greater than or equal to branch test after less</p>



<p>so now at this point we&#8217;re saying compare r12 with 10 if it&#8217;s greater than or equal to 10 then</p>



<p>just skip over the message so if it&#8217;s greater than or equal to 10 then wait a minute wait wait</p>



<p>yeah yeah if it&#8217;s greater than or equal to 10 then skip the message otherwise the message</p>



<p>that is printed is going to say that their number is less than 10. so again you could imagine a</p>



<p>want me to write it out for you I don&#8217;t know I think once is probably enough but let me just do</p>



<p>it again we&#8217;ll do input is coming in and it&#8217;s just going to be you know comparing and then</p>



<p>jumping greater than or equal to the input is going to be where we&#8217;re just looking to see if</p>



<p>R12 how it compares to zero god the number one is awful my entire penmanship is awful okay one</p>



<p>we&#8217;ll do r12 and 10 and so that&#8217;s just sort of what we&#8217;re comparing with the compare instruction</p>



<p>and then the jump instruction and so if we go on the left i&#8217;m going to say that&#8217;s the fall through</p>



<p>path again and if we go to the right it&#8217;s going to be um r12 greater than or equal to 10 is going</p>



<p>and then here this is going to be after less I&#8217;ll say the after label the after less label</p>



<p>so if we fall through it&#8217;s just going to print a message maybe I should do another little bubble</p>



<p>here that&#8217;s just like print p for how about p for print p for print it&#8217;s going to fall through and</p>



<p>then it&#8217;s going to print and then it&#8217;s going to go to the after label so you can see that</p>



<p>the print instructions are only reached if r12 is not greater than equal to 10 which is the same</p>



<p>to 10 which is the same thing as saying it&#8217;s going to fall through if r12 is less than</p>



<p>10.</p>



<p>And then after we finally get to the after label, then we&#8217;re just going to do, you know,</p>



<p>the rest of the instructions.</p>



<p>We&#8217;re going to exit the program.</p>



<p>We&#8217;re going to say goodbye.</p>



<p>We&#8217;re going to do whatever.</p>



<p>Okay.</p>



<p>So say there never was less than 10.</p>



<p>And then regardless, here&#8217;s like the ending label that we were conditionally jumping to.</p>



<p>Let&#8217;s see if this works.</p>



<p>Make run.</p>



<p>So we&#8217;ll enter five.</p>



<p>we&#8217;ll enter five notice how it says your number was greater than zero and your</p>



<p>number was less than ten let&#8217;s do an 11 I guess it says your number was greater</p>



<p>than zero but it does not say that our number was less than ten because 11 is</p>



<p>not less than ten if I do a negative three here it says that our number was</p>



<p>less than ten but it doesn&#8217;t say that it&#8217;s greater than zero so we have like a</p>



<p>lot of decisions that we could make right like imagine if instead of just</p>



<p>based on something happening, you could call a full function or skip a bunch of extra code,</p>



<p>you know, whatever you want it to do.</p>



<p>So I&#8217;m going to go to the next condition where we&#8217;re going to compare R12 to the number five.</p>



<p>And we&#8217;re going to ask, you know, is R12 equal to five?</p>



<p>So this is going to be the jump not equal branch.</p>



<p>And again, you know, if you wanted to say jump, if it&#8217;s equal to the place where we</p>



<p>and then maybe like right after that fall through and just do an unconditional jump you can</p>



<p>I just think there are less jumps if I do it this way so uh here we&#8217;re just going to print you know</p>



<p>your number was equal to five and so basically if it was not equal we should have another label here</p>



<p>that allows us to skip that so all right so same thing I&#8217;m not going to draw the diagram this time</p>



<p>R12 with 5 and if it&#8217;s not equal to 5 then jump to this label down here which just means</p>



<p>let&#8217;s say goodbye and not actually say that their number was equal to 5.</p>



<p>But if it was equal to 5 then this JNE conditional branch won&#8217;t actually jump anywhere.</p>



<p>Execution will fall through to the next statements which is just printing the message that their</p>



<p>number is equal to 5 and then when that&#8217;s done it&#8217;ll fall through to this other label</p>



<p>and eventually fall through to the return statement.</p>



<p>the whole thing already nice that was easy um let&#8217;s do another run and um let&#8217;s enter the</p>



<p>integer one it says one is uh greater than zero and one is less than 10</p>



<p>greater than zero and less than 10 is there any way i can get nothing to print out</p>



<p>greater than zero and less than 10</p>



<p>you don&#8217;t think i can do it let me try it nine no</p>



<p>why did I even put 9 okay yeah it&#8217;s always gonna say 0 or 10 okay so let&#8217;s</p>



<p>do a 4 we&#8217;ll get both of those greater than 0 and also less than 10 let&#8217;s do a</p>



<p>5 now we should get all those messages your number was greater than 0 your</p>



<p>number was less than 10 your number was equal to 5 and if I just do a 6 in there</p>



<p>again it doesn&#8217;t print your number was equal to 5 and we have to enter an</p>



<p>actual 5 for that so that&#8217;s the that&#8217;s the basics of</p>



<p>conditional branching oh there&#8217;s one other thing that I wanted to make sure</p>



<p>in my previous video where we only talked about jumps bear in mind that</p>



<p>these conditional branching statements or instructions you know je j any all</p>



<p>these things they have a limited range of jumps of where they can jump to so if</p>



<p>you have a gigantic program and you&#8217;re trying to jump very very very far away</p>



<p>based on a condition you might have an assembler error where your program won&#8217;t</p>



<p>even compile won&#8217;t even assemble telling you i think the message is i wrote it</p>



<p>I wrote it down somewhere jump out of range coming from the assembler that basically means that these</p>



<p>instructions can only jump about 128 bytes away from whatever instruction they are at or whatever</p>



<p>memory location they are at so you know after your assembler assembles your program and after</p>



<p>your linker links your program and you just have like a binary you know if you were to inspect</p>



<p>all the instructions inside of your executable your binary you would see that they have offsets</p>



<p>offsets, right? You know, like one instruction is basically eight bytes away from the one that</p>



<p>comes right after it. But some instructions are a lot further away. So if you&#8217;re trying to jump</p>



<p>to an instruction that is 100 is more than 128 bytes away, it won&#8217;t work, you&#8217;ll get that error.</p>



<p>So how do you solve that problem? Well, maybe I&#8217;ll just write this down real fast. I&#8217;m not going to</p>



<p>make this part of the code example. But just imagine we have, you know, jump equal to some</p>



<p>and maybe I&#8217;ll do a comment very very far away and here&#8217;s the label some label right</p>



<p>so if your assembler says hey you can&#8217;t jump to some label because it&#8217;s too far away it&#8217;s a</p>



<p>jump out of range assembler error then basically you can just make some other labels here you can</p>



<p>say uh you can say short jump true and short jump false you know just make up some sort of a label</p>



<p>label and basically say if it is um well false yeah okay i guess this is the way i&#8217;ll do it this</p>



<p>is not super efficient but instead of jumping to the very far away label in the case of true you</p>



<p>can just jump to the true label so i&#8217;m going to say jump uh to the short jump true label otherwise</p>



<p>To the false label. So now you&#8217;re definitely jumping in either case and both of these labels are close by</p>



<p>So then I can pretty much just have the close by true label do an unconditional</p>



<p>Jump to some label and that overcomes the limitation of branching instructions</p>



<p>So, you know JMP the regular jump instruction</p>



<p>It has an unlimited jump that it can do it can go just to like very very very far away instructions</p>



<p>And then for the false, you know, I don&#8217;t know, do whatever you want and then jump wherever you want.</p>



<p>It doesn&#8217;t really matter.</p>



<p>I&#8217;m just trying to show you that if you make a short jump to a label that will only have an unconditional jump,</p>



<p>so it&#8217;s sort of like two jumps, you know, like a short jump and then a long jump,</p>



<p>then you can overcome that limitation.</p>



<p>Again, bearing in mind that some label is supposed to be very, very far away and sort of unreachable.</p>



<p>Okay, so let me just double check that I talked about everything that I wanted to.</p>



<p>We looked at the branching instructions, the sign in this, I drew a diagram for you.</p>



<p>We solved the jump out of range error.</p>



<p>Okay, so that&#8217;s, I think that&#8217;s basically it.</p>



<p>Hopefully you feel like an expert now at conditional branching and how to make decisions.</p>



<p>In future videos, I&#8217;ll talk about how to implement an if else block and how to implement loops</p>



<p>and all that stuff.</p>



<p>decisions in yasm x86-64 assembly and conceptually you can apply this to other assembly languages too</p>



<p>so thanks for watching my video i hope you learned a little bit of stuff and had a little bit of fun</p>



<p>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 appreciate it</p>



<p>i do hope you did learn something and have some fun uh if you could do me a please a small little</p>



<p>Could you please subscribe and follow this channel or these videos or whatever it is you do on the current social media website that you&#8217;re looking at right now?</p>



<p>It would really mean the world to me and it&#8217;ll help make more videos and grow this community.</p>



<p>So we&#8217;ll be able to do more videos, longer videos, better videos, or just I&#8217;ll be able to keep making videos in general.</p>



<p>So please do me a kindness and subscribe.</p>



<p>You know, sometimes I&#8217;m sleeping in the middle of the night and I just wake up because I know somebody subscribed or followed.</p>



<p>or 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>you look at the middle of the screen right now you should see a QR code which</p>



<p>you can scan in order to go to the website which I think is also named</p>



<p>somewhere at the bottom of this video and it&#8217;ll take you to my main website</p>



<p>where you can just kind of like see all the videos I published and the</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 uh if you have a suggestion for uh uh clarifications or errata or just future videos</p>



<p>that you want to see please leave a comment or if you just want to say hey what&#8217;s up what&#8217;s going on</p>



<p>you know just send me a comment whatever i also wake up for those in the middle of the night i</p>



<p>get i wake up in a cold sweat and i&#8217;m like it would really it really mean the world to me i</p>



<p>appreciate it so again thank you so much for watching this video and enjoy the cool music</p>



<p>as as i fade into the darkness which is coming for us all</p>



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/learn-conditional-branching-in-x86-64-assembly-yasm-nasm-cmp-je-jne-jl-jg-more/">Learn Conditional Branching in x86-64 Assembly (YASM/NASM) &#8211; CMP, JE, JNE, JL, JG &amp; More</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/learn-conditional-branching-in-x86-64-assembly-yasm-nasm-cmp-je-jne-jl-jg-more/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>x86-64 Assembly Jump Instructions Explained: Unconditional JMP with Full Example in Yasm</title>
		<link>https://www.NeuralLantern.com/x86-64-assembly-jump-instructions-explained-unconditional-jmp-with-full-example-in-yasm/</link>
					<comments>https://www.NeuralLantern.com/x86-64-assembly-jump-instructions-explained-unconditional-jmp-with-full-example-in-yasm/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 11 Jan 2026 01:54:51 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[assembly control flow]]></category>
		<category><![CDATA[assembly jump instructions]]></category>
		<category><![CDATA[assembly language basics]]></category>
		<category><![CDATA[computer architecture]]></category>
		<category><![CDATA[ed jorgensen textbook]]></category>
		<category><![CDATA[jmp instruction]]></category>
		<category><![CDATA[learning assembly]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[systems programming]]></category>
		<category><![CDATA[unconditional jump]]></category>
		<category><![CDATA[x86 assembly tutorial]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[x86-64 programming]]></category>
		<category><![CDATA[Yasm assembly]]></category>
		<category><![CDATA[Yasm tutorial]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=278</guid>

					<description><![CDATA[<p>Learn how unconditional jump instructions (JMP) work in x86-64 assembly language using Yasm. This tutorial explains labels, unlimited jump range, and demonstrates skipping code sections with practical examples. Essential knowledge before studying conditional branching in modern assembly programming.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-jump-instructions-explained-unconditional-jmp-with-full-example-in-yasm/">x86-64 Assembly Jump Instructions Explained: Unconditional JMP with Full Example in Yasm</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 loading="lazy" title="x86-64 Assembly Jump Instructions Explained: Unconditional JMP with Full Example in Yasm" width="1380" height="776" src="https://www.youtube.com/embed/jkc7ydqAp7M?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>In this beginner-to-intermediate assembly language tutorial, we dive deep into unconditional jump instructions (JMP) in x86-64 assembly using Yasm syntax.</p>



<p>We cover:</p>



<ul class="wp-block-list">
<li>What unconditional jumps really are (basically a &#8220;go to&#8221; for assembly)</li>



<li>How labels work and how to create them</li>



<li>Why JMP has unlimited range (unlike conditional jumps)</li>



<li>Practical demo showing how to skip code sections using jumps</li>



<li>Comparison between jumping over code vs letting it execute</li>



<li>Quick look at why this matters before learning conditional branching</li>
</ul>



<p>We also reference the excellent free open-source textbook by Professor Ed Jorgensen (May 2024 version) which is highly recommended for anyone serious about learning x86-64 assembly.</p>



<p>Whether you&#8217;re preparing for university courses, reverse engineering, operating systems development, or just love low-level programming, this video will give you a clear understanding of how unconditional control flow works in modern x86-64 assembly.</p>



<p>Next video will cover conditional jumps (je, jne, jg, jl, etc.) and their limitations.</p>



<p>Enjoy the video and happy coding at the machine level!</p>



<p>Introduction to Jump Instructions 00:00:00<br>Recommended Free Assembly Textbook 00:00:23<br>What Unconditional Jumps Actually Do 00:01:27<br>Labels Explained with Examples 00:02:40<br>Unlimited Jump Range Advantage 00:04:43<br>Overview of the Demonstration Program 00:06:56<br>Building and Running the Jump Test 00:09:21<br>Live Jump Test Demonstration 00:10:53<br>Effect of Removing the Jump Instruction 00:13:50<br>Jumping in Different Directions Example 00:14:58<br>Summary and Next Video Teaser 00:17:28<br>Closing Remarks and Call to Action 00:17:44</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>
</ul>



<p>Please help support us!</p>



<ul class="wp-block-list">
<li>Subscribing + Sharing on Social Media</li>



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



<li>Subscribing to our Blog</li>



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



<p>Hello there.</p>



<p>In this video, we&#8217;re going to be talking about jump instructions in assembly.</p>



<p>This video is going to be about x86-64 Yasm assembly,</p>



<p>but I think probably anyone who&#8217;s interested in jump instructions</p>



<p>will benefit from this video because the concept is usually the same</p>



<p>throughout any system that you might use.</p>



<p>So for starters, I want to direct your attention to a textbook</p>



<p>that I think is wonderful.</p>



<p>This is an open source free textbook that will help you become an expert in assembly.</p>



<p>It&#8217;s not mine, I didn&#8217;t write it.</p>



<p>The author is Professor Ed Jorgensen, PhD.</p>



<p>He releases this textbook for free.</p>



<p>It&#8217;s under a copyleft license so you can literally just go to his website and download it and</p>



<p>send it to your friends and everything and it&#8217;s wonderful.</p>



<p>This book will take you from zero to hero when it comes to Yasm Assembly.</p>



<p>It&#8217;s wonderful and amazing.</p>



<p>This is the book and I just want to show you the section on jump instructions real fast</p>



<p>and then I&#8217;ll talk about them a little bit and then I&#8217;ll show you a sample program that</p>



<p>uses jump instructions.</p>



<p>So this version of the book that I&#8217;m working with right now is May 2024 version 1.1.56.</p>



<p>I&#8217;m going to go down to let&#8217;s see section 7 instruction set overview.</p>



<p>Inside of there there&#8217;s another subsection called where the heck is it control instructions</p>



<p>instructions 7.7 within that there&#8217;s a another subsection called 7.7.2 that&#8217;s</p>



<p>why I look this other not one of the many reasons that I love this book it</p>



<p>has so many subsections there&#8217;s just so many yummy subsections to organize</p>



<p>everything in a way that you can find it all so fast and okay so we&#8217;re looking</p>



<p>at unconditional control instructions in other words a jump instruction if</p>



<p>you&#8217;re an old-school programmer especially if you use some sort of like</p>



<p>if you use some sort of like a basic language or a language with go-to&#8217;s you might recognize jumps</p>



<p>as just being a go-to meaning we&#8217;re not actually going to call a function and then return from it</p>



<p>which is what the modern programs tend to do we&#8217;re just going to say let&#8217;s write a jump instruction</p>



<p>and we will literally just change execution to to jump to some other location just kind of go there</p>



<p>forever maybe we come back but if we do it&#8217;s going to be because there was a different jump instruction</p>



<p>instruction that told us to jump back.</p>



<p>So we&#8217;re not calling and returning.</p>



<p>We&#8217;re just going somewhere and that&#8217;s it.</p>



<p>Obviously it&#8217;s a little bit more convenient to be able to call functions,</p>



<p>but that&#8217;s sort of like an abstraction that has to be implemented after we</p>



<p>understand how to jump. So anyway, the jump instruction is pretty simple.</p>



<p>You just put JMP in Yasm anyway, and then follow it with a label.</p>



<p>So, you know, just as a quick little recap here, what&#8217;s a label?</p>



<p>imagine we have an assembly program here and maybe here&#8217;s our text section and we put some</p>



<p>instructions maybe there&#8217;s like an entry point right here I&#8217;ll say a global entry point and</p>



<p>literally just taking the word entry point and putting a colon after it now makes that a label</p>



<p>so if there are any instructions underneath I&#8217;m gonna put a bunch of nopes then if someone somewhere</p>



<p>to say jump entry point they should be able to go right here to instruction 8 and then start</p>



<p>executing downward. I guess maybe I didn&#8217;t need to put the global keyword global just means let&#8217;s</p>



<p>make this label available to other modules within the same program so if you have a multi-source</p>



<p>program or a hybrid program with multiple different languages then you know you should do this but if</p>



<p>it&#8217;s just a pure assembly program and there&#8217;s only one source code filed you don&#8217;t need to mark a</p>



<p>Just as a quick example here, entry points, I&#8217;ll just put hello as a label and I&#8217;ll say like do exit stuff.</p>



<p>So imagine on line 16, you add some instructions just to kind of exit.</p>



<p>If I wanted to skip all these nope instructions for some reason, I could just do this.</p>



<p>I could say jump hello.</p>



<p>And what would happen is execution.</p>



<p>Oh, I can use my pen.</p>



<p>Execution would just sort of, you know, it would come into the text section.</p>



<p>you know, it&#8217;d come into the text section.</p>



<p>It would go down through the label and it would execute this first jump</p>



<p>instruction and then execution would jump over the nopes into the hello label.</p>



<p>And then, you know, if there was other stuff here, then it would get executed.</p>



<p>So by jumping over the nopes,</p>



<p>I&#8217;m essentially saying that the nopes should not actually end up being</p>



<p>executed. They&#8217;ll be there in the program, but they won&#8217;t actually execute.</p>



<p>So that&#8217;s the basics of a jump instruction. Okay.</p>



<p>So what else do I need to tell you real fast?</p>



<p>What else do I need to tell you real fast?</p>



<p>Oh, one thing that&#8217;s really good about jump instructions is they have unlimited jump range.</p>



<p>So you can jump from a place at the very, very beginning of your assembly program and</p>



<p>jump to a place that is at the very, very, very end of your assembly program.</p>



<p>There&#8217;s not going to be a limitation on how far you can jump.</p>



<p>I mean, in theory, there&#8217;s a limit, but practically speaking, there&#8217;s not a limit.</p>



<p>Why would you care that there&#8217;s not a limit?</p>



<p>not a limit well because in a future video that i&#8217;m going to release we&#8217;re going to talk about</p>



<p>conditional branching which is sort of a jump that only jumps if a certain condition is true</p>



<p>and those have limited ranges where they can jump so there&#8217;s going to be a bunch of different</p>



<p>instructions but one of the conditional branching instructions is jne and another one is jge and</p>



<p>there&#8217;s another one that&#8217;s je basically you know jump if something is equal jump if something is</p>



<p>can only jump about 128 bytes away.</p>



<p>So after your assembler assembles and compiles</p>



<p>down to object code,</p>



<p>and then after your linker links your final executable,</p>



<p>wherever it is that the instructions happen to end up</p>



<p>inside of your program,</p>



<p>the conditional jumps,</p>



<p>the conditional branching instructions,</p>



<p>they can&#8217;t jump more than 128 bytes away</p>



<p>to some other instruction.</p>



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



<p>Even if later on you graduate</p>



<p>to making decisions in your program,</p>



<p>like I&#8217;m going to do in the next video,</p>



<p>in your program like i&#8217;m going to do in the next video you can only jump so far and if you have to</p>



<p>jump too far you actually might not be able to jump at all unless you jump a very short jump</p>



<p>to a regular jump instruction and then that jump instruction jumps very very far away that&#8217;s kind</p>



<p>of the workaround for it i&#8217;m not going to talk about that in this video though this is not a</p>



<p>video for uh conditional branching i just wanted you to be aware of one of the benefits of regular</p>



<p>Okay, so we&#8217;re looking at the book here.</p>



<p>There&#8217;s not really a whole lot to the jump instruction, just jump and then a label.</p>



<p>We talked about its benefit over conditional branch instructions,</p>



<p>but we also talked about its, I guess, its shortcoming,</p>



<p>meaning it can&#8217;t actually make a decision.</p>



<p>It will always jump to a label no matter what.</p>



<p>There&#8217;s no condition.</p>



<p>So there&#8217;s the book there, and now I&#8217;m going to make a sample program</p>



<p>and show you how to run it.</p>



<p>I&#8217;m just going to run it.</p>



<p>I&#8217;m just gonna run it I&#8217;m show you what it does in order to implement conditional branches so for</p>



<p>starters I want you to know that there&#8217;s a make file that I&#8217;ve generated under the hood and we&#8217;re</p>



<p>not going to be talking about that in this video this is also a hybrid program so there&#8217;s a C++</p>



<p>entry point a driver module under the hood of this we&#8217;re not going to talk about that if you</p>



<p>want to know how to make hybrid programs you want to generate make files you want to learn the basics</p>



<p>videos for now we&#8217;re only going to be talking about jump instructions so I&#8217;m</p>



<p>going to skip a lot of information okay so for starters I&#8217;m going to make a</p>



<p>little data section here and again this is explained in other videos but for now</p>



<p>we&#8217;ll just trust that we can make a data section that contains strings C strings</p>



<p>and other values so pretty much I&#8217;m just going to make a string called begin jump</p>



<p>test just to announce to the user that we&#8217;re we&#8217;re going to start doing this</p>



<p>We&#8217;re going to start doing this and then I&#8217;m going to make a string called this message</p>



<p>should not appear.</p>



<p>So in the code, I&#8217;m going to try to print that message, but then I&#8217;m going to jump over</p>



<p>the call to print it just to prove to you that there are instructions that would print</p>



<p>that message, but we&#8217;re jumping over them with the jump instruction.</p>



<p>And then there&#8217;s like an exit message.</p>



<p>And then there&#8217;s a CRLF, which is just a carriage return line feed.</p>



<p>Again, all of this stuff is in other videos already.</p>



<p>So we&#8217;re going to use system call one to print.</p>



<p>We&#8217;re going to print a file descriptor one, which is just standard output for your program.</p>



<p>Then we&#8217;re going to start the text section where the actual code lives.</p>



<p>So this text section is here and it&#8217;s supposed to be at line 37 already.</p>



<p>I think I missed a bunch of lines.</p>



<p>Oh no, I think I missed some comments.</p>



<p>Anyway, so we have a text section here and an entry point and I&#8217;m calling it cool.</p>



<p>calling it cool and I am marking it as global because in this particular program that I&#8217;m</p>



<p>building it&#8217;s a hybrid program there&#8217;s going to be a C++ module that will call on our cool</p>



<p>function so cool has to be global and then I&#8217;m just going to call on a method called jump test</p>



<p>I don&#8217;t know I have the words load there I&#8217;m just going to get rid of that real fast locally and in</p>



<p>my solution up above and so we&#8217;re going to call a function called jump test and then when we&#8217;re</p>



<p>finished we&#8217;re going to return to the caller which is going to be the driver and that&#8217;ll</p>



<p>pretty much be it.</p>



<p>So if I comment this out real fast, let&#8217;s see,</p>



<p>this might actually work.</p>



<p>Let&#8217;s see if I can get it to run in the terminal.</p>



<p>But there&#8217;s a bunch more code that we have to add, so I&#8217;m not really sure.</p>



<p>So let&#8217;s do clear and make run.</p>



<p>And it seems to not have a shared object directory.</p>



<p>Let me pause the video while I copy paste one of my stupid libraries into the</p>



<p>program. You don&#8217;t need this library.</p>



<p>It just helps me print things.</p>



<p>okay so now I have copy pasted my shared object which allows me to do extra printing stuffs</p>



<p>just for just to make this demo easier for me but you don&#8217;t need to know it or you don&#8217;t need to have</p>



<p>it to to learn jump instructions anyway so I&#8217;m going to do that again and now it actually prints</p>



<p>something okay so hello from the main CPP driver and then it says the driver has regained control</p>



<p>make a call to jump test here and then let&#8217;s start the actual jump test function. So I&#8217;m going to do</p>



<p>well I guess this thing is kind of short I could copy paste the whole thing all at once.</p>



<p>So let&#8217;s do yeah let&#8217;s just jump let&#8217;s just call the whole thing. Okay I&#8217;m going to copy paste the</p>



<p>whole thing then I&#8217;ll explain it a little bit to you. So there is a function that I have in here</p>



<p>It&#8217;s just a convenience function that I made so I can print a carriage return line feed.</p>



<p>The real interesting thing here is the jump test function.</p>



<p>So we were just making a call to jump test.</p>



<p>Now we&#8217;re making the actual jump test function.</p>



<p>It&#8217;s got a signature of just void with no arguments.</p>



<p>So it&#8217;s not super interesting from the caller&#8217;s perspective, but it does some stuff.</p>



<p>So for starters, it has an intro message.</p>



<p>So this will print, you know, hello, welcome to the jump test.</p>



<p>jump test. In fact, if I do a return call here,</p>



<p>it should actually just print that and do nothing else. Right. Okay.</p>



<p>Notice how it printed, begin the jump test.</p>



<p>And then right after that,</p>



<p>there&#8217;s a jump instruction just proving to you that we can jump over other</p>



<p>instructions. So look at this,</p>



<p>this piece of code should never actually be called because we&#8217;re going to jump</p>



<p>over it. What it is, is it&#8217;s printing that jump shouldn&#8217;t happen message.</p>



<p>at the top here jumps shouldn&#8217;t happen so it&#8217;s trying to print out this message should not appear</p>



<p>but we&#8217;re going to jump over that by using this jump instruction here on line 66.</p>



<p>Again note that the jump instruction is just jmp followed by a label the label specified has to be</p>



<p>where you want to jump it&#8217;s never going to return from that place unless you specifically jump back</p>



<p>somehow later on like i guess if we wanted to we could put a label on line 67 call it the return</p>



<p>call it the return point and then jump back from it after the jump point in fact maybe that would</p>



<p>be kind of interesting to do at the end of this video but otherwise we&#8217;re gonna you know just</p>



<p>let&#8217;s see we&#8217;re gonna end up jumping over so let me reduce the front size just for a second here</p>



<p>so imagine execution uh comes into this program you know we&#8217;re executing uh instructions we&#8217;re</p>



<p>calling crlf we&#8217;re just executing executing as soon as we hit this jump instruction then execution</p>



<p>then execution jumps over into the label that I specified.</p>



<p>So this whole code section here just never even gets called.</p>



<p>So that&#8217;s why we will not see that message.</p>



<p>And then at the very end, all I&#8217;m doing is I&#8217;m just properly,</p>



<p>you know, I&#8217;m printing the exit message.</p>



<p>So I&#8217;m just printing another string saying the exit or the jump test is done.</p>



<p>I return to the caller execution goes all the way back up to just you know right here right after</p>



<p>call jump test was executed and then the cool function will return to the caller and that&#8217;s</p>



<p>just a c++ main function that does nothing so at this point we should see the whole entire point of</p>



<p>the program and then I&#8217;ll start tweaking it so you can kind of see the difference with the jump</p>



<p>instruction uh there and not there so let&#8217;s run one more time and notice how it says begin the</p>



<p>says begin the jump test and then end jump test and then it goes back to the driver that is</p>



<p>regain control it never says this message should not be printed so this whole section was just</p>



<p>skipped let&#8217;s comment out line 66 so that we don&#8217;t actually jump over that code and then now you&#8217;ll</p>



<p>see that that message does get printed so notice how it says this message should not appear okay</p>



<p>and then run the program one more time.</p>



<p>Now that message does not appear.</p>



<p>Pretty cool.</p>



<p>Now let&#8217;s do that double jumping thing just to show you.</p>



<p>I mean, this is not something that you actually want to do.</p>



<p>You probably want to write functions and function calls,</p>



<p>but if you wanted to, you could do something like this.</p>



<p>Here&#8217;s the exiting.</p>



<p>And maybe right after this, let&#8217;s make another label.</p>



<p>Let&#8217;s do, oh gosh, what am I going to do?</p>



<p>what am I going to do? Because if I jump after the exiting label and I jump back up to some label</p>



<p>up here, it&#8217;s just going to be an infinite loop. So maybe, um, I don&#8217;t know, let&#8217;s make a, I mean,</p>



<p>if I make another label down at the bottom, you&#8217;ll kind of think it&#8217;s a function just without</p>



<p>a return statement. So let&#8217;s actually jump within the same function. Let&#8217;s do, um,</p>



<p>over the never area.</p>



<p>So I&#8217;m going to say jump test and I&#8217;m going to write never.</p>



<p>So now we have a label that tells us where the never printed message actually starts.</p>



<p>So if we jump over it to the exiting, then we&#8217;re good.</p>



<p>But then if I up here, if I say jump instruction that subverts</p>



<p>never message so I&#8217;m just I&#8217;m just leaving a comment not code I could then</p>



<p>say let&#8217;s jump to jump test never and what will happen now is we&#8217;ll still see</p>



<p>the never message because what will happen is execution comes down you know</p>



<p>through here all these instructions are executing and then we see a jump that</p>



<p>tells us to go to the the never label so we actually jump over this exiting jump</p>



<p>over this exiting jump or this like the skipping jump,</p>



<p>the jump that skips the message.</p>



<p>And then we actually do print the never message</p>



<p>and we just keep going down and down and down</p>



<p>until we&#8217;re finished with that.</p>



<p>And we end up just sort of exiting normally.</p>



<p>So that means the only code that doesn&#8217;t get executed</p>



<p>in this case is the one right here</p>



<p>that skips over the never message.</p>



<p>Hopefully that makes sense.</p>



<p>Let&#8217;s run the program just to prove it real fast.</p>



<p>So I&#8217;m going to do this again.</p>



<p>And now you see the message should not appear.</p>



<p>This message should not appear.</p>



<p>You see that message.</p>



<p>So again, if we comment out that jump that subverts the skip, then execution will fall</p>



<p>through and we&#8217;ll end up executing line 69, the skipping instruction.</p>



<p>again now that message does not appear.</p>



<p>We could jump back and forth if we wanted to.</p>



<p>I don&#8217;t know.</p>



<p>Should I do a back and forth?</p>



<p>I don&#8217;t really want to.</p>



<p>I think at this point you understand we can jump anywhere we want, right?</p>



<p>I could take a bunch of time in this video to rewrite this program and have it say,</p>



<p>let&#8217;s jump downward and then let&#8217;s jump upward again and let&#8217;s let it fall through</p>



<p>and then let&#8217;s jump over something and whatever.</p>



<p>let&#8217;s jump over something and whatever. I mean, just wherever you want to jump,</p>



<p>just make a label and then jump to it. Then you have to figure out what your execution path is</p>



<p>actually going to be. And maybe that&#8217;ll be complicated, but I hope I&#8217;ve made my point by</p>



<p>now. Anyway, so that&#8217;s the basics of just jumping around. It&#8217;s not super useful. Conditional</p>



<p>branching is a lot better. So see my next video. And I thank you for watching this and I hope you</p>



<p>learned a little bit and had a little fun. See you soon.</p>



<p>See you soon.</p>



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



<p>So please do me a kindness 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 could troll me if you want to just wake me up in the middle of the night.</p>



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



<p>Also, if you look at the middle of the screen right now, you should see a QR code which you can scan in order to go to the website</p>



<p>which I think is also named somewhere at the bottom of this video and</p>



<p>It&#8217;ll take you to my main website where you can just kind of like see all the videos</p>



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



<p>If you have a suggestion for</p>



<p>Clarifications or errata or just future videos that you want to see</p>



<p>please leave a comment or if you just want to say, Hey, what&#8217;s up, what&#8217;s going on?</p>



<p>You know, just send me a comment, whatever. I also wake up for those in the middle of the night.</p>



<p>I get, I wake up in a cold sweat and I&#8217;m like, it would really, it really mean the world to me.</p>



<p>I would really appreciate it. So again, thank you so much for watching this video and, um,</p>



<p>enjoy the cool music as, as I fade into the darkness, which is coming for us all.</p>



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/x86-64-assembly-jump-instructions-explained-unconditional-jmp-with-full-example-in-yasm/">x86-64 Assembly Jump Instructions Explained: Unconditional JMP with Full Example in Yasm</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/x86-64-assembly-jump-instructions-explained-unconditional-jmp-with-full-example-in-yasm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Complex If-ElseIf-Else in x86-64 YASM Assembly &#8211; Full Guide with Code Examples</title>
		<link>https://www.NeuralLantern.com/complex-if-elseif-else-in-x86-64-yasm-assembly-full-guide-with-code-examples/</link>
					<comments>https://www.NeuralLantern.com/complex-if-elseif-else-in-x86-64-yasm-assembly-full-guide-with-code-examples/#respond</comments>
		
		<dc:creator><![CDATA[mike]]></dc:creator>
		<pubDate>Sun, 04 Jan 2026 18:55:39 +0000</pubDate>
				<category><![CDATA[Assembly Language]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[assembly language if statement]]></category>
		<category><![CDATA[assembly language tutorial]]></category>
		<category><![CDATA[assembly programming]]></category>
		<category><![CDATA[chained if else assembly]]></category>
		<category><![CDATA[cmp instruction]]></category>
		<category><![CDATA[conditional branching assembly]]></category>
		<category><![CDATA[control flow assembly]]></category>
		<category><![CDATA[if else assembly]]></category>
		<category><![CDATA[intel assembly]]></category>
		<category><![CDATA[je jmp assembly]]></category>
		<category><![CDATA[low level programming]]></category>
		<category><![CDATA[nasm assembly]]></category>
		<category><![CDATA[x86 assembly tutorial]]></category>
		<category><![CDATA[x86-64 assembly]]></category>
		<category><![CDATA[Yasm assembly]]></category>
		<guid isPermaLink="false">https://www.NeuralLantern.com/?p=275</guid>

					<description><![CDATA[<p>Step-by-step x86-64 YASM assembly tutorial showing how to implement complex if-else and if-elseif-else control flow structures with multiple chained conditions, proper labels, conditional jumps, and fall-through logic. Includes complete working code and live execution.</p>
<p>The post <a href="https://www.NeuralLantern.com/complex-if-elseif-else-in-x86-64-yasm-assembly-full-guide-with-code-examples/">Complex If-ElseIf-Else in x86-64 YASM Assembly &#8211; Full Guide with Code Examples</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 loading="lazy" title="Complex If-ElseIf-Else in x86-64 YASM Assembly - Full Guide with Code Examples" width="1380" height="776" src="https://www.youtube.com/embed/G7am7avKi9w?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>In this in-depth x86-64 assembly tutorial using YASM, we dive deep into implementing complex if-else and if-elseif-else control structures from scratch. Starting with the fundamentals of conditional branching, we build up to full chained if-elseif-else blocks with multiple conditions &#8211; exactly how high-level languages handle them under the hood.</p>



<p>You&#8217;ll see real working code that:</p>



<ul class="wp-block-list">
<li>Takes user integer input</li>



<li>Tests against specific values (5, 6, etc.)</li>



<li>Handles greater-than/less-than comparisons</li>



<li>Properly branches so only one block executes</li>



<li>Uses labels, cmp, conditional jumps (je, jl), and unconditional jumps (jmp) correctly</li>
</ul>



<p>We cover the classic pattern: compare to conditional jump to true block to execute true code to jmp to end to false block falls through or jumps in. Everything is shown step-by-step with live compilation and runtime demos.</p>



<p>Perfect for anyone learning low-level programming, reverse engineering, or wanting to understand how compilers translate if-else chains into machine code. Prerequisites: basic conditional jumps (see my earlier videos).</p>



<p>Code shown works on Linux x86-64 with YASM/NASM syntax. Grab the concepts and apply them anywhere.</p>



<p>Introduction to If-Else in Assembly 00:00:00<br>Explaining the If-Else Design Pattern 00:00:56<br>Drawing the Basic If-Else Flow 00:01:01<br>Comparison and Conditional Jumps 00:02:30<br>Labels for True and False Blocks 00:03:07<br>Unconditional Jump to End 00:04:50<br>Diagram of Execution Flow 00:05:51<br>Alternative Pattern with Inverted Jump 00:07:00<br>Recapping the If-Else Pattern 00:08:45<br>Starting the Code Example 00:09:16<br>Setting Up Input and Strings 00:09:40<br>Calling External Functions 00:10:57<br>Entry Point and Prologue 00:11:40<br>Asking User for Integer Input 00:13:09<br>Creating the if_test Function 00:14:56<br>Preserving Callee-Saved Registers 00:15:51<br>Printing Begin Message 00:17:03<br>Implementing Simple If Block 00:18:29<br>Comparison and je Jump 00:19:18<br>True Block: Equality Message 00:21:08<br>Testing Simple If Examples 00:23:48<br>Transition to If-Else Blocks 00:24:21<br>Creating if_else_test Function 00:24:47<br>Setting Up Complex If-Else 00:26:25<br>First If: Equal to 5 00:27:22<br>True Block for Equal 5 00:28:33<br>Else If: Equal to 6 00:30:29<br>Else If: Less Than 10 00:34:17<br>Final Else Block 00:37:33<br>Done Label and Goodbye 00:38:23<br>Recap of Full Flow 00:39:06<br>Live Demo of All Branches 00:40:54<br>Signed vs Unsigned Jumps Note 00:43:38<br>Recommended Assembly Book 00:44:12<br>Conditional Jump Families 00:45:05<br>Closing and Practice Advice 00:46:48</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>
</ul>



<p>Please help support us!</p>



<ul class="wp-block-list">
<li>Subscribing + Sharing on Social Media</li>



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



<li>Subscribing to our Blog</li>



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



<p>Hello there.</p>



<p>In this video we&#8217;re going to talk about implementing simple if-else blocks in YASM x86-64 assembly.</p>



<p>Although if you&#8217;re writing in a different assembly language, this video will probably</p>



<p>still be useful to you because I&#8217;m going to explain the design pattern or how we can achieve</p>



<p>that at the assembly level.</p>



<p>So x86-64 YASM assembly, also known as AMD64 YASM assembly.</p>



<p>So if you have not seen my other videos about how to do conditional branching in the first</p>



<p>place, you probably want to go check that first because that knowledge is required for</p>



<p>this video.</p>



<p>There&#8217;s also a lot of other stuff that I&#8217;m just not going to explain in this video, such</p>



<p>as creating a make file, you know, compiling and linking your executable and so forth.</p>



<p>So see my other videos where all those concepts are explained already.</p>



<p>how to implement a simple if-else block.</p>



<p>So for starters, maybe let me draw a little bit.</p>



<p>Suppose we had, let me get rid of this thing</p>



<p>and then I&#8217;ll just do a regular notepad.</p>



<p>Suppose we had a higher level language,</p>



<p>just so you know what I&#8217;m talking about.</p>



<p>Suppose we had a higher level language</p>



<p>and we wanted to say if, you know, some expression is true.</p>



<p>We wanted to say if expression is true,</p>



<p>then print, you know, it was true.</p>



<p>Anybody remember that old movie, Little Nicky?</p>



<p>Somebody got exploded and then the guy next to him goes it&#8217;s not true</p>



<p>Okay, it was not true</p>



<p>So this is the basic idea of what we&#8217;re going to implement in assembly</p>



<p>I&#8217;m going to write a full program for assembly to show you this but um</p>



<p>You know you&#8217;re in C++ you&#8217;re in C you&#8217;re in I don&#8217;t know whatever language you&#8217;re in and</p>



<p>You obviously know how to use if-else blocks at this point hopefully</p>



<p>And now we&#8217;re going to just try to figure out how to implement them in assembly</p>



<p>So it&#8217;s important to understand that really under the hood</p>



<p>really under the hood there&#8217;s a bunch of stuff happening surprise right okay so</p>



<p>first off we look at this expression which could be I don&#8217;t know let&#8217;s say</p>



<p>five is greater than ten or a is equal to B or whatever it is that you put in</p>



<p>there you could make a very complicated expression we&#8217;re going to use simple</p>



<p>expressions for this video so if we&#8217;re comparing a to B we&#8217;ll end up using the</p>



<p>compare instruction remember there are two steps to conditional branching and</p>



<p>in YASM we first use the compare instruction against two operands and then that will end up</p>



<p>filling up the rflags register so that we can later conditionally jump based on the results</p>



<p>of the comparison. So we do a comparison and then you can imagine that the beginning of this</p>



<p>you know the the true body notice how it has a scope I&#8217;m going to just put this brace on another</p>



<p>line here to indicate that there is a scope from line four to six indicating all this code in here</p>



<p>in here is executed only if the if statement was true and then all of this other stuff is executed</p>



<p>only if the original comparison was false right so you can imagine now label is something like</p>



<p>my if was true so we can make a label for where that body starts and another label for where the</p>



<p>label is something like if was false and then what will happen is we can use a</p>



<p>conditional jump instruction after we do our comparison maybe I should put to</p>



<p>compare right here oh I&#8217;m using I&#8217;m using assembly style comments I should</p>



<p>be using a C style comments if I&#8217;m actually writing C++ here let me just do</p>



<p>that okay so this is the comparison instruction here and then here&#8217;s the</p>



<p>here and then here&#8217;s the beginning of the body of stuff to execute if it was true you can imagine</p>



<p>that there could be many statements here um if it was true or if it was false</p>



<p>just to prove to you that we can execute like a full body of stuff so we have a label that</p>



<p>designates when that body starts and then we have another label designating when the else body</p>



<p>starts and then we should have a label that uh that designates when the whole thing is over</p>



<p>label is something like if and or if is done or something like that so basically what we want to</p>



<p>do is to implement an if else a simple if else in assembly we&#8217;re going to say let&#8217;s do a comparison</p>



<p>and then we&#8217;ll do a conditional jump where are we going to conditionally jump well if the comparison</p>



<p>was true label. And then what will happen is execution will fall through.</p>



<p>When it reaches the end, we want to have another jump statement that unconditionally jumps</p>



<p>to the end of the if statement. If we didn&#8217;t, then whenever the expression was true,</p>



<p>we would end up executing all of the true statements and then it would fall through</p>



<p>to all of the false statements or the not true statements. So we have to have many jumps in here</p>



<p>let&#8217;s get into the body and then let&#8217;s finish and jump out of the body on the other hand if the</p>



<p>expression was false then our jump instruction is going to jump you know over the true body so</p>



<p>it&#8217;s not even going to do that at all it&#8217;s going to execute all of the else stuff and then it&#8217;s</p>



<p>you know sometimes a good idea if you have another jump here that just jumps to the end but you can</p>



<p>kind of see by the way i&#8217;ve written this out that there&#8217;s not going to be anything between the end</p>



<p>you know place where we&#8217;re finished with everything which means we don&#8217;t really</p>



<p>need an unconditional jump at the end of the else body we can just let the</p>



<p>execution fall through so maybe if I can draw a little diagram here I&#8217;ll say I</p>



<p>don&#8217;t know I&#8217;ll do like if put it in a little bubble and we&#8217;ll say that if it</p>



<p>was false we jump to one place and if it was true we jump to another place</p>



<p>we jump to another place.</p>



<p>I hope you&#8217;ve already started to understand this by now.</p>



<p>So we&#8217;ll say if the expression is true, we jump here.</p>



<p>If the expression is false, we jump over here.</p>



<p>And so true would be saying, let&#8217;s jump to the if was true.</p>



<p>So we&#8217;re going to jump to if was,</p>



<p>I&#8217;ll put a T there because I&#8217;m running out of space.</p>



<p>If was true.</p>



<p>was I&#8217;ll put an F false and then at the end of the true we jump to the done</p>



<p>label so I&#8217;m just gonna put done maybe down here</p>



<p>so at the end of the true we just unconditionally jump to the done area</p>



<p>and then at the end of the false we jump unconditionally to the done area as well</p>



<p>here&#8217;s something interesting though when we have a comparison instruction and</p>



<p>conditional branch instruction let&#8217;s say uh let&#8217;s say a equals b we did that comparison and then we</p>



<p>wanted to jump into the true area if a equals b was true so that means we&#8217;ll say jump</p>



<p>equal so if a is equal to b after we compare well let&#8217;s say a comma b we&#8217;re going to use registers</p>



<p>when we come to the code we&#8217;ll say compare a and b and then jump if they&#8217;re equal to some label</p>



<p>but the conditional branching instructions they only jump to one</p>



<p>potential place or fall through so if the comparison was false meaning if those</p>



<p>two things were not equal then we&#8217;re not going to actually be able to jump to a</p>



<p>different label we&#8217;re going to simply fall through to the next instruction so</p>



<p>in that case the very next instruction would get executed let&#8217;s just put a jump</p>



<p>was</p>



<p>false.</p>



<p>Meaning</p>



<p>we compare A and B</p>



<p>and if the two things are equal</p>



<p>we&#8217;ll jump into the true block.</p>



<p>Otherwise we fall through to the next instruction</p>



<p>which</p>



<p>that&#8217;s a very poorly written J</p>



<p>but we&#8217;re going to unconditionally jump to false.</p>



<p>So if we did not</p>



<p>jump to the true area we fall through to the next</p>



<p>instruction where we will always</p>



<p>jump to false and that implements the diagram</p>



<p>that implements the diagram that you see up above.</p>



<p>I mean, you know, if we have if statement, we compare,</p>



<p>maybe I&#8217;ll do, you know, A equals B.</p>



<p>We jumped to true, if was true.</p>



<p>And otherwise we end up falling through</p>



<p>and then jumping to if was false.</p>



<p>And then at the end of both of those,</p>



<p>we have an unconditional jump instruction</p>



<p>that jumps to the done.</p>



<p>So I&#8217;ll put JMP down here just to let you know,</p>



<p>you know, at the end of each of these blocks,</p>



<p>that they are jumping out of themselves at the very end to the done area maybe</p>



<p>I&#8217;ll put an arrow here so that we know both of these jumps end up jumping to</p>



<p>the done area that&#8217;s the basic idea for how to implement an if-else block a very</p>



<p>basic one we&#8217;re gonna do more complicated ones later but for now we</p>



<p>kind of have the idea down I think let&#8217;s look at some code dang I blew 10 minutes</p>



<p>already on that okay so I&#8217;m gonna copy paste some code from my solution here</p>



<p>code for my solution here this again this is not like a beginner&#8217;s assembly</p>



<p>video if you need to learn how to write assembly in the first place how to</p>



<p>compile you know link create a make file and so forth you need to see my other</p>



<p>videos first but for now we&#8217;re just going to assume that you know how to</p>



<p>make a data section in Yasm and we&#8217;re gonna say let&#8217;s make a bunch of strings</p>



<p>so first I&#8217;m gonna ask the user for an integer and then I&#8217;m gonna make a bunch</p>



<p>of decisions like I&#8217;m gonna do you know an if-else block to test what kind of</p>



<p>what kind of number they put you know did they make a number that uh</p>



<p>equal one if it was equal to something oh did I ask twice I can&#8217;t remember what I&#8217;m doing</p>



<p>but basically we&#8217;re going to print something if their number was equal to something else</p>



<p>we&#8217;re going to print uh something if their number that they inputted was equal to five we&#8217;re going</p>



<p>to print something else if their number was equal to six we&#8217;re going to print again something else</p>



<p>a bunch of stuff and then wait isn&#8217;t this the complicated example oh no i think i am using code</p>



<p>for my more complicated example else less than 10 i don&#8217;t know maybe this is the simple one</p>



<p>let&#8217;s double check i guess if i put more complicated code in here you&#8217;ll probably be happy</p>



<p>but whatever i thought this was going to be a simple example so i&#8217;m just defining strings at</p>



<p>codes stuff that is covered in other videos now i&#8217;m going to start my text section so my text</p>



<p>section begins with a declaration that i&#8217;m going to use two external functions so this video is</p>



<p>not about this library that takes input and sends output i have other videos for that but basically</p>



<p>i&#8217;m just using a library that lets you type an integer into the terminal and then it will print</p>



<p>a different number to the terminal for you so you can imagine if you wanted to follow along</p>



<p>imagine if you wanted to follow along with this code at home and you don&#8217;t</p>



<p>have this library you can just hard code your numbers just to prove to yourself</p>



<p>that you can get it to work or you can use a different library if you have a</p>



<p>hybrid program and you&#8217;re linking against GCC you can just use scanf and</p>



<p>printf pretty much those take a little bit more work to do but you can do it</p>



<p>anyway so our entry point is going to be called if tester it&#8217;s a function called</p>



<p>Again, this is a hybrid program and hybrid programs are not covered in this video, but you can imagine that there is a C++ module elsewhere in my source that is just going to call on a function called if tester.</p>



<p>And so that&#8217;s why I&#8217;m marking this as global so that other modules in my program can call on if tester.</p>



<p>So it&#8217;s just a little label that we can jump into or in this case call into.</p>



<p>Let me go down to the bottom of that.</p>



<p>We&#8217;ll put a return statement at the very end.</p>



<p>very end so now this is officially a function and notice how i made a note here that says r12 is</p>



<p>the user&#8217;s inputted integer so that means i&#8217;m going to be using r12 and since r12 is designated</p>



<p>in the abi the application binary interface as callee saved or callee preserved that means i</p>



<p>have to do a push pop pair to preserve it or i&#8217;ll get in lots and lots of trouble my program will</p>



<p>prologue which my favorite book also calls the prologue and then I&#8217;m going to</p>



<p>say epilogue and so now we have a function that basically doesn&#8217;t do</p>



<p>anything but we can at least jump into it let&#8217;s see if this compiles as is I</p>



<p>think it probably will yeah so the driver just says hello that&#8217;s the C++</p>



<p>program with the actual main function and it calls my if tester function but</p>



<p>nothing happens the if tester function returns control to the driver and then</p>



<p>the driver just says okay i got control back so nothing really happened so now let&#8217;s ask the user</p>



<p>for some input so again this is not a video about this library or how to print with this with system</p>



<p>calls see my other videos if you need help on that but basically we&#8217;re going to print a message to</p>



<p>the user hey please input an integer and then we&#8217;re going to call on a library function that</p>



<p>lets them type in a number and then returns it to us in rax we&#8217;re then going to store it</p>



<p>well just basic stuff right so if I run this again it&#8217;s going to ask for an</p>



<p>integer please enter an integer if I can type that and then nothing else happens</p>



<p>okay now we can kind of start making more decisions so I&#8217;m going to let&#8217;s see</p>



<p>if test if test if test okay so what I need to do now is run another function</p>



<p>called if tests several times and I&#8217;m going to compare the number that the</p>



<p>times and I&#8217;m going to compare the number that the user inputted so remember r12 is the user&#8217;s</p>



<p>input so I&#8217;m going to load that as the first argument of a function call and then I&#8217;m going</p>



<p>to load the number five as the second argument of a function call probably not a great idea to hard</p>



<p>code numbers in your assembly you should probably define them up in the globals or the the data</p>



<p>section at least as just regular defines and not numbers in memory but I&#8217;m going to just keep these</p>



<p>So three times we&#8217;re gonna call if test and then also another function called CRLF. So first I&#8217;m gonna paste in</p>



<p>CRLF</p>



<p>Where the heck is that? Oh, dude?</p>



<p>Again, this is not a video about the basics</p>



<p>So you&#8217;re just gonna have to trust me or go watch my other videos if you don&#8217;t understand what I&#8217;m doing here</p>



<p>But I have a function called</p>



<p>CRLF and its whole job in life is just to print a new line for me just because I like to do it that way</p>



<p>handles the CRLF call. Now let&#8217;s make another function called if test.</p>



<p>So I&#8217;m going to start that by designating its label right after this block of</p>



<p>code here, maybe before CRLF.</p>



<p>So we have like a basic if test function and here&#8217;s my prototype just to remind</p>



<p>myself what I&#8217;m going to be doing.</p>



<p>It&#8217;s going to take an input and it&#8217;s going to take another input for a test</p>



<p>against me. So the first one is like the user&#8217;s input.</p>



<p>The second one is the number that I want to test it against.</p>



<p>number that I want to test it against they&#8217;re both longs which means they are both integers</p>



<p>which means the incoming arguments are going to be rdi and rsi if you&#8217;re respecting the abi</p>



<p>and then some notes to remind myself I&#8217;m going to be using r12 and r13 inside of this function so</p>



<p>I&#8217;m going to start by putting a return statement there since that is what it takes to make a label</p>



<p>into a return into into a function then I&#8217;m going to preserve the callee saved registers again if</p>



<p>don&#8217;t know what i&#8217;m talking about see my other videos we&#8217;re going to push r12 and push r13 so</p>



<p>that they are not ruined for the caller we call this the prolog then at the very bottom of the</p>



<p>function we have the epilog which just restores uh the registers in reverse order you&#8217;ve got to</p>



<p>do it in reverse order see my other videos if you don&#8217;t understand why okay so that&#8217;s basically a</p>



<p>function that can get called it doesn&#8217;t do anything let me double check that the program still actually</p>



<p>works. 66 and nothing happens. We just printed CRLF a bunch of times. Okay, so now we&#8217;re ready</p>



<p>to continue. So let&#8217;s grab the function arguments. Remember we were going to use R12 and R13 for the</p>



<p>user&#8217;s input and the number we will test against. Those came into our function with RDI and RSI.</p>



<p>So I&#8217;m just going to copy those two incoming arguments into R12 and R13. And you&#8217;re supposed</p>



<p>keep the user&#8217;s input in RDI then the moment I call any other function or system call I&#8217;m just</p>



<p>going to lose that data so I&#8217;m going to keep it inside of R12 and R13 so I grab the function</p>



<p>arguments and then I print a begin message just to let the user know that we&#8217;re going to start</p>



<p>you know making tests against our number so this is just basically a message saying hey begin the</p>



<p>if test and then print what we&#8217;re going to check against so the next thing is</p>



<p>I&#8217;m going to let the user know what the second incoming argument was.</p>



<p>If you look at R13 here, that was RSI, which was the second argument.</p>



<p>So the test against me number.</p>



<p>So we&#8217;re going to check the user&#8217;s input against whatever we called for the second argument.</p>



<p>So I just wanted to print it out.</p>



<p>You know, like we&#8217;re testing your number against whatever.</p>



<p>So that means I need to make another call to my little printing library here.</p>



<p>To RDI which is the first argument notice how we already we already destroyed RDI. That&#8217;s why I&#8217;m keeping the input in our 12 and our 13</p>



<p>And then we&#8217;re gonna make that call and we can just assume everything will go according to plan at that point and then</p>



<p>Then we&#8217;re gonna print a special message only if something actually happens</p>



<p>So we&#8217;re gonna implement the if else block in a moment. Let me just run this real fast</p>



<p>and then it says we&#8217;re calling the function three times and we&#8217;re saying the basic test has begun</p>



<p>we&#8217;ll test against this number five so we&#8217;re testing your input against five and then six and</p>



<p>then seven and then we didn&#8217;t actually do anything we&#8217;re about to okay so then the next thing is we&#8217;re</p>



<p>going to print a special message only if the user entered the right number so first off remember we</p>



<p>see if else block and converting it into assembly so i&#8217;m sort of placing that in comments for you</p>



<p>so the comparison instruction i i didn&#8217;t want to put the r12 equals r13 inside of the same comment</p>



<p>that lines up with the the compare instruction because the compare instruction as i&#8217;ve said in</p>



<p>other videos already it doesn&#8217;t actually check to see if something&#8217;s equal it just makes a bunch of</p>



<p>called r flags with information that we can later use to decide if the two things were equal or not</p>



<p>equal or greater than or less than or whatever so that&#8217;s why i chose to put that on on the next line</p>



<p>so at this point we&#8217;re saying if those two things were equal and that&#8217;s how i implement the expression</p>



<p>in the middle then let&#8217;s jump to a special label called if test if was equal so you can come up</p>



<p>with any scheme you want for your labels but for me when i have when i have sub labels inside of a</p>



<p>when i have sub labels inside of a function i like to just suffix the function&#8217;s name with an</p>



<p>underscore and then start thinking of sub labels after that so everything&#8217;s like kind of clean</p>



<p>there&#8217;s less chance of overlap in labels if you have like a giant module with tons of functions</p>



<p>so i&#8217;m going to say this is like my main if that i&#8217;m checking and uh i&#8217;m going to jump to a label</p>



<p>called was equal meaning you know this evaluated to true that means that should be the true part</p>



<p>block let&#8217;s see do i still have that code here yeah right so here i&#8217;m going to jump to</p>



<p>the true block so you know if was true in the first example that we talked about so i&#8217;m going</p>



<p>to say if it&#8217;s if those things were equal jump to the code for the true block okay that means i</p>



<p>actually need the true block uh but i guess we&#8217;re going to set that up in a second otherwise if that</p>



<p>did not jump away it means that those two things are not equal so i said i should jump to the</p>



<p>I should jump to the else block or the false block.</p>



<p>Wait, do I have else in this example?</p>



<p>Oh, okay, okay.</p>



<p>This first thing that we&#8217;re looking at is only if.</p>



<p>So we don&#8217;t even have an else block yet.</p>



<p>We&#8217;re going to do that as the second example.</p>



<p>So we&#8217;re basically going to jump to the done area</p>



<p>if we didn&#8217;t jump into the true area.</p>



<p>And then at the end of the true area,</p>



<p>we can either jump to the done area</p>



<p>or we can let the execution fall through.</p>



<p>fall through okay so now that means i need if was equal and if i just copy paste a big giant</p>



<p>block of code and try to explain it to you real fast let&#8217;s do this</p>



<p>okay so we were going to jump to if was equal if r12 was equal to r13 and then um</p>



<p>we uh have this you know label here and notice how i&#8217;ve kind of like put a brace here indicating</p>



<p>like put a brace here indicating hey this is the beginning of the true block body you should</p>



<p>consider doing this too when you&#8217;re first learning and even after you&#8217;ve learned because let&#8217;s face</p>



<p>it assembly is tough and so in the true area i&#8217;m just going to print the equality message i&#8217;m going</p>



<p>to say hey your number was equal to you know whatever and then uh i&#8217;m going to actually print</p>



<p>the let&#8217;s see r13 number so that was uh i think the number to compare against the test against</p>



<p>against me number so that means here in this message we&#8217;re going to say hey your number was</p>



<p>equal to the number that we tested against so then otherwise let&#8217;s see or sorry after that</p>



<p>we&#8217;ll print the suffix of the message um and so you know i just i just like to make pretty</p>



<p>pretty uh printed messages so let&#8217;s see where&#8217;s the suffix here i can&#8217;t even find it um how about</p>



<p>oh i should have put suffix instead of the number two that would have been better so what i wanted</p>



<p>to do is say your input was equal to and then print the number and then after that print an</p>



<p>exclamation just to prove to you how easy it is to to make a pretty message that&#8217;s formatted nicely</p>



<p>for the user um or your professor or whoever so uh you know you basically just print a number and</p>



<p>then you or sorry you print the prefix and then you print the number and then you print the suffix</p>



<p>suffix and then that&#8217;s the end of the true body and then since we&#8217;re done with the true body we</p>



<p>can basically just say all right now we&#8217;re done with the if so the next instruction that follows</p>



<p>is the done area again looking back at the example here that would be sort of like here after the</p>



<p>whole entire block was finished we&#8217;re ignoring the else in this code but you can imagine we&#8217;ll do</p>



<p>that soon so if the user&#8217;s number matched something we execute a true body if not we jump to the done</p>



<p>to the done area and if the user&#8217;s uh number did not match then we just immediately jump to the</p>



<p>done area so that we don&#8217;t do the true area and then we write comments to ourselves to help us</p>



<p>remember oh look here&#8217;s like the comparison and then here&#8217;s the body of true and then uh the done</p>



<p>area is like we could put another comment if we want we could say like this is done but i kind of</p>



<p>think like i kind of think the label is self-explanatory so let&#8217;s see if this worked it&#8217;s</p>



<p>was talking too fast we&#8217;ll run it and we&#8217;ll say 44. okay so nothing matched any of the numbers so</p>



<p>let&#8217;s type the number six so that we get a little message on the second one so i&#8217;m going to type the</p>



<p>number six and you can see it did not match the number five and it did match the number six so</p>



<p>we got that true block executing when we called on that function where the number to compare to</p>



<p>nothing there. So now we know simple if blocks.</p>



<p>The next thing we&#8217;re going to do is if else blocks.</p>



<p>All right.</p>



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



<p>Not sure if I&#8217;m going to cut the video and split this up into multiple parts.</p>



<p>Probably would have been a smart idea.</p>



<p>Let me know if I ended up doing it.</p>



<p>We&#8217;re at about 25 minutes now.</p>



<p>But anyway,</p>



<p>so now we&#8217;re going to look at if else blocks.</p>



<p>if else blocks.</p>



<p>So I&#8217;m going to start off with another function.</p>



<p>I&#8217;m going to call it if else test.</p>



<p>So here&#8217;s the tester.</p>



<p>It called on if test.</p>



<p>And then I&#8217;m going to, you know, I had the if test function that I did previously.</p>



<p>And so now we&#8217;re just going to make an if else test function.</p>



<p>The if else test, it just has one input, one argument for input.</p>



<p>And we&#8217;re going to just sort of compare it against different values.</p>



<p>of compare it against different values we&#8217;re not going to call this multiple times with different</p>



<p>values to compare against so that means let&#8217;s see we only need to use one register so</p>



<p>i&#8217;ve designated r12 as the user&#8217;s input so that&#8217;s where we&#8217;re going to store it which means we</p>



<p>should preserve it in the prologue so i&#8217;m going to push r12 and then again if you don&#8217;t understand</p>



<p>some of the basic stuff that i&#8217;m that i&#8217;m skipping over see my other videos where i explained</p>



<p>to know to actually have this kind of a program. So I&#8217;m going to have a function that enters and</p>



<p>it returns at the end. It uses R12 so we will preserve it with a push pop pair.</p>



<p>And then the first thing that I should do is grab the user&#8217;s input from the first argument.</p>



<p>And if you&#8217;re respecting the ABI that means it should come from RDI. So I&#8217;m going to move RDI</p>



<p>somebody remind me that the first part of the program has to actually call this function or</p>



<p>nothing will happen. So we&#8217;re going to say hello. That&#8217;s just a simple message that we talked about</p>



<p>before. And then now we&#8217;re going to actually implement the if else block. So it&#8217;s like a</p>



<p>little bit more complicated than just the simple if block. It&#8217;s going to be this whole example that</p>



<p>we talked about before. Let me see. Maybe I should add the calls to this block real fast. So we have</p>



<p>to this block real fast so we have the if tester and then run the complex if else tests</p>



<p>right before r12 okay let me just double check that i&#8217;m making a call at the right spot here</p>



<p>so we have r12 and 7 and then epilog okay so now finally in our program we&#8217;re going to have a call</p>



<p>to um the if else test function that we&#8217;re just making right now</p>



<p>Okay, so we have that.</p>



<p>And let me find that source again real fast.</p>



<p>If else test, we got the prologue.</p>



<p>We take their input and then we say hello.</p>



<p>Okay, so now we need another label that begins the if block.</p>



<p>So what we&#8217;re doing is we&#8217;re checking to see if the user&#8217;s input was equal to five.</p>



<p>And then we&#8217;re going to say something if it was.</p>



<p>And otherwise, we&#8217;re going to do an else block on that.</p>



<p>block on that so again i like to write my comparison instructions with a blank expression</p>



<p>in terms of the c equivalent comment so notice how the we&#8217;re checking to see if r12 is equal to</p>



<p>five i put that on the next block because we&#8217;re going to jump to the to the true part of the if</p>



<p>block if it equals five so that&#8217;s why i put that there the comparison instruction pretty much just</p>



<p>compares r12 with five sets a bunch of values into the r flags registers so that we can later</p>



<p>so that we can later conditionally jump if we want to.</p>



<p>So basically we&#8217;ll jump to the true place if that was true.</p>



<p>And then if not, execution falls through to the next statement,</p>



<p>which will just jump to the else place.</p>



<p>So we need more labels is what I&#8217;m saying.</p>



<p>So now we need a body for if the statement was true</p>



<p>or the expression was true,</p>



<p>we want to be able to execute the true portion of the if block.</p>



<p>the if block so that&#8217;s this right here so we&#8217;re going to jump to if it did equal to five you</p>



<p>could imagine you know making a better label instead of equal five you could say first if</p>



<p>first else if complicated block true scope or true block or something but i just put equal to five</p>



<p>basically saying we&#8217;ll execute this code if it was equal to five so again we&#8217;re just kind of like</p>



<p>into this label equal five if r12 was indeed equal to five so that means if it was we execute</p>



<p>all this code right here we know we&#8217;re finished when we have the very last line saying let&#8217;s jump</p>



<p>to finish the the if else block again just just to clarify</p>



<p>we do the comparison first and if the comparison was true then we&#8217;ll jump into the true area so</p>



<p>you know we&#8217;ll jump into the true area and then all of these uh instructions get executed</p>



<p>instructions get executed but if we don&#8217;t have a way to jump out of that block then whoops</p>



<p>all of the else statements are going to get executed too right so we don&#8217;t want that</p>



<p>we don&#8217;t want to execute both the true and the false statements we want to have a jump instruction</p>



<p>at the very end i&#8217;ll put jmp just so that we jump to the to the end of the if else block</p>



<p>you know jump to the place where it&#8217;s just all over and finished</p>



<p>Okay, so now I&#8217;m going to look at, whoops, turn that off.</p>



<p>So we have equal five.</p>



<p>So we&#8217;re going to jump to if else test if done.</p>



<p>Let me just double check to make sure I&#8217;m not forgetting anything.</p>



<p>Oh, we need to jump here.</p>



<p>Basically meaning we&#8217;re going to jump into the else portion.</p>



<p>So here we covered jumping into the true portion, you know, the regular top block.</p>



<p>Now here we&#8217;re going to jump into the else portion.</p>



<p>We need a label and some code for that.</p>



<p>code for that so this is the else six begin i copy that oh man it&#8217;s starting to get kind of</p>



<p>hectic in my brain here the copy pasting is worse than actually writing the program</p>



<p>so uh if the comparison was not equal like if r12 was not equal then execution falls through</p>



<p>to line 216 and then we unconditionally jump to the l6 begin area which is like down here</p>



<p>like down here and then we&#8217;ll print something else.</p>



<p>We&#8217;ll, oh, we&#8217;ll, we&#8217;ll check again.</p>



<p>So we&#8217;re doing like, um, if else, if else.</p>



<p>Okay. So originally when I was talking about the, uh,</p>



<p>if else block, I didn&#8217;t do a,</p>



<p>I didn&#8217;t do like a very complex if else statement.</p>



<p>We&#8217;ll say a is greater than B something like that.</p>



<p>So I&#8217;ll just put a more code here just so you know that we can do if else,</p>



<p>if else blocks but just you know again keep in mind that every scope here that you&#8217;re going to</p>



<p>try to run based on some condition you just make it its own label and make sure that at the very</p>



<p>end of the scope you jump away so that you reach the very end of all this stuff because just as a</p>



<p>quick review if we are just writing in c or c plus plus only one of these blocks is going to execute</p>



<p>right like if a is equal to b then only that first block will execute the second and third blocks</p>



<p>will not execute it&#8217;ll jump after that all the way down to line 21 only if a does not equal b</p>



<p>do we even have the chance of checking to see if a is more than b if it&#8217;s false then we&#8217;ll have the</p>



<p>chance to check the else and if it&#8217;s true we will only execute the code in the line 12 block you</p>



<p>know imagine there are more statements there and when that block is done then we will jump to line</p>



<p>to b and a is not greater than b so just a quick uh you know c plus plus uh you know design pattern</p>



<p>review if else block review so we have like an else if here we&#8217;re going to say check if the input</p>



<p>was equal to six so we just do the same thing that we did before we compare r12 the user&#8217;s input with</p>



<p>six we jump if they were equal to the else if equals true block and if not execution falls</p>



<p>Less than 10 begin block. So this is going to be like really complicated</p>



<p>How many lines did I actually I think I got excited when I wrote this</p>



<p>Okay, else if equal six true</p>



<p>My challenge to you is to come up with labels that are like way easier than the labels that I came up with</p>



<p>All right, so we&#8217;re gonna do this I</p>



<p>Can almost guarantee that when I&#8217;m done copy pasting everything something is not going to compile because I forgot a label somewhere</p>



<p>Else if equals six true, okay</p>



<p>equals six true okay so what&#8217;s happening here again um uh so at this point you know the first</p>



<p>if uh expression was not true r12 was definitely not equal to five so we jumped down to else if</p>



<p>equal six begin which was here and so then we just make another comparison to see well okay it was</p>



<p>those two things weren&#8217;t equal it wasn&#8217;t equal to five so let&#8217;s check to see if it was equal to six</p>



<p>to yet another scope.</p>



<p>If it was false, we go down to line 237</p>



<p>and jump to yet another scope.</p>



<p>So here is what will get executed</p>



<p>if R12 was indeed equal to six,</p>



<p>and then we&#8217;re just basically gonna say it to the user</p>



<p>and then jump to the done label,</p>



<p>meaning like we&#8217;re totally done with our if else block.</p>



<p>Notice how the first if here,</p>



<p>when it was totally finished, it jumped to the done area.</p>



<p>this else if block is also jumping down to the if done area.</p>



<p>So eventually we&#8217;re going to need that label.</p>



<p>Okay.</p>



<p>So then next we&#8217;re going to check to see if the user&#8217;s input was equal to a 10.</p>



<p>So like kind of the same thing here.</p>



<p>We&#8217;re going to do another copy paste and we&#8217;re going to say, all right.</p>



<p>So if the user&#8217;s input was not equal to, let&#8217;s see,</p>



<p>if it was not equal to five, then we jump down here for our next comparison.</p>



<p>comparison we check to see if it&#8217;s equal to six if it was not equal to six then we jump down to</p>



<p>the less 10 begin line which is like all the way down here we do another comparison to see all right</p>



<p>well is it less than 10 you know if it was not equal to five or not equal to six then we check</p>



<p>is it less than 10 if it uh if it is then we uh jump to the else if equal less 10 true block which</p>



<p>I made this way too complicated. I realize that now, but it&#8217;s too late. I&#8217;m going for it, man.</p>



<p>Anyway, so if that statement is true, if R12 was indeed less than 10, then we jump to this block</p>



<p>and we basically just say that to the user and then we jump to the done. So finally, notice how</p>



<p>this part right here on line 259, it&#8217;s basically saying if R12 was not less than 10, then we&#8217;ll</p>



<p>then we&#8217;ll jump somewhere else notice how it&#8217;s just else right so this is like the very the very</p>



<p>bottom so i think the way that i wrote this uh code is uh we have two else ifs right we have like</p>



<p>an if five else if six else if less than 10 so maybe i could do something like this um if r12</p>



<p>r12 I think I said six just now right hopefully I actually did say six</p>



<p>otherwise if r12 is less than 10 then do some stuff otherwise if nothing else</p>



<p>matched then we&#8217;ll execute you know this block right here so again remember</p>



<p>every single scope has to have its own label so that you know where to jump and</p>



<p>it&#8217;s also a really really smart idea for every single scope to have you know</p>



<p>to have a little jump instruction that jumps past all of the if else if else if else stuff</p>



<p>so we&#8217;ll say like you know label you know done so that we can make sure that only one of these</p>



<p>blocks actually executes which is how you&#8217;re supposed to imagine c and c plus plus work</p>



<p>um and so it&#8217;s just complicated because there&#8217;s a lot of stuff to copy paste but you can just</p>



<p>still see you know only one of these blocks ever is supposed to execute so we give the first one</p>



<p>we jump into it if it&#8217;s true if it&#8217;s not true then we give the second one a chance</p>



<p>we jump into it if it&#8217;s true if not we jump to compare the third one if it&#8217;s true then we jump</p>



<p>to its scope if not we jump to the else and the else always executes if nothing else above</p>



<p>was true so that&#8217;s the basic idea here oh dear i&#8217;ve probably lost my place</p>



<p>looks like i just copy pasted less 10 true which was this right here so</p>



<p>so um less than true or less than 10 true okay so we told the user your stuff is less than 10</p>



<p>and then we jumped to the done area so that means we are probably working on the else area okay let</p>



<p>me grab that so now finally we&#8217;re going to have the else area which is going to you know finish</p>



<p>this all up that&#8217;s going to be after the if done so if nothing else matched then we will end up</p>



<p>nothing else matched then we will end up jumping to the else area and then we&#8217;ll basically</p>



<p>just tell the user none of the conditions seemed to have applied and then even at the</p>



<p>end of the else block even though you could probably get away with just letting execution</p>



<p>fall through just to save yourself one instruction you know you could comment that out assuming</p>



<p>you were sure that the very next instruction was the beginning of the done area but otherwise</p>



<p>I&#8217;m just going to play it safe and jump directly there then we have to make the actual done</p>



<p>So, just so you know, a label doesn&#8217;t have to have any instructions.</p>



<p>We could have something like this, if else test say goodbye.</p>



<p>We could have two labels right next to each other and one doesn&#8217;t actually have instructions.</p>



<p>That&#8217;s totally fine.</p>



<p>If you jumped to the done area, then execution would just fall through to the next valid</p>



<p>instruction which could go through another label.</p>



<p>So you know, we could have a say goodbye label and an if done label.</p>



<p>if done label, I&#8217;m just going to have the goodbye stuff happening inside of the done.</p>



<p>But for clarity&#8217;s sake, you might want to keep that label in there that I just deleted.</p>



<p>And all that we need to do at the very end when we&#8217;re done with everything is just say goodbye.</p>



<p>So I&#8217;m just printing a message.</p>



<p>So just to do a quick recap here, let&#8217;s see.</p>



<p>We come in with the user&#8217;s input as R12.</p>



<p>We ask, does R12 equal five?</p>



<p>If that&#8217;s true, we&#8217;ll say that it was equal to 5, and then we&#8217;ll go to the done area,</p>



<p>meaning we&#8217;ll skip past all the other blocks for the if-else block, or all the other scopes.</p>



<p>But if that did not equal 5, then we&#8217;ll fall through to that jump instruction,</p>



<p>which takes us to the next test, which is going to be our else-if equals 6.</p>



<p>So we are checking now to see if R12 is equal to 6.</p>



<p>If that&#8217;s true, we jump to this next block.</p>



<p>Why do we need to jump to a block that&#8217;s so close?</p>



<p>Well, if we don&#8217;t, then we&#8217;re going to end up definitely jumping to the next comparison</p>



<p>and you know, that wouldn&#8217;t work.</p>



<p>So we&#8217;re just kind of jumping over this unconditional jump statement and we&#8217;re saying, all right,</p>



<p>your input was definitely equal to six.</p>



<p>And then we&#8217;re jumping to the done area just past everything.</p>



<p>But if that wasn&#8217;t true, then we hit this unconditional jump that takes us to the next</p>



<p>comparison to see if the user&#8217;s input was less than 10.</p>



<p>You know, if that&#8217;s true, then we go to the true area to print another message and then</p>



<p>go to the done area.</p>



<p>If it was false, we fall through to the else jump, which will take us to here.</p>



<p>And notice how the else scope doesn&#8217;t actually make any comparisons because, you know, when</p>



<p>you have like an if else, sorry, when you have an if else if else if else if, you know,</p>



<p>any number of else if blocks, the else will always be executed if nothing above it actually</p>



<p>did execute.</p>



<p>execute so if you have an else block that means something will execute so we&#8217;re not doing any</p>



<p>comparisons we&#8217;re just saying you know when that scope is done we&#8217;re just going to jump to the done</p>



<p>area so all of these different scopes they&#8217;re jumping to the done area when they finish and</p>



<p>the done area is just this label right here where we say goodbye and that&#8217;s it let&#8217;s see did i copy</p>



<p>paste everything that i was supposed to i think so probably so let&#8217;s run the program and see if it</p>



<p>All right, it at least compiled.</p>



<p>So the basic if test, that was the first part of either this video or the previous video,</p>



<p>depending on whether I chose to split this up.</p>



<p>So let me comment out those calls real fast.</p>



<p>So I&#8217;m going to just comment out these calls real quick so we can only deal with the complicated</p>



<p>if else block.</p>



<p>So I&#8217;m going to enter like a three.</p>



<p>Whoops, let me do it again.</p>



<p>Three.</p>



<p>And so begin the if else test.</p>



<p>test your input was definitely less than 10 and then we end the if-else test so notice how only</p>



<p>one scope executed three was definitely less than 10 what other numbers did we have let me write</p>



<p>them down somewhere so I don&#8217;t forget oh they&#8217;re written down right here so we entered a three</p>



<p>which was definitely not a five and not a six so that&#8217;s why the less than 10 block executed maybe</p>



<p>only the first scope should execute so it says your input was equal to five notice how it didn&#8217;t</p>



<p>mention that it was a six or less than ten and then if we do a six it should just tell us that</p>



<p>we have a six it will not mention the five it will not mention the ten so we did we did five</p>



<p>already and then we did six and we did like a two which was less than ten we could also do a one</p>



<p>which was less than ten we can do anything that was less than ten and then the else would be if</p>



<p>And then the else would be if our input is probably like 11 or greater,</p>



<p>meaning it&#8217;s not less than 10 and it&#8217;s also not five or six.</p>



<p>Just we can see the else block.</p>



<p>So I&#8217;m going to do 11, which is the first number that should trigger the else block.</p>



<p>And it says no conditions were satisfied,</p>



<p>which was the message inside of our else block.</p>



<p>Let me just show you that again real fast.</p>



<p>This was the else block.</p>



<p>So message if else else or labeling on my port, I realize that.</p>



<p>But it basically says no conditions were satisfied.</p>



<p>The if else else.</p>



<p>I think that&#8217;s basically everything that I wanted to show you.</p>



<p>At this point, you should feel like you&#8217;re starting to become an expert at complicated</p>



<p>if else if else blocks, converting those from a higher level language into assembly.</p>



<p>assembly and I honestly recommend that you practice this like crazy while you&#8217;re trying</p>



<p>to get more used to it but you know hopefully you have everything you need at this point</p>



<p>keep in mind I&#8217;ve said this at the beginning I&#8217;ve actually I think I said this in a different video</p>



<p>when we use these branching instructions notice how I have jump equal to where&#8217;s that less than</p>



<p>yeah notice how I have a instruction jump less than the the family of conditional branching</p>



<p>conditional branching instructions that compares less than greater than less than or equal to</p>



<p>greater than or equal to the ones that I&#8217;m using here apply to signed integers and they won&#8217;t</p>



<p>necessarily work with unsigned integers and they won&#8217;t work with floats if you compare floats later</p>



<p>so just keep that in mind let me pull up my favorite book again real fast</p>



<p>where what the heck is that book oh dude where&#8217;s my document viewer document viewer can I get</p>



<p>document viewer can I get there there we go so I guess I didn&#8217;t introduce this</p>



<p>book at the beginning of this video but I probably should have this is my</p>



<p>favorite assembly book you can turn yourself into an expert with this book</p>



<p>by just on its own it&#8217;s open source and free the author gives this away he&#8217;s a</p>



<p>genius the person who wrote this book is a dr. Ed Jorgensen he&#8217;s a professor he</p>



<p>wrote this for his own classes and again it&#8217;s like a free open source book you</p>



<p>download a copy from his website if you look this up and and convert yourself</p>



<p>into an expert so let me collapse everything here and then I&#8217;ll go to</p>



<p>instruction set overview control instructions conditional control</p>



<p>instructions and I just want you to see real fast just as a recap I talked about</p>



<p>this in a previous video but when it comes to comparing things and checking</p>



<p>operands because if you want to see if two operands are equal you just check to see if</p>



<p>all of their bits are equal you don&#8217;t even really care whether they&#8217;re both integers or not</p>



<p>on the other hand notice how there is like a family here jump less than jump less than equal</p>



<p>to jump greater than jump greater than equal to that those instructions apply only if your</p>



<p>if they are unsigned or if you&#8217;re using floats for your comparisons you have to use this other family</p>



<p>of jump conditional branching instructions called jump below jump below equal jump above jump above</p>



<p>equal and i&#8217;m sure you can infer that jump below is the same thing as jump less than right jump</p>



<p>less than or equal to is the same thing as jump below or equal to it&#8217;s just that you need to use</p>



<p>a different instruction uh if you&#8217;re using signed integers or floats versus sorry sorry</p>



<p>a versus sorry sorry you need to use different instructions if you&#8217;re using signed integers</p>



<p>versus unsigned integers or floats so keep that in mind the code demo that i just showed you it&#8217;s</p>



<p>for signed integers if you were going to use unsigned integers or floats you would this</p>



<p>program wouldn&#8217;t work for you you&#8217;d need to replace my my branching instructions with the</p>



<p>the unsigned versions which i mean they work the same thing you&#8217;re still going to do a comparison</p>



<p>it still works. Anyway, so after having shown you that and making sure that everything actually</p>



<p>did work, I think we&#8217;ve talked about everything that we need to for this video. So yeah, I hope</p>



<p>you feel like an expert practice this on your own, you know, write your own programs just to make</p>



<p>sure you know how to convert a higher level language block into an assembly block. And you</p>



<p>should be on your way. Thank you for watching this video. I hope you learned a little bit of</p>



<p>bit of stuff and had a little bit of fun tell your friends and 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 uh if you could do me a please</p>



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



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



<p>It would really mean the world to me and it&#8217;ll help make more videos and grow this community.</p>



<p>So we&#8217;ll be able to do more videos, longer videos, better videos, or just I&#8217;ll be able to keep making videos in general.</p>



<p>So please do me a kindness and subscribe.</p>



<p>You know, sometimes I&#8217;m sleeping in the middle of the night and I just wake up because I know somebody subscribed or followed.</p>



<p>It just wakes me up and I get filled with joy.</p>



<p>That&#8217;s exactly what happens every single time.</p>



<p>So you could do it as a nice favor to me or you could troll me if you want to just wake me up in the middle of the night.</p>



<p>just wake me up in the middle of the night just subscribe and then I&#8217;ll just wake up I promise</p>



<p>that&#8217;s what will happen also uh if you look at the middle of the screen right now you should see a</p>



<p>QR code which you can scan in order to go to the website which I think is also named somewhere at</p>



<p>the bottom of this video 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>for clarifications or errata or just future videos that you want to see please leave a comment or if</p>



<p>you just want to say hey what&#8217;s up what&#8217;s going on you know just send me a comment whatever I</p>



<p>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 thank you so</p>



<p>much for watching this video and enjoy the cool music as as I fade into the darkness which is</p>



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



<p>Thank you.</p>
<p>The post <a href="https://www.NeuralLantern.com/complex-if-elseif-else-in-x86-64-yasm-assembly-full-guide-with-code-examples/">Complex If-ElseIf-Else in x86-64 YASM Assembly &#8211; Full Guide with Code Examples</a> appeared first on <a href="https://www.NeuralLantern.com">NeuralLantern.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.NeuralLantern.com/complex-if-elseif-else-in-x86-64-yasm-assembly-full-guide-with-code-examples/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
