summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorCrystal <crystal@wizard.tower>2024-04-10 21:05:54 +0100
committerCrystal <crystal@wizard.tower>2024-04-10 21:05:54 +0100
commit7fdc20eb453ce242c11b65f6b5d4b78a23cb2d52 (patch)
tree3ea3b83afcc8bcb7effab7830b4b3c3d7e874d32
parentd034098994e0eb7a49b2a8fb23e8aa5e12b7c1b8 (diff)
downloadwww-7fdc20eb453ce242c11b65f6b5d4b78a23cb2d52.tar.gz
Me when the when me me
-rw-r--r--blog/asm/1.html154
-rw-r--r--src/org/blog/assembly/1.org15
2 files changed, 99 insertions, 70 deletions
diff --git a/blog/asm/1.html b/blog/asm/1.html
index 31491a2..4ed3574 100644
--- a/blog/asm/1.html
+++ b/blog/asm/1.html
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2024-03-23 Sat 15:57 -->
+<!-- 2024-04-10 Wed 21:05 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>x86 Assembly from my understanding</title>
@@ -23,9 +23,9 @@
 <p>
 Soooo this article (or maybe even a series of articles, who knows ?) will be about x86 assembly, or rather, what I understood from it and my road from the bottom-up hopefully reaching a good level of understanding
 </p>
-<div id="outline-container-org9e6b7e3" class="outline-2">
-<h2 id="org9e6b7e3">Memory :</h2>
-<div class="outline-text-2" id="text-org9e6b7e3">
+<div id="outline-container-orgd66d87f" class="outline-2">
+<h2 id="orgd66d87f">Memory :</h2>
+<div class="outline-text-2" id="text-orgd66d87f">
 <p>
 Memory is a sequence of octets (Aka 8bits) that each have a unique integer assigned to them called <b>The Effective Address (EA)</b>, in this particular CPU Architecture (the i8086), the octet is designated by a couple (A segment number, and the offset in the segment)
 </p>
@@ -40,9 +40,9 @@ Memory is a sequence of octets (Aka 8bits) that each have a unique integer assig
 The offset and segment are encoded in 16bits, so they take a value between 0 and 65535
 </p>
 </div>
-<div id="outline-container-orgb6ce3ec" class="outline-4">
-<h4 id="orgb6ce3ec">Important :</h4>
-<div class="outline-text-4" id="text-orgb6ce3ec">
+<div id="outline-container-orgb9ec69c" class="outline-4">
+<h4 id="orgb9ec69c">Important :</h4>
+<div class="outline-text-4" id="text-orgb9ec69c">
 <p>
 The relation between the Effective Address and the Segment &amp; Offset is as follow :
 </p>
@@ -52,8 +52,8 @@ The relation between the Effective Address and the Segment &amp; Offset is as fo
 </p>
 </div>
 <ul class="org-ul">
-<li><a id="org24f01a3"></a>Example :<br />
-<div class="outline-text-5" id="text-org24f01a3">
+<li><a id="org407193f"></a>Example :<br />
+<div class="outline-text-5" id="text-org407193f">
 <p>
 Let the Physical address (Or Effective Address, these two terms are interchangeable) <b>12345h</b> (the h refers to Hexadecimal, which can also be written like this <b>0x12345</b>), the register <b>DS = 1230h</b> and the register <b>SI = 0045h</b>, the CPU calculates the physical address by multiplying the content of the segment register <b>DS</b> by 10h (or 16) and adding the content of the register <b>SI</b>. so we get : <b>1230h x 10h + 45h = 12345h</b>
 </p>
@@ -66,16 +66,16 @@ Now if you are a clever one ( I know you are, since you are reading this &lt;3 )
 </li>
 </ul>
 </div>
-<div id="outline-container-org9256db9" class="outline-3">
-<h3 id="org9256db9">Registers</h3>
-<div class="outline-text-3" id="text-org9256db9">
+<div id="outline-container-orgb81ab14" class="outline-3">
+<h3 id="orgb81ab14">Registers</h3>
+<div class="outline-text-3" id="text-orgb81ab14">
 <p>
 The 8086 CPU has 14 registers of 16bits of size. From the POV of the user, the 8086 has 3 groups of 4 registers of 16bits. One state register of 9bits and a counting program of 16bits inaccessible to the user (whatever this means).
 </p>
 </div>
