You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

453 lines
26 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> | tait.tech</title>
<link rel="stylesheet" href="/assets/css/style.css" id="main-css">
<link rel="stylesheet" href="/assets/css/transcription.css" id="trans-css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="/assets/js/"></script>
<link rel="stylesheet" href="/assets/css/katex.css" id="math-css">
</head>
<body>
<main>
<div id="wrapper">
<h1 id="cmpt-295">CMPT 295</h1>
<ul>
<li>Unit - Machine-Level Programming</li>
<li>Lecture 13 Assembly language Program Control cmovX</li>
<li>Iterative Statements Loops</li>
</ul>
<h2 id="last-lecture">Last Lecture</h2>
<ul>
<li>In C, we can change the execution flow of a program
<ol>
<li>Conditionaly
<ul>
<li>Conditional statements: if/else, switch</li>
<li>Iterative statements: loops</li>
</ul>
</li>
<li>Unconditionally
<ul>
<li>Functions calls</li>
</ul>
</li>
</ol>
</li>
<li>In x86-64 assembly, we can also change the execution flow of a program
<ul>
<li>cmp* instruction (compare)</li>
<li>jX insturction (jump)</li>
<li>call and ret instructions</li>
</ul>
</li>
</ul>
<h2 id="todays-menu">Todays Menu</h2>
<ul>
<li>Introduction
<ul>
<li>C program -&gt; assembly code -&gt; machine level code</li>
</ul>
</li>
<li>Assembly language basics: data, move operation
<ul>
<li>Memory addressing modes</li>
</ul>
</li>
<li>Operation leaq and Arithmetic &amp; logical operations</li>
<li>Conditional Statement Condition Code + cmovX</li>
<li>(highlighted) Loops</li>
<li>Function call Stack</li>
<li>Array</li>
<li>Buffer Overflow</li>
<li>Floating-point operations</li>
</ul>
<h2 id="homework-int-maxint-x-int-y">Homework: <code class="language-plaintext highlighter-rouge">int max(int x, int y)</code></h2>
<p>In C:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int max(int x,int y){
int result = x;
if(y&gt;x)
result=y;
return result;
}
</code></pre></div></div>
<p>version 1 with jX instruction</p>
<p>In Assembly: # x in %edi, y in %esi, result in %eax</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>max:
movl %edi,%eax #result=x
cmpl %edi,%esi #if y&lt;=x then
jle endif #return
movl %esi,%eax #result=y
endif:
ret
</code></pre></div></div>
<p>We branch (jump) when the condition (y &gt; x) is false, i.e., when (y &lt;= x)
-&gt; This technique is called “coding the false condition first”
or ”taking care of …”</p>
<h2 id="conditional-move-instruction-cmovx">Conditional move instruction cmovX</h2>
<p>What C code looks like when using conditional operator:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>result=test?val2:val1;
return result;
</code></pre></div></div>
<p>What logic of assembly
code looks like when using
cmovX (expressed in C):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>result=val1;
if (test) result = val2;
return result;
</code></pre></div></div>
<p>Example: <code class="language-plaintext highlighter-rouge">cmovle Src,Dest</code></p>
<p>Alternative: <code class="language-plaintext highlighter-rouge">int abs(int x)</code></p>
<p>In C:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int abs(int x){
if(x&lt;0)
x=-x;
return x;
}
</code></pre></div></div>
<p>in assembly: # <code class="language-plaintext highlighter-rouge">x</code> in <code class="language-plaintext highlighter-rouge">%edi</code>, <code class="language-plaintext highlighter-rouge">result</code> in <code class="language-plaintext highlighter-rouge">%eax</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>abs:
movl %edi,%eax # result = x
negl %edi # x = -x
cmpl $0,%eax # if x &lt; 0 then
cmovl %edi,%eax # result = -x
ret
</code></pre></div></div>
<h2 id="advantage-of-conditional-move-cmovx">Advantage of conditional move cmovX</h2>
<p>Note about branching:</p>
<ul>
<li>Branches are very disruptive to instruction flow through
microprocessor CPU pipelines</li>
<li>However, since conditional moves (cmovX) do not
require control transfer (no branching/jumping required),
they are less disruptive</li>
<li>So, <code class="language-plaintext highlighter-rouge">gcc</code> tries to use them, but only when safe</li>
</ul>
<h2 id="what-do-we-mean-by-safe">What do we mean by “safe”?</h2>
<ul>
<li>In <code class="language-plaintext highlighter-rouge">result = test ? aVal : anotherVal;</code> both values
(<code class="language-plaintext highlighter-rouge">aVal</code> and <code class="language-plaintext highlighter-rouge">anotherVal</code>) are computed so their
computation must be “safe”</li>
<li>Example of unsafe computations:
<ol>
<li>Expensive computations <code class="language-plaintext highlighter-rouge">val = Test(x) ? Hard1(x) : Hard2(x);</code>
<ul>
<li>Only makes sense when computations are very simple</li>
</ul>
</li>
<li>Risky computations <code class="language-plaintext highlighter-rouge">val = p ? *p : 0;</code>
<ul>
<li>Only makes sense when computations do not crash the application</li>
</ul>
</li>
<li>Computations with side effects <code class="language-plaintext highlighter-rouge">val = x &gt; 0 ? x*=7 : x+=3;</code>
<ul>
<li>Only makes sense when computations do not have side effects</li>
</ul>
</li>
</ol>
</li>
</ul>
<h2 id="homework-example-alternate-int-maxint-x-int-y">Homework: Example: alternate <code class="language-plaintext highlighter-rouge">int max(int x, int y)</code></h2>
<p>version 2 with cmovX instruction</p>
<p>In C:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int max(int x, int y){
int result = x;
if(y&gt;x)
result = y;
return result;
}
</code></pre></div></div>
<p>In Assembly: # x in %edi, y in %esi, result in %eax</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>max:
movl %edi,%eax #result=x
cmpl %edi,%esi #if y&gt;x then
cmovg %esi,%eax #result=y
ret
</code></pre></div></div>
<h2 id="while-loop--coding-the-false-condition-first-updated">While loop “coding the false condition first” (updated)</h2>
<p><code class="language-plaintext highlighter-rouge">int x</code> and <code class="language-plaintext highlighter-rouge">int y</code> are arguments to function</p>
<p>in C:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>while(x&lt;y){
//stmts
}
return;
</code></pre></div></div>
<p>Steps:</p>
<ol>
<li>Analyze the condition: <code class="language-plaintext highlighter-rouge">x&lt;y</code></li>
<li>write <code class="language-plaintext highlighter-rouge">cmpl %esi,%edi</code></li>
<li>List all outcomes:
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo></mo><mi>y</mi><mo>&gt;</mo><mn>0</mn><mtext></mtext><mo></mo><mtext></mtext><mi>x</mi><mo>&gt;</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x-y &gt; 0 \implies x&gt;y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin"></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66844em;vertical-align:-0.024em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>: exits loop</li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo></mo><mi>y</mi><mo>&lt;</mo><mn>0</mn><mtext></mtext><mo></mo><mtext></mtext><mi>x</mi><mo>&lt;</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x-y &lt; 0 \implies x&lt; y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin"></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66844em;vertical-align:-0.024em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>: loops</li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo></mo><mi>y</mi><mo>=</mo><mn>0</mn><mtext></mtext><mo></mo><mtext></mtext><mi>x</mi><mo>=</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x-y = 0 \implies x=y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin"></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66844em;vertical-align:-0.024em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>: exits loop</li>
</ul>
</li>
<li>Which outcomes “exit loop”?</li>
<li>Write for false condition i.e. g &amp; e (<code class="language-plaintext highlighter-rouge">jge</code>)</li>
</ol>
<p>in assembly:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>loop: # x in %edi, y in %esi
cmpl %esi,%edi # cmpl y,x
jge endloop
#stmts in loop
jmp loop
endloop:
ret
</code></pre></div></div>
<p>Loop Pattern 1</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>loop:
if cond false
goto done:
stmts
goto loop:
done:
</code></pre></div></div>
<h2 id="while-loop--jump-to-middle-updated">While loop “jump-to-middle” (updated)</h2>
<p><code class="language-plaintext highlighter-rouge">int x</code> and <code class="language-plaintext highlighter-rouge">int y</code> are arguments to function</p>
<p>in C:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>while(x&lt;y){ //step 1
//stmts
}
return;
</code></pre></div></div>
<p>Steps:</p>
<ol>
<li>(shown in C code)</li>
<li>(shwon in assembly)</li>
<li>All possible values
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo></mo><mi>y</mi><mo>&gt;</mo><mn>0</mn><mtext></mtext><mo></mo><mtext></mtext><mi>x</mi><mo>&gt;</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x-y &gt;0 \implies x&gt;y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin"></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66844em;vertical-align:-0.024em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>: exits loop, g</li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo></mo><mi>y</mi><mo>&lt;</mo><mn>0</mn><mtext></mtext><mo></mo><mtext></mtext><mi>x</mi><mo>&lt;</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x-y &lt; 0 \implies x&lt; y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin"></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66844em;vertical-align:-0.024em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>: loops, l</li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo></mo><mi>y</mi><mo>=</mo><mn>0</mn><mtext></mtext><mo></mo><mtext></mtext><mi>x</mi><mo>=</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x-y = 0 \implies x=y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin"></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66844em;vertical-align:-0.024em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>: exits loops, e</li>
</ul>
</li>
<li>Consider outcome ???(cant read) “loops”</li>
</ol>
<p>in assembly:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> jmp test
loop:
# stmts
test:
cmpl %esi,%edi #cmpl y,x (step 2)
jl loop (step 5)
ret
</code></pre></div></div>
<p>Loop Pattern 2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> goto test:
loop:
# stmts
test:
if cond true
goto loop:
done:
</code></pre></div></div>
<h2 id="do-while-loop--jump-to-middle-updated">Do While loop “jump-to-middle” (updated)</h2>
<p><code class="language-plaintext highlighter-rouge">int x</code> and <code class="language-plaintext highlighter-rouge">int y</code> are arguments to function</p>
<p>in C:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>do{
stmts
} while(x&lt;y);
return;
</code></pre></div></div>
<p>in assembly:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>loop:
#stmts
test:
jmpl %esi,%edi
jl loop
ret
</code></pre></div></div>
<p>Loop Pattern 2:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(deleted) goto test:
loop:
stmts
test:
if cond true
goto loop:
done:
</code></pre></div></div>
<h2 id="for-loop-updated">For loop (updated)</h2>
<p>In C:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>//format: for(initialization; condition testing; increment)
for(int i=0;i&lt;n;++i){
//stmts
}
return;
</code></pre></div></div>
<p>Becomes:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>i=0; // initialization
while(i&lt;n){// condition testing
//stmts
i++; //increment
}
return;
</code></pre></div></div>
<p>Questions:</p>
<ol>
<li>Here are we coding the false condition first?</li>
<li>Which loop patterns are we using?</li>
</ol>
<p>Which becomes, in Assembly:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> xorl %ecx, %ecx # initialization
loop: # %ecx (i) &lt;- 0
cmpl %edi, %ecx # while i &lt; n true (testing)
jge endloop # jump when i&gt;=n (false condition); In this situation "je" would also work. Do you see why?
#stmts
incl %ecx # i++ increment
jmp loop # loop again
endloop:
ret
</code></pre></div></div>
<h2 id="summary">Summary</h2>
<p>Compiler can produce different instruction combinations when assembling the same C code.</p>
<p><code class="language-plaintext highlighter-rouge">cmp*</code> and <code class="language-plaintext highlighter-rouge">test*</code> instructions set condition codes</p>
<ul>
<li>In x86-64 assembly, there are no conditional statements, however,
we can alter the execution flow of a program by using …
<ul>
<li><code class="language-plaintext highlighter-rouge">cmp*</code> instruction (compare)</li>
<li><code class="language-plaintext highlighter-rouge">jX</code> instructions (jump)</li>
<li><code class="language-plaintext highlighter-rouge">call</code> and ret instructions</li>
<li><code class="language-plaintext highlighter-rouge">cmovX</code> instructions -&gt; conditional move</li>
</ul>
</li>
<li>In x86-64 assembly, there are no iterative statements, however, we
can alter the execution flow of a program by using …
<ul>
<li><code class="language-plaintext highlighter-rouge">cmp*</code> instruction</li>
<li><code class="language-plaintext highlighter-rouge">jX</code> instructions (jump)</li>
</ul>
</li>
<li>CPU uses these condition codes to decide whether a …
<ul>
<li><code class="language-plaintext highlighter-rouge">jX</code> instruction (conditional jump) is to be exectued or a</li>
<li><code class="language-plaintext highlighter-rouge">cmovX</code> instruction (conditional move) is to be exectued</li>
</ul>
</li>
<li>2 loop patterns:
<ul>
<li>“coding the false condition first” -&gt; <code class="language-plaintext highlighter-rouge">while</code> loops (hence <code class="language-plaintext highlighter-rouge">for</code> loops)</li>
<li>“jump-in-middle” -&gt; <code class="language-plaintext highlighter-rouge">while</code>, <code class="language-plaintext highlighter-rouge">do-while</code> (hence for loops)</li>
</ul>
</li>
</ul>
<h2 id="next-lecture">Next Lecture</h2>
<ul>
<li>Introduction
<ul>
<li>C program -&gt; assembly code -&gt; machine level code</li>
</ul>
</li>
<li>Assembly language basics: data, move operation
<ul>
<li>Memory addressing modes</li>
</ul>
</li>
<li>Operation leaq and Arithmetic &amp; logical operations</li>
<li>Conditional Statement Condition Code + cmovX</li>
<li>Loops</li>
<li>(highlighted) Function call Stack
<ul>
<li>(highlighted) Overview of Function Call</li>
<li>(highlighted) Memory Layout and Stack - x86-64 instructions and registers</li>
<li>(highlighted) Passing control</li>
<li>Passing data Calling Conventions</li>
<li>Managing local data</li>
</ul>
</li>
<li>Array</li>
<li>Buffer Overflow</li>
<li>Floating-point operations</li>
</ul>
</div>
</main>
<hr>
<footer>
</footer>
</body>
</html>