<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Martijn&#39;s blog</title>
    <link>https://martijnv.com/</link>
    <description>Recent content on Martijn&#39;s blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 13 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://martijnv.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How variable sized arrays work: non-fixed size data on the stack.</title>
      <link>https://martijnv.com/posts/variable_sized_on_stack/</link>
      <pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate>
      
      <guid>https://martijnv.com/posts/variable_sized_on_stack/</guid>
      
      <description>&lt;p&gt;Let&amp;rsquo;s first give some background on why I wanted to create this post.
Local variables are stored on the stack, these variables are usually fixed size, which makes addressing them very
easy. The &lt;code&gt;rbp&lt;/code&gt; register stores a pointer to an address on the stack, called the stack frame,
local variables are offset by some constant value relative to this stack frame.
You can see the stack frame as the current function context/ local variables.&lt;/p&gt;
&lt;!--&lt;style&gt;--&gt;
&lt;!--table tr th:empty {--&gt;
&lt;!--  display: none;--&gt;
&lt;!--}--&gt;
&lt;!--&lt;/style&gt;--&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;address&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;10&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rsp, growing stack pointer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;11&lt;/td&gt;
          &lt;td&gt;local_var3&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;12&lt;/td&gt;
          &lt;td&gt;local_var2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;13&lt;/td&gt;
          &lt;td&gt;local_var1&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;14&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rbp, the stack frame&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Note that the stack grows downwards, meaning the address of the top of the stack
decreases as variables are stored on the stack.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Addressing these local variables can be done using a single instruction, and thus
is very fast.
For example moving &lt;code&gt;local_var1&lt;/code&gt; and &lt;code&gt;local_var3&lt;/code&gt; into registers and adding them
can be done like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-NASM&#34; data-lang=&#34;NASM&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;r2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For addressing like this to work the variables on the stack need to be fixed size,
because the offsets relative to the stack frame are hard-coded at compile time.&lt;/p&gt;
&lt;h2 id=&#34;variable-sized-arrays-in-c&#34;&gt;Variable sized arrays in C&lt;/h2&gt;
&lt;p&gt;Having heard in some places that variables on the stack are actually exclusively fixed size,
I was left very confused after discovering variable sized arrays in C.
Variable sized arrays can be created like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates a local variable containing an array of size &lt;code&gt;n&lt;/code&gt;, stored on the stack.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Well how does this work? Wouldn&amp;rsquo;t this mess with the fixed offset of the local variables?
Indeed, treating it like any other fixed size local variable would not work.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;address&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;10&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rsp, growing stack pointer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;11&lt;/td&gt;
          &lt;td&gt;local_var2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;12&lt;/td&gt;
          &lt;td&gt;array_item1&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;13&lt;/td&gt;
          &lt;td&gt;array_item2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;14&lt;/td&gt;
          &lt;td&gt;array_item3&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;15&lt;/td&gt;
          &lt;td&gt;array_item4&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;16&lt;/td&gt;
          &lt;td&gt;local_var1&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;17&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rbp, the stack frame&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Note that arrays are addressed upward, so as the index increases
the memory address increases, so in the opposite direction to which the stack grows.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;How would we address &lt;code&gt;local_var2&lt;/code&gt; in this case?
Here we could simply do &lt;code&gt;rbp-6&lt;/code&gt;. However, this would stop working once
we create a different sized array.&lt;/p&gt;
&lt;p&gt;To solve this we can, for example, store the offset of the array in another local variable, and calculate the address using that offset.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;address&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;10&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rsp, growing stack pointer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;11&lt;/td&gt;
          &lt;td&gt;local_var2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;12&lt;/td&gt;
          &lt;td&gt;array_item1&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;13&lt;/td&gt;
          &lt;td&gt;array_item2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;14&lt;/td&gt;
          &lt;td&gt;array_item3&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;15&lt;/td&gt;
          &lt;td&gt;array_item4&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;16&lt;/td&gt;
          &lt;td&gt;local_var1&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;17&lt;/td&gt;
          &lt;td&gt;array_offset&lt;/td&gt;
          &lt;td&gt;(-6)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;18&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rbp, the stack frame&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If we now wanted to, for example, add &lt;code&gt;array_item1&lt;/code&gt; and &lt;code&gt;local_var2&lt;/code&gt; we could do it like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-NASM&#34; data-lang=&#34;NASM&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; move address of array_item1 into r1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; set r2 to array_item1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;r1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; subtract 1 from address of array_item 1, so address of local_var2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;sub&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; set r3 to local_var2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;r1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; add array_item1 and local_var2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;r2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;r3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;in-practice&#34;&gt;In practice&lt;/h2&gt;