-<div id="outline-container-orgfc1a89c" class="outline-4">
-<h4 id="orgfc1a89c">General Registers</h4>
-<div class="outline-text-4" id="text-orgfc1a89c">
+<div id="outline-container-orgcd127f7" class="outline-4">
+<h4 id="orgcd127f7">General Registers</h4>
+<div class="outline-text-4" id="text-orgcd127f7">
 <p>
 General registers contribute to arithmetic&rsquo;s and logic and addressing too.
 </p>
@@ -126,28 +126,28 @@ Now here are the Registers we can find in this section:
 </div>
 </div>
 </div>
-<div id="outline-container-orge6b17b9" class="outline-3">
-<h3 id="orge6b17b9">Addressing and registers&#x2026;again</h3>
-<div class="outline-text-3" id="text-orge6b17b9">
+<div id="outline-container-orgde83b9e" class="outline-3">
+<h3 id="orgde83b9e">Addressing and registers&#x2026;again</h3>
+<div class="outline-text-3" id="text-orgde83b9e">
 </div>
-<div id="outline-container-orgd76cd4e" class="outline-4">
-<h4 id="orgd76cd4e">I realized what I wrote here before was almost gibberish, sooo here we go again I guess ?</h4>
-<div class="outline-text-4" id="text-orgd76cd4e">
+<div id="outline-container-org598f23b" class="outline-4">
+<h4 id="org598f23b">I realized what I wrote here before was almost gibberish, sooo here we go again I guess ?</h4>
+<div class="outline-text-4" id="text-org598f23b">
 <p>
 Well lets take a step back to the notion of effective addresses VS relative ones.
 </p>
 </div>
 </div>
-<div id="outline-container-org86b6da3" class="outline-4">
-<h4 id="org86b6da3">Effective = 10h x Segment + Offset . Part1</h4>
-<div class="outline-text-4" id="text-org86b6da3">
+<div id="outline-container-orga54d5c9" class="outline-4">
+<h4 id="orga54d5c9">Effective = 10h x Segment + Offset . Part1</h4>
+<div class="outline-text-4" id="text-orga54d5c9">
 <p>
 When trying to access a specific memory space, we use this annotation <b>[Segment:Offset]</b>, so for example, and assuming <b>DS = 0100h</b>. We want to write the value <b>0x0005</b> to the memory space defined by the physical address <b>1234h</b>, what do we do ?
 </p>
 </div>
 <ul class="org-ul">
-<li><a id="org63a0b4e"></a>Answer :<br />
-<div class="outline-text-5" id="text-org63a0b4e">
+<li><a id="org330429e"></a>Answer :<br />
+<div class="outline-text-5" id="text-org330429e">
 <div class="org-src-container">
 <pre class="src src-asm"><span style="color: #89b4fa;">MOV</span> [DS:0234h], 0x0005
 </pre>
@@ -159,7 +159,7 @@ Why ? Let&rsquo;s break it down :
 
 
 
-<div id="org9e1af4e" class="figure">
+<div id="orge9d2dab" class="figure">
 <p><img src="../../src/gifs/lain-dance.gif" alt="lain-dance.gif" />
 </p>
 </div>
@@ -177,9 +177,9 @@ Simple, right ?, now for another example
 </li>
 </ul>
 </div>
-<div id="outline-container-org704a2f5" class="outline-4">
-<h4 id="org704a2f5">Another example :</h4>
-<div class="outline-text-4" id="text-org704a2f5">
+<div id="outline-container-org21257b6" class="outline-4">
+<h4 id="org21257b6">Another example :</h4>
+<div class="outline-text-4" id="text-org21257b6">
 <p>
 What if we now have this instruction ?
 </p>
@@ -192,9 +192,9 @@ What does it do ? You might or might not be surprised that it does the exact sam
 </p>
 </div>
 </div>
-<div id="outline-container-org5f7abb9" class="outline-4">
-<h4 id="org5f7abb9">Segment + Register &lt;3</h4>
-<div class="outline-text-4" id="text-org5f7abb9">
+<div id="outline-container-org7c948b1" class="outline-4">
+<h4 id="org7c948b1">Segment + Register &lt;3</h4>
+<div class="outline-text-4" id="text-org7c948b1">
 <p>
 Consider <b>DS = 0100h</b> and <b>BX = BP = 0234h</b> and this code snippet:
 </p>
