<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Superschurke</title>
	<atom:link href="http://superschurke.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://superschurke.wordpress.com</link>
	<description>Fiese Pläne und OS-Development</description>
	<lastBuildDate>Wed, 19 Jul 2006 18:27:31 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='superschurke.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/2843a51f5d295c4b2f25c420fb44e636?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Superschurke</title>
		<link>http://superschurke.wordpress.com</link>
	</image>
			<item>
		<title>Mit NASM FAT12 Images erstellen</title>
		<link>http://superschurke.wordpress.com/2006/06/09/mit-nasm-fat12-images-erstellen/</link>
		<comments>http://superschurke.wordpress.com/2006/06/09/mit-nasm-fat12-images-erstellen/#comments</comments>
		<pubDate>Fri, 09 Jun 2006 13:34:19 +0000</pubDate>
		<dc:creator>superschurke</dc:creator>
				<category><![CDATA[Assembler]]></category>
		<category><![CDATA[Experimente]]></category>
		<category><![CDATA[FAT12]]></category>
		<category><![CDATA[Hax]]></category>
		<category><![CDATA[NASM]]></category>

		<guid isPermaLink="false">https://superschurke.wordpress.com/2006/06/09/mit-nasm-fat12-images-erstellen/</guid>
		<description><![CDATA[Gestern und heute habe ich an einer Makrosammlung f&#252;r NASM gebastelt, die es erm&#246;glicht ohne die Zuhilfenahme weiterer Tools ein FAT12 Image zu erstellen. Zu benutzen ist das in etwa so:
%include &#34;fat12.inc&#34;
; Die Standardeinstellung erzeugt ein Image f&#252;r 1,44MB Disketten. Mehr Tuning gibt es in fat12.inc.
fat_start
; erzeugt eine Datei namens README.TXT
 fat_file &#34;readme.txt&#34;, &#34;README  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=superschurke.wordpress.com&blog=249214&post=5&subd=superschurke&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Gestern und heute habe ich an einer Makrosammlung f&uuml;r NASM gebastelt, die es erm&ouml;glicht ohne die Zuhilfenahme weiterer Tools ein FAT12 Image zu erstellen. Zu benutzen ist das in etwa so:</p>
<p><code>%include &quot;fat12.inc&quot;</code></p>
<p>; Die Standardeinstellung erzeugt ein Image f&uuml;r 1,44MB Disketten. Mehr Tuning gibt es in fat12.inc.<br />
fat_start</p>
<p>; erzeugt eine Datei namens README.TXT<br />
<code> fat_file &quot;readme.txt&quot;, &quot;README  TXT&quot;<br />
</code><code>; erzeugt eine Datei namens README.TXT<br />
</code><code></code><code>fat_file &quot;wasauchimmer.txt&quot;, &quot;BLUBB   TXT&quot;<br />
</code><code>; erzeugt eine Datei namens MEINFOTO.JPG<br />
</code><code> fat_file &quot;Urlaub 2006 - Strand.jpg&quot;, &quot;MEINFOTOJPG&quot;<br />
fat_end</code></p>
<p>Das ganze kann man dann einfach mit nasm -o disk.img -f bin diskimage.asm assemblieren.</p>
<p>fat_start beginnt ein Diskettenimage. Es hat einen Optionalen Parameter, der die Anzahl der reservierten Sektoren angibt. Wenn kein Parameter angegeben wird, wird ein Bootloader mit passendem Bootpartitionblock erstellt. Wenn dort ein Parameter angegeben wird, muss der Bootpartitionblock selbst gebastelt werden. Als Vorlage kann dazu das Makro default_boot_sector in fat12.inc dienen.</p>
<p>fat_file f&uuml;gt eine Datei in das Image ein. Der erste Parameter ist der Pfad zu der Datei, die eingef&uuml;gt werden soll. Der zweite Parameter gibt den Namen der Datei auf dem Image an. Dieser Name muss ein 8.3-Name sein. Das heisst die ersten 8 Zeichen sind der Teil vor dem Punkt, die letzten 3 Zeichen sind die Erweiterung. Der Name muss immer 11 Zeichen lang sein, und nicht genutzte Bytes m&uuml;ssen mit Leerzeichen gef&uuml;llt werden. Hier gibt es keine &Uuml;berpr&uuml;fung auf fehlerhafte Eingaben. Mehr zu den Dateinamen gibt es auch in der <a href="http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx" title="FAT Spezifikation">FAT Spezifikation</a>. Bei den Dateigr&ouml;&szlig;en muss darauf geachtet werden, dass diese Dateien auf die Diskette passen. Es gibt auch hier keine Fehler&uuml;berpr&uuml;fung.</p>
<p>fat_end muss ganz zum Schluss aufgerufen werden, damit das Diskimage und die einzelnen Sektionen bis zum Ende aufgef&uuml;llt werden.</p>
<p>Noch ein Hinweis zum Code: Da eine FAT-Formatierte Diskette/Partition in 3 Teile aufgeteilt ist (root-Directory, FAT, und Datenteil) musste ich einige Tricks anwenden, weil die Anordnung wie die Teile definiert werden, anders ist, als die Ordnung auf der Diskette. So schreibe ich zuerst die Datei in die Datensektion, damit ich die Gr&ouml;&szlig;e feststellen kann, und erstelle erst dann den Eintrag in der FAT, die auf dem Image allerdings davor liegt. Damit dies gelingt, nutze ich die <a href="http://nasm.sourceforge.net/doc/html/nasmdoc6.html#section-6.1.3" title="NASM Manual">Multisection-Unterst&uuml;tzung im bin-Format</a>. Das Makro fat_start, sieht vereinfacht so aus:</p>
<p><code>%macro fat_start 0<br />
section .root_dir<br />
section .fat<br />
section .file_data<br />
%endmacro</code></p>
<p>Damit lege ich die Reihenfolge der Sektionen fest und nun kann ich im weiteren Code in beliebiger Reihenfolge in die Sektionen schreiben, ohne diese Anordnung wieder zu verlieren. Diese Sammlung von Makros ist eine sehr ungetestete Alpha-Version. Zum Beispiel waren bis vor wenigen Minuten Dateien deren Gr&ouml;&szlig;e modulo 1024 kleiner als 512 ist nicht unterst&uuml;tzt. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
<p>Den Download gibt es unter Auf meiner Todolist stehen unter anderem:</p>
<ul>
<li>Viele Zahlen, die noch &quot;hardwired&quot; sind, m&uuml;ssen in Makros verpackt werden.</li>
<li>Lange Dateinamen</li>
<li>FAT16</li>
<li>Verzeichnisse</li>
<li>Fehler&uuml;berpr&uuml;fung</li>
</ul>
<p>Vielleicht gibt es demn&auml;chst ja ein Update von mir. Wenn jemand anders damit erfolgreich rumexperimentiert und mit dem den Makros irgendwas spektakul&auml;res anstellt, w&uuml;rde ich mich freuen davon zu h&ouml;ren. Verbesserungsvorschl&auml;ge und Bugreports sind auch willkommen. Und wenn es einfach nur funktioniert, freue ich mich noch mehr &uuml;ber Kommentare. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Den Code gibt es unter<span id="more-5"></span></p>
<pre><font face="Times New Roman"> <font face="Courier New"><font size="2"><font color="#000000"><font face="Courier New"><font size="2"><i><font color="#808080">; Makros f&uuml;r die Erstellung von FAT12-Disketten Images</font></i></font></font>
<font face="Courier New"><font size="2"><i><font color="#808080">; mehr: http://superschurke.wordpress.com/?p=5</font></i></font></font>
<font face="Courier New"><font size="2"><i><font color="#808080">; Public Domain</font></i></font></font>
<font face="Courier New"><font size="2"><i><font color="#808080">; Keine Garantie f&uuml;r irgendwas.</font></i></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%define DISK_SIZE (</font></font></font><font color="#008000">1440</font><font color="#000000">*</font><font color="#008000">1024</font><font color="#000000">)</font>
<font face="Courier New"><font size="2"><font color="#000000">%define BYTES_PER_SECTOR </font></font></font><font color="#008000">512</font>
<font face="Courier New"><font size="2"><font color="#000000">%define SECTORS_PER_CLUSTER </font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">%define CLUSTER_SIZE (SECTORS_PER_CLUSTER*BYTES_PER_SECTOR) </font></font></font><i><font color="#808080">; in bytes</font></i>
<font face="Courier New"><font size="2"><font color="#000000">%define ROOT_ENT_CNT </font></font></font><font color="#008000">224</font>
<font face="Courier New"><font size="2"><font color="#000000">%define FAT_SIZE </font></font></font><font color="#008000">9</font><font color="#000000"> </font><i><font color="#808080">; in sectors</font></i>
<font face="Courier New"><font size="2"><font color="#000000">%define NUM_FATS </font></font></font><font color="#008000">2

</font><font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> char </font><font color="#008000">1</font><font color="#000000">-</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><font color="#008000">1</font><font color="#000000">:</font>
<font face="Courier New"><font size="2"><font color="#000000">    %if %</font></font></font><font color="#008000">0</font><font color="#000000">==</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">        resb %</font></font></font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">    %else</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        resb </font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %endif</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%endmacro
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> shortint </font><font color="#008000">1</font><font color="#000000">-</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><font color="#008000">1</font><font color="#000000">:</font>
<font face="Courier New"><font size="2"><font color="#000000">    %if %</font></font></font><font color="#008000">0</font><font color="#000000">==</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">        resw %</font></font></font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">    %else</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        resw </font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %endif</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%endmacro
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> long </font><font color="#008000">1</font><font color="#000000">-</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><font color="#008000">1</font><font color="#000000">:</font>
<font face="Courier New"><font size="2"><font color="#000000">    %if %</font></font></font><font color="#008000">0</font><font color="#000000">==</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">        resd %</font></font></font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">    %else</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        resd </font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %endif</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%endmacro
</font></font></font>
<font face="Courier New"><font size="2"><b><font color="#000080">struc</font></b></font></font><font color="#000000"> bpb_s</font>
<font face="Courier New"><font size="2"><font color="#000000">    char jmpBoot, </font></font></font><font color="#008000">3</font>
<font face="Courier New"><font size="2"><font color="#000000">    char OEMName, </font></font></font><font color="#008000">8</font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint BytsPerSec</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char SecPerClus</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint RsvdSecCnt</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char NumFATs</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint RootEntCnt</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint TotSec16</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char Media</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint FatSz16</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint SecPerTrk</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint NumHeads</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    long HiddSec</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    long TotSec32</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char DrvNum</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char Reserved1</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char BootSig</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    long VolID</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char VolLab, </font></font></font><font color="#008000">11</font>
<font face="Courier New"><font size="2"><font color="#000000">    char FilSysType, </font></font></font><font color="#008000">8</font>
<font face="Courier New"><font size="2"><font color="#000000">endstruc
</font></font></font>
<font face="Courier New"><font size="2"><b><font color="#000080">struc</font></b></font></font><font color="#000000"> file_dir_entry_s</font>
<font face="Courier New"><font size="2"><font color="#000000">    char </font></font></font><b><font color="#000080">Name</font></b><font color="#000000">, </font><font color="#008000">11</font>
<font face="Courier New"><font size="2"><font color="#000000">    char Attr</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char NTRes</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    char CrtTimeTenth</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint CrtTime</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint CrtDate</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint LstAccDate</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint FstClusHI</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint WrtTime</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint WrtDate</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    shortint FstClusLO</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    long FileSize</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">endstruc

</font></font></font><font face="Courier New"><font size="2"><font color="#000000">%define ATTR_READ_ONLY </font></font></font><font color="#008000">0</font><font color="#000000">x01</font>
<font face="Courier New"><font size="2"><font color="#000000">%define ATTR_HIDDEN </font></font></font><font color="#008000">0</font><font color="#000000">x02</font>
<font face="Courier New"><font size="2"><font color="#000000">%define ATTR_SYSTEM </font></font></font><font color="#008000">0</font><font color="#000000">x04</font>
<font face="Courier New"><font size="2"><font color="#000000">%define ATTR_VOLUME_ID </font></font></font><font color="#008000">0</font><font color="#000000">x08</font>
<font face="Courier New"><font size="2"><font color="#000000">%define ATTR_DIRECTORY </font></font></font><font color="#008000">0</font><font color="#000000">x10</font>
<font face="Courier New"><font size="2"><font color="#000000">%define ATTR_ARCHIVE </font></font></font><font color="#008000">0</font><font color="#000000">x20</font>
<font face="Courier New"><font size="2"><font color="#000000">%define ATTR_LONG_NAME (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID)
</font></font></font>
<font face="Courier New"><font size="2"><i><font color="#808080">; usage: make_date year, month, day</font></i></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> make_date </font><font color="#008000">3</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> (%</font><font color="#008000">3</font><font color="#000000"> &amp; </font><font color="#008000">0</font><font color="#000000">x1f) | ((%</font><font color="#008000">2</font><font color="#000000"> &amp; </font><font color="#008000">0</font><font color="#000000">xf) &lt;&lt; </font><font color="#008000">5</font><font color="#000000">) | (((%</font><font color="#008000">1</font><font color="#000000"> - </font><font color="#008000">1980</font><font color="#000000">) &amp; </font><font color="#008000">0</font><font color="#000000">x7f) &lt;&lt; </font><font color="#008000">9</font><font color="#000000">)</font>
<font face="Courier New"><font size="2"><font color="#000000">%endmacro
</font></font></font>
<font face="Courier New"><font size="2"><i><font color="#808080">; usage: make_time hour, minute, second</font></i></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> make_time </font><font color="#008000">3</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> ((%</font><font color="#008000">3</font><font color="#000000"> &gt;&gt; </font><font color="#008000">1</font><font color="#000000">) &amp; </font><font color="#008000">0</font><font color="#000000">x1f) | ((%</font><font color="#008000">2</font><font color="#000000"> &amp; </font><font color="#008000">0</font><font color="#000000">x3f) &lt;&lt; </font><font color="#008000">5</font><font color="#000000">) | ((%</font><font color="#008000">3</font><font color="#000000"> &amp; </font><font color="#008000">0</font><font color="#000000">x1f) &lt;&lt; </font><font color="#008000">11</font><font color="#000000">)</font>
<font face="Courier New"><font size="2"><font color="#000000">%endmacro

</font></font></font><font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> default_boot_sector </font><font color="#008000">0

</font><font face="Courier New"><font size="2"><font color="#000000">istruc bpb_s</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    at jmpBoot, </font></font></font><b><font color="#0000ff">jmp</font></b><font color="#000000"> </font><b><font color="#000080">short</font></b><font color="#000000"> $+bpb_s_size</font>
<font face="Courier New"><font size="2"><font color="#000000">        </font></font></font><b><font color="#0000ff">nop</font></b>
<font face="Courier New"><font size="2"><font color="#000000">    at OEMName, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#800000">&quot;MSDOS5.0&quot;</font>
<font face="Courier New"><font size="2"><font color="#000000">    at BytsPerSec, </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> BYTES_PER_SECTOR</font>
<font face="Courier New"><font size="2"><font color="#000000">    at SecPerClus, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> SECTORS_PER_CLUSTER</font>
<font face="Courier New"><font size="2"><font color="#000000">    at RsvdSecCnt, </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> </font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    at NumFATs, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> NUM_FATS</font>
<font face="Courier New"><font size="2"><font color="#000000">    at RootEntCnt, </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> ROOT_ENT_CNT</font>
<font face="Courier New"><font size="2"><font color="#000000">    at TotSec16, </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> DISK_SIZE/BYTES_PER_SECTOR</font>
<font face="Courier New"><font size="2"><font color="#000000">    at Media, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">xf0</font>
<font face="Courier New"><font size="2"><font color="#000000">    at FatSz16, </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> FAT_SIZE</font>
<font face="Courier New"><font size="2"><font color="#000000">    at SecPerTrk, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">18</font>
<font face="Courier New"><font size="2"><font color="#000000">    at NumHeads, </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> </font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">    at HiddSec, </font></font></font><b><font color="#000080">dd</font></b><font color="#000000"> </font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">    at TotSec32, </font></font></font><b><font color="#000080">dd</font></b><font color="#000000"> </font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">    at DrvNum, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">    at Reserved1, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">    at BootSig, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">x29</font>
<font face="Courier New"><font size="2"><font color="#000000">    at VolID, </font></font></font><b><font color="#000080">dd</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">x4076939f</font>
<font face="Courier New"><font size="2"><font color="#000000">    at VolLab, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#800000">&quot;NO NAME    &quot;</font>
<font face="Courier New"><font size="2"><font color="#000000">    at FilSysType, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#800000">&quot;FAT12   &quot;</font>
<font face="Courier New"><font size="2"><font color="#000000">iend</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">xor</font></b><font color="#000000"> </font><font color="#0000ff">ax</font><font color="#000000">, </font><font color="#0000ff">ax</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">mov</font></b><font color="#000000"> </font><font color="#0000ff">ss</font><font color="#000000">, </font><font color="#0000ff">ax</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">mov</font></b><font color="#000000"> </font><font color="#0000ff">sp</font><font color="#000000">, </font><font color="#008000">0</font><font color="#000000">x7bfc</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">mov</font></b><font color="#000000"> </font><font color="#0000ff">ds</font><font color="#000000">, </font><font color="#0000ff">ax</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">mov</font></b><font color="#000000"> </font><font color="#0000ff">es</font><font color="#000000">, </font><font color="#0000ff">ax</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">cld</font></b>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">mov</font></b><font color="#000000"> </font><font color="#0000ff">si</font><font color="#000000">, msg_blah</font>
<font face="Courier New"><font size="2"><font color="#000000">next:</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">lodsb</font></b>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">cmp</font></b><font color="#000000"> </font><font color="#0000ff">al</font><font color="#000000">, </font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">jz</font></b><font color="#000000"> press_any_key</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">mov</font></b><font color="#000000"> </font><font color="#0000ff">ah</font><font color="#000000">, </font><font color="#008000">0</font><font color="#000000">x0e</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">int</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">x10</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">jmp</font></b><font color="#000000"> next</font>
<font face="Courier New"><font size="2"><font color="#000000">press_any_key:</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">xor</font></b><font color="#000000"> </font><font color="#0000ff">ax</font><font color="#000000">, </font><font color="#0000ff">ax</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">int</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">x16</font>
<font face="Courier New"><font size="2"><font color="#000000">reboot:</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">int</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">x19</font>
<font face="Courier New"><font size="2"><font color="#000000">halt:</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#0000ff">jmp</font></b><font color="#000000"> $

</font><font face="Courier New"><font size="2"><font color="#000000">    msg_blah </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#800000">&#39;This disk is not bootable.&#39;</font><font color="#000000">, </font><font color="#008000">13</font><font color="#000000">, </font><font color="#008000">10</font><font color="#000000">, </font><font color="#800000">&#39;Remove this disk and press any key&#39;</font><font color="#000000">, </font><font color="#008000">13</font><font color="#000000">, </font><font color="#008000">10</font><font color="#000000">, </font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">    times </font></font></font><font color="#008000">510</font><font color="#000000">-($-$$) </font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">    </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">xaa55

</font><font face="Courier New"><font size="2"><font color="#000000">%endmacro
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> _fat_section </font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %if %</font></font></font><font color="#008000">1</font><font color="#000000">==</font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">        section .fat</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    %else</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        section .fat%</font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %endif</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%endmacro
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> fat_start </font><font color="#008000">0</font><font color="#000000">-</font><font color="#008000">1
</font><font face="Courier New"><font size="2"><font color="#000000">
    %</font></font></font><b><font color="#0000ff">push</font></b><font color="#000000"> fat

</font><font face="Courier New"><font size="2"><font color="#000000">    %if %</font></font></font><font color="#008000">0</font><font color="#000000">==</font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">        %define %$RESERVED_SECTORS </font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">        default_boot_sector</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    %else</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        %define %$RESERVED_SECTORS %</font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %endif
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    section .fat</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        fat_start:
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    %assign i </font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %</font></font></font><b><font color="#0000ff">rep</font></b><font color="#000000"> NUM_FATS</font>
<font face="Courier New"><font size="2"><font color="#000000">        _fat_section i</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">            </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">xF0</font>
<font face="Courier New"><font size="2"><font color="#000000">            </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">xFF</font>
<font face="Courier New"><font size="2"><font color="#000000">            </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">xFF</font>
<font face="Courier New"><font size="2"><font color="#000000">        %assign i i+</font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %endrep
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    section .root_dir</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        root_dir_start:

</font></font></font><font face="Courier New"><font size="2"><font color="#000000">    section .file_data</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        file_data_start:
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%endmacro
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> fat_end </font><font color="#008000">0

</font><font face="Courier New"><font size="2"><font color="#000000">    section .fat</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        fat_used_bytes </font></font></font><b><font color="#000080">equ</font></b><font color="#000000"> ($-fat_start)

</font><font face="Courier New"><font size="2"><font color="#000000">    %assign i </font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %</font></font></font><b><font color="#0000ff">rep</font></b><font color="#000000"> NUM_FATS</font>
<font face="Courier New"><font size="2"><font color="#000000">        _fat_section i</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">            times FAT_SIZE * BYTES_PER_SECTOR - fat_used_bytes </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">x0</font>
<font face="Courier New"><font size="2"><font color="#000000">        %assign i i+</font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">    %endrep
</font></font></font>

<font face="Courier New"><font size="2"><font color="#000000">    section .fat</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        fat_end</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        fat_size </font></font></font><b><font color="#000080">equ</font></b><font color="#000000"> fat_end - fat_start

</font><font face="Courier New"><font size="2"><font color="#000000">    section .root_dir</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        times ROOT_ENT_CNT * </font></font></font><font color="#008000">32</font><font color="#000000"> - ($-root_dir_start) </font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font>
<font face="Courier New"><font size="2"><font color="#000000">        align BYTES_PER_SECTOR</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        root_dir_end</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        root_dir_size </font></font></font><b><font color="#000080">equ</font></b><font color="#000000"> root_dir_end - root_dir_start

</font><font face="Courier New"><font size="2"><font color="#000000">    section .file_data</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        file_data_end</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        file_data_size </font></font></font><b><font color="#000080">equ</font></b><font color="#000000"> file_data_end - file_data_start

</font><font face="Courier New"><font size="2"><font color="#000000">    times DISK_SIZE-(%$RESERVED_SECTORS*BYTES_PER_SECTOR+root_dir_size+NUM_FATS*fat_size+file_data_size) </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0

</font><font face="Courier New"><font size="2"><font color="#000000">    section .text
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">    %</font></font></font><b><font color="#0000ff">pop</font></b>

<font face="Courier New"><font size="2"><font color="#000000">%endmacro

</font></font></font>

<font face="Courier New"><font size="2"><font color="#000000">%</font></font></font><b><font color="#000080">macro</font></b><font color="#000000"> fat_file </font><font color="#008000">2

</font>

<font face="Courier New"><font size="2"><font color="#000000">    section .file_data</font></font></font>

<font face="Courier New"><font size="2"><font color="#000000">        %%start </font></font></font><b><font color="#000080">equ</font></b><font color="#000000"> ($-$$)</font>
<font face="Courier New"><font size="2"><font color="#000000">        %%first_cluster </font></font></font><b><font color="#000080">equ</font></b><font color="#000000"> (%%start / CLUSTER_SIZE)</font>
<font face="Courier New"><font size="2"><font color="#000000">        incbin %</font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">        %%</font></font></font><b><font color="#000080">end</font></b><font color="#000000"> </font><b><font color="#000080">equ</font></b><font color="#000000"> ($-$$)</font>
<font face="Courier New"><font size="2"><font color="#000000">        %%</font></font></font><b><font color="#000080">size</font></b><font color="#000000"> </font><b><font color="#000080">equ</font></b><font color="#000000"> (%%</font><b><font color="#000080">end</font></b><font color="#000000"> - %%start)</font>
<font face="Courier New"><font size="2"><font color="#000000">        %%size_in_clusters </font></font></font><b><font color="#000080">equ</font></b><font color="#000000"> ((%%</font><b><font color="#000080">size</font></b><font color="#000000"> + CLUSTER_SIZE - </font><font color="#008000">1</font><font color="#000000">) / CLUSTER_SIZE)</font>
<font face="Courier New"><font size="2"><font color="#000000">        times (CLUSTER_SIZE*</font></font></font><font color="#008000">2</font><font color="#000000">) - (($-$$) % (CLUSTER_SIZE*</font><font color="#008000">2</font><font color="#000000">)) </font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000"> </font><i><font color="#808080">; *2 simplifies generation of fat

</font></i>

<font face="Courier New"><font size="2"><font color="#000000">    section .root_dir</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        %%dir_entry:</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">        istruc file_dir_entry_s</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">            at </font></font></font><b><font color="#000080">Name</font></b><font color="#000000">, </font><b><font color="#000080">db</font></b><font color="#000000"> %</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">            at Attr, </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> ATTR_ARCHIVE</font>
<font face="Courier New"><font size="2"><font color="#000000">            at WrtTime, make_time </font></font></font><font color="#008000">14</font><font color="#000000">, </font><font color="#008000">38</font><font color="#000000">, </font><font color="#008000">55</font>
<font face="Courier New"><font size="2"><font color="#000000">            at WrtDate, make_date </font></font></font><font color="#008000">2006</font><font color="#000000">, </font><font color="#008000">6</font><font color="#000000">, </font><font color="#008000">9</font>
<font face="Courier New"><font size="2"><font color="#000000">            at FstClusLO, </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> %%first_cluster+</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">            at FileSize, </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> %%</font><b><font color="#000080">size</font></b>
<font face="Courier New"><font size="2"><font color="#000000">        iend

</font></font></font>

<font face="Courier New"><font size="2"><font color="#000000">    %assign tsize_in_clusters %%size_in_clusters </font></font></font><i><font color="#808080">; nasm does not support nested %reps with %%-variables

</font></i>

<font face="Courier New"><font size="2"><font color="#000000">    %assign i </font></font></font><font color="#008000">1</font>

<font face="Courier New"><font size="2"><font color="#000000">    %</font></font></font><b><font color="#0000ff">rep</font></b><font color="#000000"> NUM_FATS</font>
<font face="Courier New"><font size="2"><font color="#000000">        _fat_section i</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">            %assign j %%first_cluster+</font></font></font><font color="#008000">2</font><font color="#000000">+</font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">            %</font></font></font><b><font color="#0000ff">rep</font></b><font color="#000000"> (tsize_in_clusters+</font><font color="#008000">1</font><font color="#000000">)/</font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">                %assign c1 j</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">                %if j &gt; %%size_in_clusters</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">                    %assign c2 </font></font></font><font color="#008000">0</font><font color="#000000">xFFF </font><i><font color="#808080">; end of file</font></i>
<font face="Courier New"><font size="2"><font color="#000000">                %else</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">                    %assign c2 j + </font></font></font><font color="#008000">1</font>
<font face="Courier New"><font size="2"><font color="#000000">                %endif</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">                %assign c c1 | (c2 &lt;&lt; </font></font></font><font color="#008000">12</font><font color="#000000">)</font>
<font face="Courier New"><font size="2"><font color="#000000">                </font></font></font><b><font color="#000080">dw</font></b><font color="#000000"> c &amp; </font><font color="#008000">0</font><font color="#000000">xFFFF</font>
<font face="Courier New"><font size="2"><font color="#000000">                </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> (c &gt;&gt; </font><font color="#008000">16</font><font color="#000000">)</font>
<font face="Courier New"><font size="2"><font color="#000000">                %assign j j+</font></font></font><font color="#008000">2</font>
<font face="Courier New"><font size="2"><font color="#000000">            %endrep</font></font></font>

<font face="Courier New"><font size="2"><font color="#000000">            %if c2 != </font></font></font><font color="#008000">0</font><font color="#000000">xFFF</font>
<font face="Courier New"><font size="2"><font color="#000000">                </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">xFF</font>
<font face="Courier New"><font size="2"><font color="#000000">                </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">x0F</font>
<font face="Courier New"><font size="2"><font color="#000000">                </font></font></font><b><font color="#000080">db</font></b><font color="#000000"> </font><font color="#008000">0</font><font color="#000000">x00</font>
<font face="Courier New"><font size="2"><font color="#000000">            %endif</font></font></font>

<font face="Courier New"><font size="2"><font color="#000000">        %assign i i+</font></font></font><font color="#008000">1</font>

<font face="Courier New"><font size="2"><font color="#000000">    %endrep
</font></font></font>
<font face="Courier New"><font size="2"><font color="#000000">%endmacro

</font></font></font></font></font></font></font></pre>
<p>Sorry, WordPress versaut die Formatierung geh&ouml;rig. Es ist halt einfach nicht geeignet f&uuml;r &uuml;berhaupt irgendwas. Ich muss mir mal zuverl&auml;ssigen Webspace suchen. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/superschurke.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/superschurke.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/superschurke.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/superschurke.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/superschurke.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/superschurke.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/superschurke.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/superschurke.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/superschurke.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/superschurke.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/superschurke.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/superschurke.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=superschurke.wordpress.com&blog=249214&post=5&subd=superschurke&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://superschurke.wordpress.com/2006/06/09/mit-nasm-fat12-images-erstellen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/db690c3e247336a6fd8ed25ea3d11cb4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Superschurke</media:title>
		</media:content>
	</item>
		<item>
		<title>Bootsektor mit GCC</title>
		<link>http://superschurke.wordpress.com/2006/06/02/bootsektor-mit-gcc/</link>
		<comments>http://superschurke.wordpress.com/2006/06/02/bootsektor-mit-gcc/#comments</comments>
		<pubDate>Fri, 02 Jun 2006 14:36:00 +0000</pubDate>
		<dc:creator>superschurke</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Experimente]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[LD]]></category>

		<guid isPermaLink="false">https://superschurke.wordpress.com/2006/06/02/bootsektor-mit-gcc/</guid>
		<description><![CDATA[Gleich als Einstimmung auf die Art der weiteren Posts gibt es von mir etwas relativ exotisches, das keinen praktischen Nutzen hat: Einen Bootsektor, der komplett in C geschrieben ist. Es werden nur der GCC und LD aus den Binutils verwendet. Es gibt dabei zwei Herausforderungen:

Mit möglichst wenig Code in den Protected Mode zu gelangen, denn [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=superschurke.wordpress.com&blog=249214&post=3&subd=superschurke&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Gleich als Einstimmung auf die Art der weiteren Posts gibt es von mir etwas relativ exotisches, das keinen praktischen Nutzen hat: Einen Bootsektor, der komplett in C geschrieben ist. Es werden nur der GCC und LD aus den Binutils verwendet. Es gibt dabei zwei Herausforderungen:</p>
<ol>
<li>Mit möglichst wenig Code in den Protected Mode zu gelangen, denn der GCC ist nur für den Protected Mode geeignet.</li>
<li>Den Linker dazu zu bringen, eine 512 Byte große Datei zu erzeugen.</li>
</ol>
<p><span id="more-3"></span>In diesem Post setze ich voraus, dass eine gewisse Kenntnis im Umgang mit dem GCC und LD vorhanden sind, sowie was ein Bootsektor ist und welche Bedingungen dort herrschen. Die wichtigsten Dinge kurz zusammengefasst: Der GCC erzeugt Code für den 32-Bit Protected Mode, im Bootsektor stehen uns (weniger als) 512 Bytes zur Verfügung und wir befinden uns im 16-Bit Real Mode.</p>
<h3>In den Protected Mode</h3>
<p>Es sind 4 Schritte notwendig um  vom Urzustand nach dem Einsprung in den Bootsektor eine Umgebung zu schaffen, in der der vom GCC erzeugte Code zuverlässig laufen kann:</p>
<ol>
<li>Eine GDT laden</li>
<li>In den Protected Mode schalten</li>
<li>Die Daten-, Code- und Stackselektoren laden</li>
<li>Den Stackpointer setzen</li>
</ol>
<p>Die Aussage, dass ich nur den GCC und LD verwende, war nicht ganz korrekt: Für jeden dieser vier Schritte müssen wir zwangsläufig mit Inline-Assembler arbeiten. Wir nutzen also auch noch den GNU Assembler GAS, der allerdings intern vom GCC aufgerufen wird. Da wir uns im Real Mode befinden, müssen wir dem Assembler mit <code>.code16</code> befehlen 16-Bit Code zu erzeugen. Danach folgt der oben genannte Ablauf, um in den Protected Mode zu gelangen, und ein far jump zum 32-Bit Code. Das darauf folgende <code>.code32</code> sorgt dafür, dass ab dieser Stelle wieder 32-Bit Code erzeugt wird:</p>
<p><code> asm("\n\t"<br />
".code16\n\t"</code><code><br />
</code><code>    </code><code> "cli</code><code>\n\t"</code><br />
<code>    </code><code> "</code><code>xor %ax, %ax\n\t"<br />
</code><code>    </code><code> "</code><code>mov %ax, %ds\n\t"<br />
</code><code>    </code><code> "</code><code>lgdt _gdt\n\t" /* 1. */<br />
</code><code>    </code><code> "mov %cr0, %eax\n\t" /* 2. */<br />
</code><code>    </code><code> "inc %ax\n\t"<br />
</code><code>    </code><code> "mov %eax, %cr0\n\t"<br />
</code><code>    </code><code> "mov $0x10, %ax\n\t" /* 3. */<br />
</code><code>    </code><code> "mov %ax, %ds\n\t"<br />
</code><code>    </code><code> "mov %ax, %es\n\t"<br />
</code><code>    </code><code> "mov %ax, %ss\n\t"<br />
</code><code>    </code><code> "mov $0x7bfc, %esp\n\t" /* 4. */<br />
</code><code>    </code><code> "ljmpl $0x08, $_bmain\n\t" /* Sprung zum C-Code */<br />
</code><code>    </code><code> ".code32\n");</code></p>
<p>Erzeuge einfach eine leere Datei, nenne sie boot.c und füge diesen Assembler Code ein. Füge alle weiteren Codes unter diesem ein, damit dieser Code zu erst ausgeführt wird.</p>
<p>Die Labels _gdt und _bmain werden im C-Teil definiert. In diesem Code beginnen sie im Inline-Assembler-Teil mit Unterstrichen, da ich diesen Code mit MinGW getestet habe. (Wenn du nicht DJGPP oder MinGW nutzt, musst du die Unterstriche entfernen. In einem späteren Post werde ich vielleicht mal erläutern, warum die Verwendung von MinGW und DJGPP eine schlechte Idee ist.) In dem nun folgenden C-Teil benutzen wir also statt _gdt und _bmain nur noch gdt bzw. bmain, meinen jedoch die selben Variablen.</p>
<p>In dem C-Teil müssen wir noch die GDT definieren. Dazu bietet sich folgendes struct an:</p>
<p><code>struct __attribute__ ((packed))<br />
{<br />
</code><code>    </code><code> struct __attribute__ ((packed))<br />
</code><code>    </code><code> {<br />
</code><code>    </code><code>    </code><code> unsigned short limit;<br />
</code><code>    </code><code>    </code><code> void * base;<br />
</code><code>    </code><code>    </code><code> unsigned short zero;<br />
</code><code>    </code><code> };<br />
</code><code>    </code><code> unsigned long long code_desc;<br />
</code><code>    </code><code> unsigned long long data_desc;<br />
}<br />
gdt =<br />
{<br />
</code><code>    </code><code> { sizeof(gdt) - 1, &amp;gdt, 0 }, // gdtr/null descriptor<br />
</code><code>    </code><code> 0x00cf9a000000ffffULL, // code descriptor<br />
</code><code>    </code><code> 0x00cf92000000ffffULL, // data descriptor<br />
};</code></p>
<p>Hier benutze ich die Technik, dass ich GDT und GDTR verschachtele. Das GDTR steht also an der Stelle des ungenutzten  Null-Deskriptors, und die Adresse von gdt gibt somit sowohl die Adresse der GDT als auch die Adresse des GDTR an. Der Sinn dahinter ist einfach Platz zu sparen. Würde ich das GDTR aus der GDT rausnehmen, würden wir 6 Bytes mehr verbrauchen. Bei nur 512 Bytes (eigentlich 508, siehe unten), die uns zur Verfügung stehen, ist diese einfache Optimierung auf jeden Fall gerechtfertigt. Für die Code und Datendeskriptoren habe ich mir kein eigenes struct gebastelt, sondern einfach unsigned long longs genommen, weil diese einfachen Deskriptoren klar sein sollten, und ich einfach auf kürzeren Code stehe.</p>
<p>Das <code>__attribute__ ((packed))</code> sorgt dafür, dass der GCC nicht irgendwelche Zwischenräume zwischen den Mitglieden der structs macht, um den Code zu &#8222;optimieren&#8220;. In diesem Fall wäre das nicht nur Verschwendung, sondern würde für einen Absturz sorgen, da die CPU davon ausgeht, dass es dort keine Zwischenräume gibt.</p>
<p>Für bmain nehmen wir erstmal eine einfache Hello-World-Funktion:</p>
<p><code>void bmain(void)<br />
{<br />
</code><code>    </code><code> char * msg = "Hello, world!";<br />
</code><code>    </code><code> short * video = (short *)0xb8000;<br />
</code><code>    </code><code> while(*msg)<br />
</code><code>    </code><code> {<br />
</code><code>    </code><code>    </code><code> *video++ = *msg++ | 0x0700;<br />
</code><code>    </code><code> }</code></p>
<p><code>    while(1);<br />
}</code></p>
<h3>Alles zusammen linken</h3>
<p>Um zu überprüfen, ob alles richtig ist, können wir den Quelltext kompilieren, linken und in eine Binär-Datei umwandeln. Kompilieren ist noch einfach: <code></code></p>
<p><code>gcc -c boot.c</code></p>
<p>Für das Linken brauchen wir folgendes Linker-Skript names <code>boot.ld</code>:</p>
<p><code>SECTIONS<br />
{<br />
</code><code>    </code><code> .boot_sector 0x7c00 : {<br />
</code><code>    </code><code>    </code><code> *(.text)<br />
</code><code>    </code><code>    </code><code> *(.data) /* daten */<br />
</code><code>    </code><code>    </code><code> *(.rdata) /* read-only daten */<br />
</code><code>    </code><code>    </code><code> *(.rodata) /* read-only daten von mingw */<br />
</code><code>    </code><code> }<br />
</code><code>    </code><code> .bss : {<br />
</code><code>    </code><code>    </code><code> *(.bss)<br />
</code><code>    </code><code> }<br />
}<br />
</code></p>
<p>Ich habe hier eine neue Sektion namens <code>.boot_sector</code> eingeführt, die erwartet, an die Adresse 0&#215;7c00 geladen zu werden. In diese Sektion kommt alles Initialisiertes, also der Code (<code>.text</code>) und die Daten (<code>.data</code>, <code>.rdata</code>, <code>.rodata</code>). Die nicht initialisierten Daten (<code>.bss</code>) kommen einfach dahinter. Durch folgenden Aufruf von ld wird das Linker-Skript angewandt:</p>
<p><code>ld -T boot.ld -o boot boot.o</code><code></code></p>
<p>Und mit objcopy wird das ganze in eine Binärdatei umgewandelt:</p>
<p><code>objcopy -O binary boot</code><code></code></p>
<p>Man kann auch direkt mit ld die Binärdatei erzeugen, und somit objcopy weglassen. Allerdings ist das ld von MinGW total vermurkst und deswegen verwende ich die Methode mit objcopy, die mit allen GCC-Varianten funktionieren sollte.</p>
<p>Jetzt fehlt noch das Wichtigste, das einen Bootsektor ausmacht: Die Bootsignatur 0xaa55. Dieses beiden Bytes müssen sich genau an dem Offset 510 des Bootsektors befinden, also 2 Bytes vor dem Ende. Um diese dort zu platzieren, benötigen wir LD. Wichtig ist dabei allerdings zu beachten, dass wir uns in 32-Bit Code befinden und es deswegen nicht so einfach ist, etwas an einer Adresse zu platzieren, die nicht durch 4 teilbar ist. Der Einfachheit halber platziere ich statt eines words 0xaa55 an die Adresse 510, das dword 0xaa550000 an die Adresse 508. Dass dies auch die korrekte Bootsignatur erzeugt, liegt daran, dass die x86-Archtektur eine <a href="http://de.wikipedia.org/wiki/Byte-Reihenfolge" title="Byte-Reihenfolge in der Wikipedia">Little-Endian-Architektur</a> ist. Wenn ich also das word 0xaa55 an die Adresse 510 schreibe, landet das byte 0&#215;55 bei 510 und das byte 0xaa bei 511. Wenn ich das dword 0xaa550000 an die Adresse 508 schreibe, landet das niederwertigste byte 0&#215;00 bei 508, das zweite byte (von rechts) 0&#215;00 bei 509, und die bytes 0&#215;55 und 0xaa wieder bei 510 bzw. 511.</p>
<p>Ein dword mit dem Wert 0xaa550000 ist in C einfach zu definieren:</p>
<p><code>static unsigned int boot_signature = 0xaa550000;</code><code><br />
</code></p>
<p>Um dies allerdings noch zu platzieren, müssen wir es in eine Extra-Sektion tun. Diese kann einen beliebigen Namen haben, ich habe <code>.boot_signature</code> gewählt:</p>
<p><code>static unsigned int boot_signature __attribute__ ((section(".boot_signature"))) = 0xaa550000;</code><code><br />
</code></p>
<p>Da diese Variable nur vom Linker, aber nicht vom C-Compiler genutzt wird, müssen wir ihn daran hindern, sie weg zu optimieren. Das geht mit dem Attribut <code>used</code>:</p>
<p><code>static unsigned int boot_signature __attribute__ ((section(".boot_signature"))) __attribute__ ((used)) = 0xaa550000;</code><br />
Die Sektion <code>.boot_signature</code> können wir nun mit <code>*(.boot_signature) </code>im Linker-Skript referenzieren:</p>
<p><code>SECTIONS<br />
{<br />
</code><code>    </code><code> .boot_sector 0x7c00 : {<br />
</code><code>    </code><code>    </code><code> *(.text)<br />
</code><code>    </code><code>    </code><code> *(.data) /* daten */<br />
</code><code>    </code><code>    </code><code> *(.rdata) /* read-only daten */<br />
</code><code>    </code><code>    </code><code> *(.rodata) /* read-only daten von mingw */<br />
</code><code>    </code><code>    </code><code> . = 508; *(.boot_signature)<br />
</code><code>    </code><code> }<br />
</code><code>    </code><code> .bss : {<br />
</code><code>    </code><code>    </code><code> *(.bss)<br />
</code><code>    </code><code> }<br />
}<br />
</code></p>
<p>Die neue Zeile platziert die Sektion <code>.boot_signature</code>  an das Offset 508, was wie oben bereits erläutert unsere Bootsignatur gibt. Jetzt einfach noch mal alles neu bauen, und fertig ist der Bootsektor in C:</p>
<p><code>gcc -c boot.c<br />
ld -T boot.ld -o boot boot.o<br />
objcopy -O binary boot</code></p>
<p>Die Datei <code>boot </code>kann man nun in einen Bootsektor einer Diskette schreiben und  wenn man davon bootet wird man mit einem &#8222;Hello, world!&#8220; begrüßt.</p>
<h3>Fazit</h3>
<p>Der Nutzen eines solchen Bootsektors ist, wie bereits gesagt, eher gering, da man sich durch den Sprung in den Protected Mode sofort den Zugang zu den BIOS-Funktionen versperrt, die man benötigt um weiteren Code nachzuladen. Wer in den ca. 430 noch zur Verfügung stehenden Bytes einen Diskettentreiber schreiben kann, der wird natürlich auch damit umgehen können. Dem sterblichen Rest würde ich in der Regel von einem selbstgeschriebenen Bootsektor abraten und einen Bootloader wie GRUB, von dem übrigens bald <a href="http://grub.enbug.org/FrontPage" title="GRUB Wiki">Version  2 ansteht</a>, empfehlen.</p>
<p>Update: Hab vergessen die Interrupts zu deaktivieren.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/superschurke.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/superschurke.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/superschurke.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/superschurke.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/superschurke.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/superschurke.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/superschurke.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/superschurke.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/superschurke.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/superschurke.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/superschurke.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/superschurke.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=superschurke.wordpress.com&blog=249214&post=3&subd=superschurke&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://superschurke.wordpress.com/2006/06/02/bootsektor-mit-gcc/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/db690c3e247336a6fd8ed25ea3d11cb4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Superschurke</media:title>
		</media:content>
	</item>
		<item>
		<title>Hello world!</title>
		<link>http://superschurke.wordpress.com/2006/06/02/hello-world/</link>
		<comments>http://superschurke.wordpress.com/2006/06/02/hello-world/#comments</comments>
		<pubDate>Fri, 02 Jun 2006 10:32:09 +0000</pubDate>
		<dc:creator>superschurke</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=superschurke.wordpress.com&blog=249214&post=1&subd=superschurke&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Welcome to <a href="http://wordpress.com/">WordPress.com</a>. This is your first post. Edit or delete it and start blogging!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/superschurke.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/superschurke.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/superschurke.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/superschurke.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/superschurke.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/superschurke.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/superschurke.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/superschurke.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/superschurke.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/superschurke.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/superschurke.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/superschurke.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=superschurke.wordpress.com&blog=249214&post=1&subd=superschurke&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://superschurke.wordpress.com/2006/06/02/hello-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/db690c3e247336a6fd8ed25ea3d11cb4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Superschurke</media:title>
		</media:content>
	</item>
	</channel>
</rss>