&lt;p&gt;The above example is somewhat oversimplified, how it is actually done in practice
is a bit different.
So let&amp;rsquo;s have a look at how an actual compiler compiles this simple c program:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;arr: First: %d, Last: %d&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;arr2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;arr2: First: %d, Last: %d&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It was compiled using gcc on an x86_64 machine:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; gcc var.c -O0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The general strategy goes like this: the fixed size variables are located at the
start of the stack frame, along with an additional variable for each array storing
the starting position of the array.
The fixed size variables can still be addressed using a single instruction.
The variable sized arrays are then just put on top of that on the stack,
they can be addressed by using the additional variable.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s have a look at the what the array allocation compiles to.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We simply grow the stack by &lt;code&gt;size * 4&lt;/code&gt; as a single unsigned int is 4 bytes.
There is just some extra fancy arithmetic
to assure the stack pointer stays 16-byte aligned.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-NASM&#34; data-lang=&#34;NASM&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401157:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;lea&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rdx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; rdx = rax * 4 = size * 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40115&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;f:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x10&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; eax = 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401164:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;sub&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x1&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;;  rax = 16 - 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401168:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rdx&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;;  rax = size * 4 + 16 - 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40116&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;b:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;edi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x10&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; edi = 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401170:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x0&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;; edx = 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401175:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;div&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rdi&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; rax = rax / rdi = (size * 4 + 16 - 1) / 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401178:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;imul&lt;/span&gt;   &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x10&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; rax = rax * 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40117&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;c:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;sub&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rsp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; grow stack by previously calculated size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next we save the starting address of the array, which is on the newly allocated stack space.
Once again we have some fancy arithmetic here, this time it is simply rounding up
to the nearest 4 bytes, in order to make it 4 byte aligned.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-NASM&#34; data-lang=&#34;NASM&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40117&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;f:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rsp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401182:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x3&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; rax = rsp + 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401186:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;shr&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x2&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; shift right by two, equivalent to dividing by 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40118&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;a:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;shl&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x2&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; shift left by two, equivalent to dividing by 4 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40118&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;e:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;QWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x28&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; save address on the stack&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our stack now looks like this:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Address&lt;/th&gt;
          &lt;th&gt;Content&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x58&lt;/td&gt;
          &lt;td&gt;arr begin&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rsp&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x44&lt;/td&gt;
          &lt;td&gt;size&lt;/td&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x28&lt;/td&gt;
          &lt;td&gt;address of arr&lt;/td&gt;
          &lt;td&gt;rbp - 0x58&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rbp&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;With the memory for the list allocated now, assigning values to the array is quite trivial.