@@ -230,8 +230,8 @@ The General rule of thumb is as follows :
 </ul>
 </div>
 <ul class="org-ul">
-<li><a id="orgea3e106"></a>Note<br />
-<div class="outline-text-5" id="text-orgea3e106">
+<li><a id="orgec605fb"></a>Note<br />
+<div class="outline-text-5" id="text-orgec605fb">
 <p>
 The values of the registers CS DS and SS are automatically initialized by the OS when launching the program. So these segments are implicit. AKA : If we want to access a specific data in memory, we just need to specify its offset. Also you can&rsquo;t write directly into the DS or CS segment registers, so something like
 </p>
@@ -246,9 +246,9 @@ The values of the registers CS DS and SS are automatically initialized by the OS
 </div>
 </div>
 </div>
-<div id="outline-container-orgb12dbb3" class="outline-2">
-<h2 id="orgb12dbb3">The ACTUAL thing :</h2>
-<div class="outline-text-2" id="text-orgb12dbb3">
+<div id="outline-container-org30acf72" class="outline-2">
+<h2 id="org30acf72">The ACTUAL thing :</h2>
+<div class="outline-text-2" id="text-org30acf72">
 <p>
 Enough technical rambling, and now we shall go to the fun part, the ACTUAL CODE. But first, some names you should be familiar with :
 </p>
@@ -258,9 +258,9 @@ Enough technical rambling, and now we shall go to the fun part, the ACTUAL CODE.
 <li><b>Operands</b> : These are the options passed to the instructions, like <b>MOV dst, src</b>, and they can be anything from a memory location, to a variable to an immediate address.</li>
 </ul>
 </div>
-<div id="outline-container-org216dea5" class="outline-3">
-<h3 id="org216dea5">Structure of an assembly program :</h3>
-<div class="outline-text-3" id="text-org216dea5">
+<div id="outline-container-org03a7d0f" class="outline-3">
+<h3 id="org03a7d0f">Structure of an assembly program :</h3>
+<div class="outline-text-3" id="text-org03a7d0f">
 <p>
 While there is no &ldquo;standard&rdquo; structure, i prefer to go with this one :
 </p>
@@ -276,9 +276,9 @@ While there is no &ldquo;standard&rdquo; structure, i prefer to go with this one
 </div>
 </div>
 </div>
-<div id="outline-container-orgdf5852b" class="outline-3">
-<h3 id="orgdf5852b">MOV dst, src</h3>
-<div class="outline-text-3" id="text-orgdf5852b">
+<div id="outline-container-orgbea80df" class="outline-3">
+<h3 id="orgbea80df">MOV dst, src</h3>
+<div class="outline-text-3" id="text-orgbea80df">
 <p>
 The MOV instruction copies the Second operand (src) to the First operand (dst)&#x2026; The source can be a memory location, an immediate value, a general-purpose register (AX BX CX DX). As for the Destination, it can be a general-purpose register or a memory location.
 </p>
@@ -327,13 +327,13 @@ for segment registers only these types of MOV are supported:
 <b>memory</b>: [BX], [BX+SI+7], variable
 </p>
 </div>
-<div id="outline-container-orgef8aa84" class="outline-4">
-<h4 id="orgef8aa84">Note : The MOV instruction <b>cannot</b> be used to set the value of the CS and IP registers</h4>
+<div id="outline-container-orge229cf5" class="outline-4">
+<h4 id="orge229cf5">Note : The MOV instruction <b>cannot</b> be used to set the value of the CS and IP registers</h4>
 </div>
 </div>
-<div id="outline-container-org3486b9c" class="outline-3">
-<h3 id="org3486b9c">Variables :</h3>
-<div class="outline-text-3" id="text-org3486b9c">
+<div id="outline-container-org05f299b" class="outline-3">
+<h3 id="org05f299b">Variables :</h3>
+<div class="outline-text-3" id="text-org05f299b">
 <p>
 Let&rsquo;s say you want to use a specific value multiple times in your code, do you prefer to call it using something like <b>var1</b> or <b>E4F9:0011</b> ? If your answer is the second option, you can gladly skip this section, or even better, seek therapy.
 </p>
@@ -353,9 +353,9 @@ Anyways, we have two types of variables, <b>bytes</b> and <b>words(which are two
 <b>value</b> - can be any numeric value in any supported numbering system (hexadecimal, binary, or decimal), or &ldquo;?&rdquo; symbol for variables that are not initialized.
 </p>
 </div>
-<div id="outline-container-org89e3a28" class="outline-4">
-<h4 id="org89e3a28">Example code :</h4>
-<div class="outline-text-4" id="text-org89e3a28">
+<div id="outline-container-orga473d7b" class="outline-4">
+<h4 id="orga473d7b">Example code :</h4>
+<div class="outline-text-4" id="text-orga473d7b">
 <div class="org-src-container">
 <pre class="src src-asm">    <span style="color: #cba6f7;">org</span> 100h
     <span style="color: #cba6f7;">.data</span>
@@ -369,9 +369,9 @@ Anyways, we have two types of variables, <b>bytes</b> and <b>words(which are two
 </div>
 </div>
 </div>
-<div id="outline-container-org6f2214f" class="outline-4">
-<h4 id="org6f2214f">Arrays :</h4>
-<div class="outline-text-4" id="text-org6f2214f">
+<div id="outline-container-org8ceedbb" class="outline-4">
+<h4 id="org8ceedbb">Arrays :</h4>
+<div class="outline-text-4" id="text-org8ceedbb">
 <p>
 We can also define Arrays instead of single values using comma separated vaues. like this for example
 </p>
@@ -432,9 +432,9 @@ Of course, you can use DW instead of DB if it&rsquo;s required to keep values la
 </p>
 </div>
 </div>
-<div id="outline-container-org4f06cd3" class="outline-4">
-<h4 id="org4f06cd3">LEA</h4>
-<div class="outline-text-4" id="text-org4f06cd3">
+<div id="outline-container-org8fefb4b" class="outline-4">
+<h4 id="org8fefb4b">LEA</h4>
+<div class="outline-text-4" id="text-org8fefb4b">
 <p>
 LEA stands for (Load Effective Address) is an instruction used to get the offset of a specific variable. We will see later how its used, but first. here is something we will need :
 </p>
@@ -457,18 +457,18 @@ For example:
 assembler supports shorter prefixes as well:
 </p>
 
-<ol class="org-ol">
-<li>- for BYTE PTR</li>
-<li>- for WORD PTR</li>
-</ol>
+<ul class="org-ul">
+<li>b. - for BYTE PTR</li>
+<li>w. - for WORD PTR</li>
+</ul>
 
 <p>
 in certain cases the assembler can calculate the data type automatically.
 </p>
 </div>
 <ul class="org-ul">
-<li><a id="org008d51a"></a>Example :<br />
-<div class="outline-text-5" id="text-org008d51a">
+<li><a id="orgd644e48"></a>Example :<br />
+<div class="outline-text-5" id="text-orgd644e48">
 <div class="org-src-container">
 <pre class="src src-asm">    <span style="color: #cba6f7;">org</span> 100h
     <span style="color: #cba6f7;">.data</span>
@@ -489,9 +489,9 @@ in certain cases the assembler can calculate the data type automatically.
 </li>
 </ul>
 </div>
-<div id="outline-container-org788d7c2" class="outline-4">
-<h4 id="org788d7c2">Constants :</h4>
-<div class="outline-text-4" id="text-org788d7c2">
+<div id="outline-container-org99559c2" class="outline-4">
+<h4 id="org99559c2">Constants :</h4>
+<div class="outline-text-4" id="text-org99559c2">
 <p>
 Constants in Assembly only exist until the code is assembled, meaning that if you disassemble your code later, you wont see your constant definitions.
 </p>
@@ -510,11 +510,29 @@ Of course constants cant be changed, and aren&rsquo;t stored in memory. So they
 </div>
 </div>
 </div>
+<div id="outline-container-org9179f72" class="outline-3">
+<h3 id="org9179f72">⚐ :</h3>
+<div class="outline-text-3" id="text-org9179f72">
+<p>
+Now comes the notion of <b>Flags</b>, which are bits in the <b>Status register</b>, which are used for logical and arithmetical instructions and can take a value of 1 or 0 . Here are the 8 flags that exist for the 8086 CPU :
+</p>
+<ul class="org-ul">
+<li><b>Carry Flag(CF):</b> Set to 1 when there is an <b>unsigned overflow</b>, for example when you add 255 + 1( not in range [0,255] ). by default its set to 0.</li>
+<li><b>Overflow Flag(CF):</b> Set to 1 when there is a <b>signed overflow</b>, for example when you add 100 + 50( not in range [-128, 128[ ). by default its set to 0.</li>
+<li><b>Zero Flag(ZF):</b> Set to 1 when the result is 0. by default its set to 0.</li>
+<li><b>Auxiliary Flag(AF):</b> Set to 1 when there is an <b>unsigned overflow</b> for low nibble (4bits), or in human words : when there is a carry inside the number. for example when you add 29H + 4CH , 9 + C =&gt; 15. So we carry the 1 to 2 + 4 and AF is set to 1.</li>
+<li><b>Parity Flag(PF):</b> Set to 1 when the result has an even number of one bits. and 0 if it has an odd number of one bits. Even if a result is a word, only the Low 8bits are analyzed.</li>
+<li><b>Sign Flag(SF):</b> Self explanatory, set to 1 if the result is negative and 0 if its positive.</li>
+<li><b>Interrupt Enable Flag(IF):</b> When its set to 1, the CPU reacts to interrupts from external devices.</li>
+<li><b>Direction Flag(DF):</b> When this flag is set to 0, the processing is done forward, if its set to 1, its done backward.</li>
+</ul>
+</div>
+</div>
 </div>
 </div>
 <div id="postamble" class="status">
 <p class="author">Author: Crystal</p>
-<p class="date">Created: 2024-03-23 Sat 15:57</p>
+<p class="date">Created: 2024-04-10 Wed 21:05</p>
 </div>
 </body>
 </html>
diff --git a/src/org/blog/assembly/1.org b/src/org/blog/assembly/1.org
index 7a712e3..102a3c0 100644
--- a/src/org/blog/assembly/1.org
+++ b/src/org/blog/assembly/1.org
@@ -256,8 +256,8 @@ For example:
 *WORD PTR [BX]*     ; word access.
 assembler supports shorter prefixes as well:
 
-b. - for BYTE PTR
-w. - for WORD PTR
+- b. - for BYTE PTR
+- w. - for WORD PTR
 
 in certain cases the assembler can calculate the data type automatically.
 
@@ -286,3 +286,14 @@ Defining constants is pretty straight forward :
 #+END_SRC
 
 Of course constants cant be changed, and aren't stored in memory. So they are like little macros that live in your code.
+
+** ⚐ :
+Now comes the notion of *Flags*, which are bits in the *Status register*, which are used for logical and arithmetical instructions and can take a value of 1 or 0 . Here are the 8 flags that exist for the 8086 CPU :
+- *Carry Flag(CF):* Set to 1 when there is an *unsigned overflow*, for example when you add 255 + 1( not in range [0,255] ). by default its set to 0.
+- *Overflow Flag(CF):* Set to 1 when there is a *signed overflow*, for example when you add 100 + 50( not in range [-128, 128[ ). by default its set to 0.
+- *Zero Flag(ZF):* Set to 1 when the result is 0. by default its set to 0.
+- *Auxiliary Flag(AF):* Set to 1 when there is an *unsigned overflow* for low nibble (4bits), or in human words : when there is a carry inside the number. for example when you add 29H + 4CH , 9 + C => 15. So we carry the 1 to 2 + 4 and AF is set to 1.
+- *Parity Flag(PF):* Set to 1 when the result has an even number of one bits. and 0 if it has an odd number of one bits. Even if a result is a word, only the Low 8bits are analyzed.
+- *Sign Flag(SF):* Self explanatory, set to 1 if the result is negative and 0 if its positive.
+- *Interrupt Enable Flag(IF):* When its set to 1, the CPU reacts to interrupts from external devices.
+- *Direction Flag(DF):* When this flag is set to 0, the processing is done forward, if its set to 1, its done backward.