At the address &lt;code&gt;arr_begin + i * (size of int)&lt;/code&gt; the value is written.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-NASM&#34; data-lang=&#34;NASM&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; Loop initialization &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401192:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x0&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;; i = 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401199:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt;    &lt;span class=&#34;mi&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;ac&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x76&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;; jump to loop condition check (4011ac)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; Loop body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40119&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;b:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;QWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x28&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40119&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;f:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;a2:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;ecx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;a5:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rdx&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;ecx&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; [arr_begin + i * (size of int)] = arr[i] = i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;a8:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x1&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;; i++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; Loop condition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;ac:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;af:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;cmp&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x44&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;; i &amp;lt; size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;b2:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;jb&lt;/span&gt;     &lt;span class=&#34;mi&#34;&gt;40119&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x65&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;; jump to loop body if i &amp;lt; size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our stack now looks like this:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Address&lt;/th&gt;
          &lt;th&gt;Content&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x58&lt;/td&gt;
          &lt;td&gt;arr[0]&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rsp&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x54&lt;/td&gt;
          &lt;td&gt;arr[1]&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x50&lt;/td&gt;
          &lt;td&gt;arr[2]&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x44&lt;/td&gt;
          &lt;td&gt;size&lt;/td&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x28&lt;/td&gt;
          &lt;td&gt;address of arr&lt;/td&gt;
          &lt;td&gt;rbp - 0x58&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x14&lt;/td&gt;
          &lt;td&gt;i&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rbp&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The second allocation of the array works identically to the first one:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-NASM&#34; data-lang=&#34;NASM&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;e9:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;lea&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rdx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; rdx = rax * 4 = size * 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;f1:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x10&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; eax = 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;f6:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;sub&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x1&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;;  rax = 16 - 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;fa:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rdx&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;;  rax = size * 4 + 16 - 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;4011&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;fd:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;ecx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x10&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; ecx = 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401202:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x0&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;; edx = 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401207:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;div&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rcx&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; rax = rax / rcx = (size * 4 + 16 - 1) / 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40120&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;a:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;imul&lt;/span&gt;   &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x10&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;; rax = rax * 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40120&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;e:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;sub&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rsp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; grow stack by previously calculated size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401211:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rsp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401214:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x3&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; rax = rsp + 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401218:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;shr&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x2&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; shift right by two, equivalent to dividing by 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40121&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;c:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;shl&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x2&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; shift left by two, equivalent to dividing by 4 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401220:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;QWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x38&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; save address on the stack&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And the second for loop is also pretty much identical to the first one:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;arr2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-NASM&#34; data-lang=&#34;NASM&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; Loop initialization &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401224:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x18&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40122&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;b:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt;    &lt;span class=&#34;mi&#34;&gt;401241&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x10b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; Loop body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40122&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;d:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x18&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401230:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;lea&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;ecx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; ecx = i * 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401233:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;QWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x38&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401237:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x18&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40123&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;a:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rdx&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;ecx&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; [arr_begin + i * (size of int)] = arr[i] = i*2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;40123&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;d:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x18&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;; Loop condition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401241:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x18&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401244:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;cmp&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;DWORD&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PTR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rbp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x44&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;401247:&lt;/span&gt;	&lt;span class=&#34;nf&#34;&gt;jb&lt;/span&gt;     &lt;span class=&#34;mi&#34;&gt;40122&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0xf7&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the end the final stack looks like this:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Address&lt;/th&gt;
          &lt;th&gt;Content&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x68&lt;/td&gt;
          &lt;td&gt;arr2[0]&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rsp&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x64&lt;/td&gt;
          &lt;td&gt;arr2[1]&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x60&lt;/td&gt;
          &lt;td&gt;arr2[2]&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x58&lt;/td&gt;
          &lt;td&gt;arr[0]&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x54&lt;/td&gt;
          &lt;td&gt;arr[1]&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x50&lt;/td&gt;
          &lt;td&gt;arr[2]&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x44&lt;/td&gt;
          &lt;td&gt;size&lt;/td&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x38&lt;/td&gt;
          &lt;td&gt;address of arr2&lt;/td&gt;
          &lt;td&gt;rbp - 0x68&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x28&lt;/td&gt;
          &lt;td&gt;address of arr&lt;/td&gt;
          &lt;td&gt;rbp - 0x58&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x18&lt;/td&gt;
          &lt;td&gt;i (second loop)&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp - 0x14&lt;/td&gt;
          &lt;td&gt;i (first loop)&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbp&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lt;&amp;ndash; rbp&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;wrapping-up&#34;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;I hope this clarifies the concept of variable sized data on the stack.
I certainly really enjoyed looking at the disassembled code and figuring out how it works,
I learned a lot about assembly and compilers in the process.
If you have any questions feel leave a comment or sent me a dm on mastodon!&lt;/p&gt;
&lt;hr&gt;
&lt;!--## In practice--&gt;
&lt;!----&gt;
&lt;!--The above example is somewhat oversimplified, how it is actually done in practice--&gt;
&lt;!--is quite different.--&gt;
&lt;!--So lets have a look at how an actual compiler, compiles this simple c program:--&gt;
&lt;!--```C--&gt;
&lt;!--#include &lt;stdio.h&gt;--&gt;
&lt;!----&gt;
&lt;!--void function(unsigned size){--&gt;
&lt;!--    unsigned arr[size];--&gt;
&lt;!--    for(unsigned i = 0; i&lt;size; i++){--&gt;
&lt;!--        arr[i]=i;--&gt;
&lt;!--    }--&gt;
&lt;!--    printf(&#34;arr: First: %d, Last: %d\n&#34;, arr[0], arr[size-1]);--&gt;
&lt;!--    unsigned arr2[size];--&gt;
&lt;!--    for(unsigned i = 0; i&lt;size; i++){--&gt;
&lt;!--        arr2[i]=i*2;--&gt;
&lt;!--    }--&gt;
&lt;!--    printf(&#34;arr2: First: %d, Last: %d\n&#34;, arr2[0], arr2[size-1]);--&gt;
&lt;!--}--&gt;
&lt;!----&gt;
&lt;!--int main() {--&gt;
&lt;!--    function(3);--&gt;
&lt;!--    return 0;--&gt;
&lt;!--}--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--It was compiled using gcc:--&gt;
&lt;!--```bash--&gt;
&lt;!-- gcc var.c -O0--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--Lets look at each part of the c code bit by bit and what it compiles to.--&gt;
&lt;!----&gt;
&lt;!--First there is just some standard c calling convention stuff, like saving the--&gt;
&lt;!--previous stack frame etc.--&gt;
&lt;!--```C--&gt;
&lt;!--void function(unsigned size){--&gt;
&lt;!--```--&gt;
&lt;!--```NASM--&gt;
&lt;!--401136:	push   rbp ; save previous stackframe--&gt;
&lt;!--401137:	mov    rbp,rsp ; set new stackframe--&gt;
&lt;!--40113a:	push   rbx ; rbx is callee-saved (convention, not super important)--&gt;
&lt;!--40113b:	sub    rsp,0x48 ; make space for fixed size local variables on stack--&gt;
&lt;!--40113f:	mov    DWORD PTR [rbp-0x44],edi ; edi is the function argument, store it on the stack--&gt;
&lt;!--401142:	mov    rax,rsp--&gt;
&lt;!--401145:	mov    rbx,rax ; Previous stack pointer is saved in rbx--&gt;
&lt;!--```--&gt;
&lt;!--Our stack now looks like this:--&gt;
&lt;!--| Address | Content | |--&gt;
&lt;!--| - | - | - |--&gt;
&lt;!--| rbp - 0x48 | | &lt;-- rsp|--&gt;
&lt;!--| rbp - 0x44 | size | |--&gt;
&lt;!--| rbp | | &lt;-- rbp |--&gt;
&lt;!----&gt;
&lt;!--Next lets have a look at the what the array allocation compiles to.--&gt;
&lt;!--```C--&gt;
&lt;!--unsigned arr[size];--&gt;
&lt;!--```--&gt;
&lt;!--We are saving `size - 1` on the stack, this variable isn&#39;t actually used anywhere--&gt;
&lt;!--and would most likely be optimised away with compiler optimisations.--&gt;
&lt;!--```NASM--&gt;
&lt;!--401148: mov    eax,DWORD PTR [rbp-0x44] ; eax = size--&gt;
&lt;!--40114b: mov    edx,eax ; edx = eax = size--&gt;
&lt;!--40114d: sub    rdx,0x1 ; rdx = size - 1--&gt;
&lt;!--401151: mov    QWORD PTR [rbp-0x20],rdx ; save size - 1 in local var (rbp-0x20)--&gt;
&lt;!--401155: mov    eax,eax ; This just does nothing--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--Next we simply grow the stack by `size * 4` as a single unsigned int is 4 bytes.--&gt;
&lt;!--There is just some extra fancy arithmetic--&gt;
&lt;!--to assure the stack pointer stays 16-byte aligned.[^2]--&gt;
&lt;!--```NASM--&gt;
&lt;!--401157: lea    rdx,[rax*4+0x0] ; rdx = rax * 4 = size * 4--&gt;
&lt;!--40115f: mov    eax,0x10 ; eax = 16--&gt;
&lt;!--401164: sub    rax,0x1 ;  rax = 16 - 1--&gt;
&lt;!--401168: add    rax,rdx ;  rax = size * 4 + 16 - 1--&gt;
&lt;!--40116b: mov    edi,0x10 ; edi = 16--&gt;
&lt;!--401170: mov    edx,0x0  ; edx = 0--&gt;
&lt;!--401175: div    rdi ; rax = rax / rdi = (size * 4 + 16 - 1) / 16--&gt;
&lt;!--401178: imul   rax,rax,0x10 ; rax = rax * 16--&gt;
&lt;!--40117c: sub    rsp,rax ; grow stack by previously calculated size--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--Next we save the starting address of the array, which is on the newly allocated stack space.--&gt;
&lt;!--Once again we have same fancy arithmetic here, this time it simply rounding up--&gt;
&lt;!--to the nearest 4 bytes, in order to make it 4 byte aligned.--&gt;
&lt;!--```NASM--&gt;
&lt;!--40117f: mov    rax,rsp--&gt;
&lt;!--401182: add    rax,0x3 ; rax = rsp + 3--&gt;
&lt;!--401186: shr    rax,0x2 ; shift right by two, equivalent to dividing by 4--&gt;
&lt;!--40118a: shl    rax,0x2 ; shift left by two, equivalent to dividing by 4 --&gt;
&lt;!--40118e: mov    QWORD PTR [rbp-0x28],rax ; save address on the stack--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--Our stack now looks like this:--&gt;
&lt;!--| Address | Content | |--&gt;
&lt;!--| - | - | - |--&gt;
&lt;!--| rbp - 0x58 | arr begin | &lt;-- rsp|--&gt;
&lt;!--| rbp - 0x44 | size | |--&gt;
&lt;!--| rbp - 0x28 | address of arr | |--&gt;
&lt;!--| rbp | | &lt;-- rbp |--&gt;
&lt;!----&gt;
&lt;!--With the memory for the list allocated now, assigning values to the array is quite trivial.--&gt;
&lt;!--At the address arr_begin + i * (size of int) the value is written.--&gt;
&lt;!----&gt;
&lt;!--```C--&gt;
&lt;!--for(unsigned i = 0; i&lt;size; i++){--&gt;
&lt;!--    arr[i]=i;--&gt;
&lt;!--}--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--```NASM--&gt;
&lt;!--; Loop initialization --&gt;
&lt;!--401192:	mov    DWORD PTR [rbp-0x14],0x0   ; i = 0--&gt;
&lt;!--401199:	jmp    4011ac &lt;function+0x76&gt;     ; jump to loop condition check (4011ac)--&gt;
&lt;!--; Loop body--&gt;
&lt;!--40119b:	mov    rax,QWORD PTR [rbp-0x28]--&gt;
&lt;!--40119f:	mov    edx,DWORD PTR [rbp-0x14]--&gt;
&lt;!--4011a2:	mov    ecx,DWORD PTR [rbp-0x14]--&gt;
&lt;!--4011a5:	mov    DWORD PTR [rax+rdx*4],ecx ; [arr_begin + i * (size of int)] = arr[i] = i--&gt;
&lt;!--4011a8:	add    DWORD PTR [rbp-0x14],0x1  ; i++--&gt;
&lt;!--; Loop condition--&gt;
&lt;!--4011ac:	mov    eax,DWORD PTR [rbp-0x14]--&gt;
&lt;!--4011af:	cmp    eax,DWORD PTR [rbp-0x44]  ; i &lt; size--&gt;
&lt;!--4011b2:	jb     40119b &lt;function+0x65&gt;    ; jump to loop body if i &lt; size--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--Our stack now looks like this:--&gt;
&lt;!--| Address | Content | |--&gt;
&lt;!--| - | - | - |--&gt;
&lt;!--| rbp - 0x58 | arr[0] | &lt;-- rsp|--&gt;
&lt;!--| rbp - 0x54 | arr[1] | |--&gt;
&lt;!--| rbp - 0x50 | arr[2] | |--&gt;
&lt;!--| rbp - 0x44 | size | |--&gt;
&lt;!--| rbp - 0x28 | address of arr | |--&gt;
&lt;!--| rbp - 0x14 | i | |--&gt;
&lt;!--| rbp | | &lt;-- rbp |--&gt;
&lt;!----&gt;
&lt;!--First print statement--&gt;
&lt;!--```NASM--&gt;
&lt;!--4011b4:	mov    eax,DWORD PTR [rbp-0x44]  ; --&gt;
&lt;!--4011b7:	lea    edx,[rax-0x1]--&gt;
&lt;!--4011ba:	mov    rax,QWORD PTR [rbp-0x28]--&gt;
&lt;!--4011be:	mov    edx,edx--&gt;
&lt;!--4011c0:	mov    edx,DWORD PTR [rax+rdx*4]--&gt;
&lt;!--4011c3:	mov    rax,QWORD PTR [rbp-0x28]--&gt;
&lt;!--4011c7:	mov    eax,DWORD PTR [rax]--&gt;
&lt;!--4011c9:	mov    esi,eax--&gt;
&lt;!--4011cb:	mov    edi,0x402004--&gt;
&lt;!--4011d0:	mov    eax,0x0--&gt;
&lt;!--4011d5:	call   401030 &lt;printf@plt&gt;--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--Second allocation--&gt;
&lt;!--```NASM--&gt;
&lt;!--4011da:	mov    eax,DWORD PTR [rbp-0x44]--&gt;
&lt;!--4011dd:	mov    edx,eax--&gt;
&lt;!--4011df:	sub    rdx,0x1--&gt;
&lt;!--4011e3:	mov    QWORD PTR [rbp-0x30],rdx--&gt;
&lt;!--4011e7:	mov    eax,eax--&gt;
&lt;!--4011e9:	lea    rdx,[rax*4+0x0]--&gt;
&lt;!--4011f0:	--&gt;
&lt;!--4011f1:	mov    eax,0x10--&gt;
&lt;!--4011f6:	sub    rax,0x1--&gt;
&lt;!--4011fa:	add    rax,rdx--&gt;
&lt;!--4011fd:	mov    ecx,0x10--&gt;
&lt;!--401202:	mov    edx,0x0--&gt;
&lt;!--401207:	div    rcx--&gt;
&lt;!--40120a:	imul   rax,rax,0x10--&gt;
&lt;!--40120e:	sub    rsp,rax--&gt;
&lt;!--401211:	mov    rax,rsp--&gt;
&lt;!--401214:	add    rax,0x3--&gt;
&lt;!--401218:	shr    rax,0x2--&gt;
&lt;!--40121c:	shl    rax,0x2--&gt;
&lt;!--401220:	mov    QWORD PTR [rbp-0x38],rax--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--```NASM--&gt;
&lt;!--401224:	mov    DWORD PTR [rbp-0x18],0x0--&gt;
&lt;!--40122b:	jmp    401241 &lt;function+0x10b&gt;--&gt;
&lt;!--40122d:	mov    eax,DWORD PTR [rbp-0x18]--&gt;
&lt;!--401230:	lea    ecx,[rax+rax*1]--&gt;
&lt;!--401233:	mov    rax,QWORD PTR [rbp-0x38]--&gt;
&lt;!--401237:	mov    edx,DWORD PTR [rbp-0x18]--&gt;
&lt;!--40123a:	mov    DWORD PTR [rax+rdx*4],ecx--&gt;
&lt;!--40123d:	add    DWORD PTR [rbp-0x18],0x1--&gt;
&lt;!--401241:	mov    eax,DWORD PTR [rbp-0x18]--&gt;
&lt;!--401244:	cmp    eax,DWORD PTR [rbp-0x44]--&gt;
&lt;!--401247:	jb     40122d &lt;function+0xf7&gt;--&gt;
&lt;!--401249:	mov    eax,DWORD PTR [rbp-0x44]--&gt;
&lt;!--40124c:	lea    edx,[rax-0x1]--&gt;
&lt;!--40124f:	mov    rax,QWORD PTR [rbp-0x38]--&gt;
&lt;!--401253:	mov    edx,edx--&gt;
&lt;!--401255:	mov    edx,DWORD PTR [rax+rdx*4]--&gt;
&lt;!--401258:	mov    rax,QWORD PTR [rbp-0x38]--&gt;
&lt;!--40125c:	mov    eax,DWORD PTR [rax]--&gt;
&lt;!--40125e:	mov    esi,eax--&gt;
&lt;!--401260:	mov    edi,0x40201e--&gt;
&lt;!--401265:	mov    eax,0x0--&gt;
&lt;!--40126a:	call   401030 &lt;printf@plt&gt;--&gt;
&lt;!--```--&gt;
&lt;!----&gt;
&lt;!--```NASM--&gt;
&lt;!--40126f:	mov    rsp,rbx--&gt;
&lt;!--401272:	nop--&gt;
&lt;!--401273:	mov    rbx,QWORD PTR [rbp-0x8]--&gt;
&lt;!--401277:	leave--&gt;
&lt;!--401278:	ret--&gt;
&lt;!--```--&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Local variables being stored on the stack is technically an implementation detail, the c standard only calls of local variables (auto variables) to be freed once there out of scope. In practice this is always done using the stack.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;For more details on why it should be 16 byte aligned see the following stack overflow post: &lt;a href=&#34;https://stackoverflow.com/questions/49391001/why-does-the-x86-64-amd64-system-v-abi-mandate-a-16-byte-stack-alignment&#34;&gt;https://stackoverflow.com/questions/49391001/why-does-the-x86-64-amd64-system-v-abi-mandate-a-16-byte-stack-alignment&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
      
    </item>
    
    <item>
      <title>Hello Internet!</title>
      <link>https://martijnv.com/posts/hello-internet/</link>
      <pubDate>Fri, 15 Nov 2024 19:25:54 +0100</pubDate>
      
      <guid>https://martijnv.com/posts/hello-internet/</guid>
      
      <description>&lt;h1 id=&#34;hello-internet&#34;&gt;Hello internet!&lt;/h1&gt;
&lt;p&gt;This website was created using hugo. It is hosted on a nuc running on
nixos, it&amp;rsquo;s entirely declaritive! Have a look at the source code for the static
part of the site over here: &lt;a href=&#34;https://github.com/MartV0/personal-site&#34;&gt;https://github.com/MartV0/personal-site&lt;/a&gt;, and the nix source code here:
&lt;a href=&#34;https://github.com/MartV0/homelab/&#34;&gt;https://github.com/MartV0/homelab/&lt;/a&gt;.&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>My projects</title>
      <link>https://martijnv.com/projects/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://martijnv.com/projects/</guid>
      
      <description>&lt;p&gt;Here is a list of some of my projects!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/MartV0/compiler&#34;&gt;A compiler&lt;/a&gt;:&lt;/strong&gt; A very simple compiler
for a C-like language, from scratch. Didn&amp;rsquo;t use a linker or assembler, just rawdogging the elf bytes.
Still a work in progress, but I already learned a lot during this project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/MartV0/sssh/&#34;&gt;sssh&lt;/a&gt;:&lt;/strong&gt; A small ssh like client and server,
implemented in rust, featuring quantum safe encryption. Made for a university assignment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/MartV0/dotfiles/&#34;&gt;My dotfiles&lt;/a&gt;:&lt;/strong&gt; My personal dotfiles,
including configuration for neovim, niri, (doom)emacs and more!
They&amp;rsquo;re probably a bit to personalised to me to be used by someone else directly,
but could be useful to have a look for inspiration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/MartV0/homelab/&#34;&gt;My nixos config&lt;/a&gt;:&lt;/strong&gt; My personal nixos
config for both the server that serves this website, and my pc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/MartV0/personal-site&#34;&gt;This website&lt;/a&gt;:&lt;/strong&gt; My personal website!&lt;/li&gt;
&lt;/ul&gt;
</description>
      
    </item>
    
  </channel>
</rss>
