aboutsummaryrefslogtreecommitdiff
path: root/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.xml
diff options
context:
space:
mode:
Diffstat (limited to 'de_DE.ISO8859-1/books/developers-handbook/x86/chapter.xml')
-rw-r--r--de_DE.ISO8859-1/books/developers-handbook/x86/chapter.xml529
1 files changed, 202 insertions, 327 deletions
diff --git a/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.xml b/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.xml
index f9c2256efd..fc12750cb4 100644
--- a/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.xml
+++ b/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.xml
@@ -21,25 +21,20 @@
$FreeBSDde: de-docproj/books/developers-handbook/x86/chapter.xml,v 1.24 2010/12/15 19:03:52 bcr Exp $
basiert auf: 1.19
-->
-
-<chapter id="x86">
+<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="x86">
<title>x86-Assembler-Programmierung</title>
<para><emphasis>Dieses Kapitel wurde geschrieben von
&a.stanislav;.</emphasis></para>
- <sect1 id="x86-intro">
- <sect1info>
+ <sect1 xml:id="x86-intro">
+ <info><title>Synopsis</title>
<authorgroup>
- <author>
- <firstname>Hagen</firstname>
- <surname>Kühl</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Hagen</firstname><surname>Kühl</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Synopsis</title>
+
<para>Assembler-Programmierung unter &unix; ist höchst
undokumentiert. Es wird allgemein angenommen, dass niemand sie
@@ -67,11 +62,10 @@
<para>Dieses Kapitel erklärt nicht die Grundlagen der
Assembler-Sprache. Zu diesem Thema gibt es bereits genug Quellen
(einen vollständigen Online-Kurs finden Sie in Randall
- Hydes <ulink url="http://webster.cs.ucr.edu/">Art of Assembly
- Language</ulink>; oder falls Sie ein gedrucktes Buch bevorzugen,
- können Sie einen Blick auf Jeff Duntemanns <ulink
- url="http://www.int80h.org/cgi-bin/isbn?isbn=0471375233">Assembly
- Language Step-by-Step</ulink> werfen). Jedenfalls sollte jeder
+ Hydes <link xlink:href="http://webster.cs.ucr.edu/">Art of Assembly
+ Language</link>; oder falls Sie ein gedrucktes Buch bevorzugen,
+ können Sie einen Blick auf Jeff Duntemanns <link xlink:href="http://www.int80h.org/cgi-bin/isbn?isbn=0471375233">Assembly
+ Language Step-by-Step</link> werfen). Jedenfalls sollte jeder
Assembler-Programmierer nach diesem Kapitel schnell und
effizient Programme für FreeBSD schreiben
können.</para>
@@ -80,20 +74,16 @@
reserved.</para>
</sect1>
- <sect1 id="x86-the-tools">
- <sect1info>
+ <sect1 xml:id="x86-the-tools">
+ <info><title>Die Werkzeuge</title>
<authorgroup>
- <author>
- <firstname>Hagen</firstname>
- <surname>Kühl</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Hagen</firstname><surname>Kühl</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Die Werkzeuge</title>
+
- <sect2 id="x86-the-assembler">
+ <sect2 xml:id="x86-the-assembler">
<title>Der Assembler</title>
<para>Das wichtigste Werkzeug der Assembler-Programmierung ist
@@ -120,7 +110,7 @@
offen gesagt, weil es das ist, was ich gewohnt bin.</para>
</sect2>
- <sect2 id="x86-the-linker">
+ <sect2 xml:id="x86-the-linker">
<title>Der Linker</title>
<para>Die Ausgabe des Assemblers muss, genau wie der Code jedes
@@ -134,20 +124,16 @@
</sect2>
</sect1>
- <sect1 id="x86-system-calls">
- <sect1info>
+ <sect1 xml:id="x86-system-calls">
+ <info><title>Systemaufrufe</title>
<authorgroup>
- <author>
- <firstname>Hagen</firstname>
- <surname>Kühl</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Hagen</firstname><surname>Kühl</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Systemaufrufe</title>
+
- <sect2 id="x86-default-calling-convention">
+ <sect2 xml:id="x86-default-calling-convention">
<title>Standard-Aufrufkonvention</title>
<para>Standardmäßig benutzt der FreeBSD-Kernel die
@@ -187,8 +173,7 @@ open:
Prozedur kernel ändern.</para>
<para>Aber Assembler-Programmierer lieben es Taktzyklen zu
- schinden. Das obige Beispiel benötigt eine <function
- role="opcode">call/ret</function>-Kombination. Das können
+ schinden. Das obige Beispiel benötigt eine <function role="opcode">call/ret</function>-Kombination. Das können
wir entfernen, indem wir einen weiteren Parameter mit
<function role="opcode">push</function> übergeben:</para>
@@ -201,13 +186,12 @@ open:
int 80h
add esp, byte 16</programlisting>
- <para>Die Konstante <constant>5</constant>, die wir in <varname
- role="register">EAX</varname> ablegen, identifiziert die
+ <para>Die Konstante <constant>5</constant>, die wir in <varname role="register">EAX</varname> ablegen, identifiziert die
Kernel-Funktion, die wir aufrufen. In diesem Fall ist das
<function role="syscall">open</function>.</para>
</sect2>
- <sect2 id="x86-alternate-calling-convention">
+ <sect2 xml:id="x86-alternate-calling-convention">
<title>Alternative Aufruf-Konvention</title>
<para>FreeBSD ist ein extrem flexibles System. Es bietet noch
@@ -219,8 +203,7 @@ open:
dessen Kernel die gleiche Systemaufruf-Konvention, bei der
Parameter in Registern abgelegt werden, wie
<acronym>&ms-dos;</acronym>. Genau wie bei der
- &unix;-Konvention wird die Nummer der Funktion in <varname
- role="register">EAX</varname> abgelegt. Allerdings werden die
+ &unix;-Konvention wird die Nummer der Funktion in <varname role="register">EAX</varname> abgelegt. Allerdings werden die
Parameter nicht auf den Stack gelegt, sondern in die Register
<varname role="register">EBX, ECX, EDX, ESI, EDI,
EBP</varname>:</para>
@@ -235,9 +218,7 @@ open:
<para>Diese Konvention hat einen großen Nachteil
gegenüber der von &unix;, was die
Assembler-Programmierung angeht: Jedesmal, wenn Sie einen
- Kernel-Aufruf machen, müssen Sie die Register <function
- role="opcode">push</function>en und sie später <function
- role="opcode">pop</function>en. Das macht Ihren Code
+ Kernel-Aufruf machen, müssen Sie die Register <function role="opcode">push</function>en und sie später <function role="opcode">pop</function>en. Das macht Ihren Code
unförmiger und langsamer. Dennoch lässt FreeBSD
ihnen die Wahl.</para>
@@ -248,10 +229,10 @@ open:
<screen>&prompt.user;
<userinput>brandelf -t Linux
- <replaceable>filename</replaceable></userinput></screen>
+ filename</userinput></screen>
</sect2>
- <sect2 id="x86-use-geneva">
+ <sect2 xml:id="x86-use-geneva">
<title>Welche Konvention Sie verwenden sollten</title>
<para>Wenn Sie speziell für FreeBSD programmieren, sollten
@@ -269,15 +250,14 @@ open:
habe.</para>
</sect2>
- <sect2 id="x86-call-numbers">
+ <sect2 xml:id="x86-call-numbers">
<title>Aufruf-Nummern</title>
<para>Um dem Kernel mitzuteilen welchen Dienst Sie aufrufen,
- legen Sie dessen Nummer in <varname
- role="register">EAX</varname> ab. Natürlich müssen
+ legen Sie dessen Nummer in <varname role="register">EAX</varname> ab. Natürlich müssen
Sie dazu wissen welche Nummer die Richtige ist.</para>
- <sect3 id="x86-the-syscalls-file">
+ <sect3 xml:id="x86-the-syscalls-file">
<title>Die Datei <filename>syscalls</filename></title>
<para>Die Nummer der Funktionen sind in der Datei
@@ -311,8 +291,7 @@ open:
6 STD POSIX { int close(int fd); }
etc...</programlisting>
- <para>In der ersten Spalte steht die Nummer, die in <varname
- role="register">EAX</varname> abgelegt werden muss.</para>
+ <para>In der ersten Spalte steht die Nummer, die in <varname role="register">EAX</varname> abgelegt werden muss.</para>
<para>Die Spalte ganz rechts sagt uns welche Parameter wir
<function role="opcode">push</function>en müssen. Die
@@ -321,8 +300,7 @@ etc...</programlisting>
<informalexample><para>Um beispielsweise eine Datei mittels
<function>open</function> zu öffnen, müssen wir
- zuerst den <varname>mode</varname> auf den Stack <function
- role="opcode">push</function>en, danach die
+ zuerst den <varname>mode</varname> auf den Stack <function role="opcode">push</function>en, danach die
<varname>flags</varname>, dann die Adresse an der der
<varname>path</varname> gespeichert
ist.</para></informalexample>
@@ -331,18 +309,14 @@ etc...</programlisting>
</sect2>
</sect1>
- <sect1 id="x86-return-values">
- <sect1info>
+ <sect1 xml:id="x86-return-values">
+ <info><title>Rückgabewerte</title>
<authorgroup>
- <author>
- <firstname>Hagen</firstname>
- <surname>Kühl</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Hagen</firstname><surname>Kühl</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Rückgabewerte</title>
+
<para>Ein Systemaufruf wäre meistens nicht sehr
nützlich, wenn er nicht irgendeinen Wert zurückgibt:
@@ -355,7 +329,7 @@ etc...</programlisting>
Systemressourcen erschöpft sind, wir ein ungültiges
Argument übergeben haben, etc.</para>
- <sect2 id="x86-man-pages">
+ <sect2 xml:id="x86-man-pages">
<title>Manualpages</title>
<para>Der herkömmliche Ort, um nach Informationen über
@@ -383,15 +357,13 @@ etc...</programlisting>
zusätzliche Informationen.</para></note>
</sect2>
- <sect2 id="x86-where-return-values">
+ <sect2 xml:id="x86-where-return-values">
<title>Wo sind die Rückgabewerde?</title>
<para>Leider gilt: Es kommt darauf an... Für die meisten
- Systemaufrufe liegt er in <varname
- role="register">EAX</varname>, aber nicht für alle. Eine
+ Systemaufrufe liegt er in <varname role="register">EAX</varname>, aber nicht für alle. Eine
gute Daumenregel, wenn man zum ersten Mal mit einem
- Systemaufruf arbeitet, ist in <varname
- role="register">EAX</varname> nach dem Rückgabewert zu
+ Systemaufruf arbeitet, ist in <varname role="register">EAX</varname> nach dem Rückgabewert zu
suchen. Wenn er nicht dort ist, sind weitere Untersuchungen
nötig.</para>
@@ -408,15 +380,14 @@ etc...</programlisting>
dem Kernel zusammenarbeitet.</para></tip>
</sect2>
- <sect2 id="x86-where-errno">
+ <sect2 xml:id="x86-where-errno">
<title>Wo ist <varname>errno</varname>?</title>
<para>Tatsächlich, nirgendwo...</para>
<para><varname>errno</varname> ist ein Teil der Sprache C, nicht
des &unix;-Kernels. Wenn man direkt auf Kernel-Dienste
- zugreift, wird der Fehlercode in <varname
- role="register">EAX</varname> zurückgegeben, das selbe
+ zugreift, wird der Fehlercode in <varname role="register">EAX</varname> zurückgegeben, das selbe
Register in dem der Rückgabewert, bei einem erfolgreichen
Aufruf landet.</para>
@@ -426,7 +397,7 @@ etc...</programlisting>
enthalten.</para>
</sect2>
- <sect2 id="x86-how-to-know-error">
+ <sect2 xml:id="x86-how-to-know-error">
<title>Feststellen, dass ein Fehler aufgetreten ist</title>
<para>Wenn Sie die Standard FreeBSD-Aufrufkonvention verwenden
@@ -435,25 +406,20 @@ etc...</programlisting>
ein Fehler auftritt.</para>
<para>Wenn Sie den Linux-Emulationsmodus verwenden ist der
- vorzeichenbehaftete Wert in <varname
- role="register">EAX</varname> nicht negativ, bei einem
+ vorzeichenbehaftete Wert in <varname role="register">EAX</varname> nicht negativ, bei einem
erfolgreichen Aufruf. Wenn ein Fehler auftritt ist der Wert
negativ, also <varname>-errno</varname>.</para>
</sect2>
</sect1>
- <sect1 id="x86-portable-code">
- <sect1info>
+ <sect1 xml:id="x86-portable-code">
+ <info><title>Portablen Code erzeugen</title>
<authorgroup>
- <author>
- <firstname>Hagen</firstname>
- <surname>Kühl</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Hagen</firstname><surname>Kühl</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Portablen Code erzeugen</title>
+
<para>Portabilität ist im Allgemeinen keine Stärke der
Assembler-Programmierung. Dennoch ist es, besonders mit
@@ -473,7 +439,7 @@ etc...</programlisting>
Die Aufruf-Konvention, die Funktionsnummern und die Art der
Übergabe von Rückgabewerten.</para>
- <sect2 id="x86-deal-with-function-numbers">
+ <sect2 xml:id="x86-deal-with-function-numbers">
<title>Mit Funktionsnummern umgehen</title>
<para>In vielen Fällen sind die Funktionsnummern die
@@ -490,7 +456,7 @@ etc...</programlisting>
%endif</programlisting>
</sect2>
- <sect2 id="x86-deal-with-geneva">
+ <sect2 xml:id="x86-deal-with-geneva">
<title>Umgang mit Konventionen</title>
<para>Sowohl die Aufrufkonvention, als auch die
@@ -545,7 +511,7 @@ kernel:
%endif</programlisting>
</sect2>
- <sect2 id="x86-deal-with-other-portability">
+ <sect2 xml:id="x86-deal-with-other-portability">
<title>Umgang mit anderen
Portabilitätsangelegenheiten</title>
@@ -562,7 +528,7 @@ kernel:
wenige solcher bedingten Abschnitte benötigen.</para>
</sect2>
- <sect2 id="x86-portable-library">
+ <sect2 xml:id="x86-portable-library">
<title>Eine Bibliothek benutzen</title>
<para>Sie können Portabilitätsprobleme im Hauptteil
@@ -636,7 +602,7 @@ sys.err:
erzeugen und an Ihr Hauptprogramm binden.</para>
</sect2>
- <sect2 id="x86-portable-include">
+ <sect2 xml:id="x86-portable-include">
<title>Eine Include-Datei verwenden</title>
<para>Wenn Sie ihre Software als (oder mit dem) Quelltext
@@ -721,18 +687,14 @@ access.the.bsd.kernel:
</sect2>
</sect1>
- <sect1 id="x86-first-program">
- <sect1info>
+ <sect1 xml:id="x86-first-program">
+ <info><title>Unser erstes Programm</title>
<authorgroup>
- <author>
- <firstname>Hagen</firstname>
- <surname>Kühl</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Hagen</firstname><surname>Kühl</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Unser erstes Programm</title>
+
<para>Jetzt sind wir bereit für unser erstes Programm, das
übliche <application>Hello, World!</application></para>
@@ -795,7 +757,7 @@ access.the.bsd.kernel:
tatsächlich ist.</para>
</note>
- <sect2 id="x86-assemble-1">
+ <sect2 xml:id="x86-assemble-1">
<title>Den Code assemblieren</title>
<para>Geben Sie den Code (außer den Zeilennummern) in
@@ -803,14 +765,14 @@ access.the.bsd.kernel:
<filename>hello.asm</filename>. Um es zu assemblieren
benötigen Sie <application>nasm</application>.</para>
- <sect3 id="x86-get-nasm">
+ <sect3 xml:id="x86-get-nasm">
<title><application>nasm</application> installieren</title>
<para>Wenn Sie <application>nasm</application> noch nicht
installiert haben geben Sie folgendes ein:</para>
<screen>&prompt.user; <userinput>su</userinput>
-Password:<userinput><replaceable>your root password</replaceable></userinput>
+Password:<userinput>your root password</userinput>
&prompt.root; <userinput>cd /usr/ports/devel/nasm</userinput>
&prompt.root; <userinput>make install</userinput>
&prompt.root; <userinput>exit</userinput>
@@ -830,8 +792,7 @@ Password:<userinput><replaceable>your root password</replaceable></userinput>
<note>
<para>Wenn es sich bei Ihrem System nicht um FreeBSD
handelt, müssen Sie <application>nasm</application>
- von dessen <ulink
- url="https://sourceforge.net/projects/nasm">Homepage</ulink>
+ von dessen <link xlink:href="https://sourceforge.net/projects/nasm">Homepage</link>
herunterladen. Sie können es aber dennoch verwenden
um FreeBSD code zu assemblieren.</para>
</note>
@@ -848,18 +809,14 @@ Hello, World!
</sect2>
</sect1>
- <sect1 id="x86-unix-filters">
- <sect1info>
+ <sect1 xml:id="x86-unix-filters">
+ <info><title>&unix;-Filter schreiben</title>
<authorgroup>
- <author>
- <firstname>Hagen</firstname>
- <surname>Kühl</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Hagen</firstname><surname>Kühl</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>&unix;-Filter schreiben</title>
+
<para>Ein häufiger Typ von &unix;-Anwendungen ist ein Filter
&mdash; ein Programm, das Eingaben von
@@ -929,8 +886,7 @@ _start:
<para>Um das Byte zu lesen, bitten wir das System ein Byte von
<filename>stdin</filename> zu lesen und speichern es im ersten
Byte von <varname>buffer</varname>. Das System gibt die Anzahl
- an Bytes, die gelesen wurden, in <varname
- role="register">EAX</varname> zurück. Diese wird
+ an Bytes, die gelesen wurden, in <varname role="register">EAX</varname> zurück. Diese wird
<constant>1</constant> sein, wenn eine Eingabe empfangen wird
und <constant>0</constant>, wenn keine Eingabedaten mehr
verfügbar sind. Deshalb überprüfen wir den Wert
@@ -944,12 +900,10 @@ _start:
</note>
<para>Die Umwandlungsroutine in eine Hexadezimalzahl liest das
- Byte aus <varname>buffer</varname> in <varname
- role="register">EAX</varname>, oder genaugenommen nur in
+ Byte aus <varname>buffer</varname> in <varname role="register">EAX</varname>, oder genaugenommen nur in
<varname role="register">AL</varname>, wobei die übrigen
Bits von <varname role="register">EAX</varname> auf null gesetzt
- werden. Außerdem kopieren wir das Byte nach <varname
- role="register">EDX</varname>, da wir die oberen vier Bits
+ werden. Außerdem kopieren wir das Byte nach <varname role="register">EDX</varname>, da wir die oberen vier Bits
(Nibble) getrennt von den unteren vier Bits umwandeln
müssen. Das Ergebnis speichern wir in den ersten beiden
Bytes des Puffers.</para>
@@ -1045,8 +999,7 @@ _start:
push dword 0
sys.exit</programlisting>
- <para>Wir haben das Leerzeichen im Register <varname
- role="register">CL</varname> abgelegt. Das können wir
+ <para>Wir haben das Leerzeichen im Register <varname role="register">CL</varname> abgelegt. Das können wir
bedenkenlos tun, da &unix;-Systemaufrufe im Gegensatz zu denen
von &microsoft.windows; keine Werte von Registern ändern in
denen sie keine Werte zurückliefern.</para>
@@ -1078,18 +1031,14 @@ _start:
in die Ausgabe zu schreiben).</para>
</sect1>
- <sect1 id="x86-buffered-io">
- <sect1info>
+ <sect1 xml:id="x86-buffered-io">
+ <info><title>Gepufferte Eingabe und Ausgabe</title>
<authorgroup>
- <author>
- <firstname>Hagen</firstname>
- <surname>Kühl</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Hagen</firstname><surname>Kühl</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Gepufferte Eingabe und Ausgabe</title>
+
<para>Wir können die Effizienz unseres Codes erhöhen,
indem wir die Ein- und Ausgabe puffern. Wir erzeugen einen
@@ -1206,9 +1155,7 @@ write:
<para>Als dritten Abschnitt im Quelltext haben wir
<varname>.bss</varname>. Dieser Abschnitt wird nicht in unsere
ausführbare Datei eingebunden und kann daher nicht
- initialisiert werden. Wir verwenden <function
- role="opcode">resb</function> anstelle von <function
- role="opcode">db</function>. Dieses reserviert einfach die
+ initialisiert werden. Wir verwenden <function role="opcode">resb</function> anstelle von <function role="opcode">db</function>. Dieses reserviert einfach die
angeforderte Menge an uninitialisiertem Speicher zu unserer
Verwendung.</para>
@@ -1224,8 +1171,7 @@ write:
<para>Wir verwenden <varname role="register">EDI</varname> und
<varname role="register">ESI</varname> als Zeiger auf das
nächste zu lesende oder schreibende Byte. Wir verwenden
- <varname role="register">EBX</varname> und <varname
- role="register">ECX</varname>, um die Anzahl der Bytes in den
+ <varname role="register">EBX</varname> und <varname role="register">ECX</varname>, um die Anzahl der Bytes in den
beiden Puffern zu zählen, damit wir wissen, wann wir die
Ausgabe an das System übergeben, oder neue Eingabe vom
System entgegen nehmen müssen.</para>
@@ -1292,9 +1238,9 @@ _start:
.put:
call putchar
-> cmp al, 0Ah
-> jne .loop
-> call write
+&gt; cmp al, 0Ah
+&gt; jne .loop
+&gt; call write
jmp short .loop
align 4
@@ -1365,12 +1311,11 @@ write:
<note>
<para>Dieser Ansatz für gepufferte Ein- und Ausgabe
- enthält eine Gefahr, auf die ich im Abschnitt <link
- linkend="x86-buffered-dark-side">Die dunkle Seite des
+ enthält eine Gefahr, auf die ich im Abschnitt <link linkend="x86-buffered-dark-side">Die dunkle Seite des
Buffering</link> eingehen werde.</para>
</note>
- <sect2 id="x86-ungetc">
+ <sect2 xml:id="x86-ungetc">
<title>Ein Zeichen ungelesen machen</title>
<warning>
@@ -1424,12 +1369,10 @@ write:
bekommen:</para>
<para>Als erstes überprüfen wir, ob der Puffer leer
- ist, indem wir den Wert von <varname
- role="register">EBX</varname> testen. Wenn er null ist, rufen
+ ist, indem wir den Wert von <varname role="register">EBX</varname> testen. Wenn er null ist, rufen
wir die Prozedur <function>read</function> auf.</para>
- <para>Wenn ein Zeichen bereit ist verwenden wir <function
- role="opcode">lodsb</function>, dann verringern wir den Wert
+ <para>Wenn ein Zeichen bereit ist verwenden wir <function role="opcode">lodsb</function>, dann verringern wir den Wert
von <varname role="register">EBX</varname>. Die Anweisung
<function role="opcode">lodsb</function> ist letztendlich
identisch mit:</para>
@@ -1512,18 +1455,14 @@ write:
</sect2>
</sect1>
- <sect1 id="x86-command-line">
- <sect1info>
+ <sect1 xml:id="x86-command-line">
+ <info><title>Kommandozeilenparameter</title>
<authorgroup>
- <author>
- <firstname>Fabian</firstname>
- <surname>Ruch</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Fabian</firstname><surname>Ruch</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Kommandozeilenparameter</title>
+
<para>Unser <application>hex</application>-Programm wird
nützlicher, wenn es die Dateinamen der Ein- und Ausgabedatei
@@ -1532,8 +1471,7 @@ write:
die?</para>
<para>Bevor ein &unix;-System ein Programm ausführt, legt es
- einige Daten auf dem Stack ab (<function
- role="opcode">push</function>) und springt dann an das
+ einige Daten auf dem Stack ab (<function role="opcode">push</function>) und springt dann an das
<varname>_start</varname>-Label des Programms. Ja, ich sagte
springen, nicht aufrufen. Das bedeutet, dass auf die Daten
zugegriffen werden kann, indem <varname>[esp+offset]</varname>
@@ -1762,8 +1700,7 @@ write:
<para>Wir nehmen <varname>argv[1]</varname> vom Stack und legen
es in <varname role="register">ECX</varname> ab. Dieses Register
- ist besonders für Zeiger geeignet, da wir mit <function
- role="opcode">jecxz</function> NULL-Zeiger verarbeiten
+ ist besonders für Zeiger geeignet, da wir mit <function role="opcode">jecxz</function> NULL-Zeiger verarbeiten
können. Falls <varname>argv[1]</varname> nicht NULL ist,
versuchen wir, die Datei zu öffnen, die der erste Parameter
festlegt. Andernfalls fahren wir mit dem Programm fort wie
@@ -1832,18 +1769,14 @@ write:
durchzuführen.</para>
</sect1>
- <sect1 id="x86-environment">
- <sect1info>
+ <sect1 xml:id="x86-environment">
+ <info><title>Die &unix;-Umgebung</title>
<authorgroup>
- <author>
- <firstname>Fabian</firstname>
- <surname>Ruch</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Fabian</firstname><surname>Ruch</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Die &unix;-Umgebung</title>
+
<para>Ein entscheidendes Konzept hinter &unix; ist die Umgebung,
die durch <emphasis>Umgebungsvariablen</emphasis> festgelegt
@@ -1851,7 +1784,7 @@ write:
wieder andere von der <application>shell</application> oder
irgendeinem Programm, das ein anderes lädt.</para>
- <sect2 id="x86-find-environment">
+ <sect2 xml:id="x86-find-environment">
<title>Umgebungsvariablen herausfinden</title>
<para>Ich sagte vorher, dass wenn ein Programm mit der
@@ -1875,7 +1808,7 @@ write:
Möglichkeit in Betracht ziehen.</para>
</sect2>
- <sect2 id="x86-webvar">
+ <sect2 xml:id="x86-webvar">
<title>webvars</title>
<para>Ich könnte Ihnen einfach etwas Code zeigen, der die
@@ -1884,12 +1817,11 @@ write:
interessanter sei, ein einfaches CGI-Werkzeug in Assembler zu
schreiben.</para>
- <sect3 id="x86-cgi">
+ <sect3 xml:id="x86-cgi">
<title>CGI: Ein kurzer Überblick</title>
- <para>Ich habe eine <ulink
- url="http://www.whizkidtech.redprince.net/cgi-bin/tutorial">detaillierte
- <acronym>CGI</acronym>-Anleitung</ulink> auf meiner Webseite,
+ <para>Ich habe eine <link xlink:href="http://www.whizkidtech.redprince.net/cgi-bin/tutorial">detaillierte
+ <acronym>CGI</acronym>-Anleitung</link> auf meiner Webseite,
aber hier ist ein sehr kurzer Überblick über
<acronym>CGI</acronym>:</para>
@@ -1931,7 +1863,7 @@ write:
</itemizedlist>
</sect3>
- <sect3 id="x86-webvars-the-code">
+ <sect3 xml:id="x86-webvars-the-code">
<title>Der Code</title>
<para>Unser <application>webvars</application>-Programm muss
@@ -2147,34 +2079,25 @@ repne scasb
<para>Schließlich benötigen Sie Ihren Webbrowser,
um sich die Ausgabe anzusehen. Um die Ausgabe auf meinem
- Webserver zu sehen, gehen Sie bitte auf <ulink
- url="http://www.int80h.org/webvars/"><filename>http://www.int80h.org/webvars/</filename></ulink>.
+ Webserver zu sehen, gehen Sie bitte auf <link xlink:href="http://www.int80h.org/webvars/"><filename>http://www.int80h.org/webvars/</filename></link>.
Falls Sie neugierig sind, welche zusätzlichen Variablen
in einem passwortgeschützten Webverzeichnis vorhanden
- sind, gehen Sie auf <ulink
- url="http://www.int80h.org/private/"><filename>http://www.int80h.org/private/</filename></ulink>
+ sind, gehen Sie auf <link xlink:href="http://www.int80h.org/private/"><filename>http://www.int80h.org/private/</filename></link>
unter Benutzung des Benutzernamens <userinput>asm</userinput>
und des Passworts <userinput>programmer</userinput>.</para>
</sect3>
</sect2>
</sect1>
- <sect1 id="x86-files">
- <sect1info>
+ <sect1 xml:id="x86-files">
+ <info><title>Arbeiten mit Dateien</title>
<authorgroup>
- <author>
- <firstname>Paul</firstname>
- <surname>Keller</surname>
- <contrib>Übersetzt von </contrib>
- </author>
- <author>
- <firstname>Fabian</firstname>
- <surname>Borschel</surname>
- </author>
+ <author><personname><firstname>Paul</firstname><surname>Keller</surname></personname><contrib>Übersetzt von </contrib></author>
+ <author><personname><firstname>Fabian</firstname><surname>Borschel</surname></personname></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Arbeiten mit Dateien</title>
+
<para>Wir haben bereits einfache Arbeiten mit Dateien gemacht:
Wir wissen wie wir sie öffnen und schliessen, oder wie
@@ -2190,8 +2113,8 @@ repne scasb
soll.</para>
<para>Eines der ersten Programme die ich für &unix; schrieb
- war <ulink url="ftp://ftp.int80h.org/unix/tuc/"><application>
- tuc</application></ulink>, ein Text-Zu-&unix; Datei Konvertierer.
+ war <link xlink:href="ftp://ftp.int80h.org/unix/tuc/"><application>
+ tuc</application></link>, ein Text-Zu-&unix; Datei Konvertierer.
Es konvertiert eine Text Datei von einem anderen Betriebssystem
zu einer &unix; Text Datei. Mit anderen Worten, es ändert
die verschiedenen Arten von Zeilen Begrenzungen zu der Zeilen
@@ -2206,14 +2129,14 @@ repne scasb
anstatt das ich die Ausgabe in eine andere Datei senden muss.
Meistens, habe ich diesen Befehl verwendet:</para>
- <screen>&prompt.user; <userinput>tuc <replaceable>myfile tempfile</replaceable></userinput>
-&prompt.user; <userinput>mv <replaceable>tempfile myfile</replaceable></userinput></screen>
+ <screen>&prompt.user; <userinput>tuc myfile tempfile</userinput>
+&prompt.user; <userinput>mv tempfile myfile</userinput></screen>
<para>Es wäre schö ein <application>ftuc</application>
zu haben, also, <emphasis>fast tuc</emphasis>, und es so zu
benutzen:</para>
- <screen>&prompt.user; <userinput>ftuc <replaceable>myfile</replaceable></userinput></screen>
+ <screen>&prompt.user; <userinput>ftuc myfile</userinput></screen>
<para>In diesem Kapitel werden wir dann, <application>ftuc
</application> in Assembler schreiben (das Original
@@ -2262,7 +2185,7 @@ repne scasb
Möglichkeiten verwendet. (z.B., Wagenrücklauf gefolgt
von mehreren Zeilenvorschüben).</para>
- <sect2 id="x86-finite-state-machine">
+ <sect2 xml:id="x86-finite-state-machine">
<title>Endlicher Zustandsautomat</title>
<para>Das Problem wird einfach gelöst in dem man eine
@@ -2405,7 +2328,7 @@ repne scasb
</listitem>
</itemizedlist>
- <sect3 id="x86-final-state">
+ <sect3 xml:id="x86-final-state">
<title>Der Endgültige Status</title>
<para>Der obige <emphasis>Endliche Zustandsautomat</emphasis>
@@ -2435,7 +2358,7 @@ repne scasb
</note>
</sect3>
- <sect3 id="x86-tuc-counter">
+ <sect3 xml:id="x86-tuc-counter">
<title>Der Ausgabe Zähler</title>
<para>Weil unser Datei Konvertierungs Programm
@@ -2449,7 +2372,7 @@ repne scasb
</sect3>
</sect2>
- <sect2 id="x86-software-fsm">
+ <sect2 xml:id="x86-software-fsm">
<title>Implementieren von EZ als Software</title>
<para>Der schwerste Teil beim arbeiten mit einer
@@ -2459,8 +2382,7 @@ repne scasb
schreibt sich die Software fast wie von selbst.</para>
<para>In eine höheren Sprache, wie etwa C, gibt es mehrere
- Hauptansätze. Einer wäre ein <function
- role="statement">switch</function> Angabe zu verwenden die
+ Hauptansätze. Einer wäre ein <function role="statement">switch</function> Angabe zu verwenden die
auswählt welche Funktion genutzt werden soll. Zum
Beispiel,</para>
@@ -2496,8 +2418,7 @@ repne scasb
<para>Das ist der Ansatz den wir in unserem Programm verwenden
werden, weil es in Assembler sehr einfach und schnell geht.
- Wir werden einfach die Adresse der Prozedur in <varname
- role="register">EBX</varname> speichern und dann einfach das
+ Wir werden einfach die Adresse der Prozedur in <varname role="register">EBX</varname> speichern und dann einfach das
ausgeben:</para>
<programlisting>
@@ -2512,7 +2433,7 @@ repne scasb
in etwa gleich schnell sind.</para>
</sect2>
- <sect2 id="memory-mapped-files">
+ <sect2 xml:id="memory-mapped-files">
<title>Speicher abgebildete Dateien</title>
<para>Weil unser Programm nur mit einzelnen Dateien
@@ -2523,17 +2444,12 @@ repne scasb
<para>&unix; erlaubt es uns eine Datei, oder einen Bereich einer
Datei, in den Speicher abzubilden. Um das zu tun, müssen
wir zuerst eine Datei mit den entsprechenden Lese/Schreib
- Flags öffnen. Dann benutzen wir den <function
- role="syscall">mmap</function> system call um sie in den
- Speicher abzubilden. Ein Vorteil von <function
- role="syscall">mmap</function> ist, das es automatisch mit
+ Flags öffnen. Dann benutzen wir den <function role="syscall">mmap</function> system call um sie in den
+ Speicher abzubilden. Ein Vorteil von <function role="syscall">mmap</function> ist, das es automatisch mit
virtuellem Speicher arbeitet: Wir können mehr von der
Datei im Speicher abbilden als wir überhaupt
physikalischen Speicher zur Verfügung haben, noch immer
- haben wir aber durch normale OP Codes wie <function
- role="opcode">mov</function>, <function
- role="opcode">lods</function>, und <function
- role="opcode">stos</function> Zugriff darauf. Egal welche
+ haben wir aber durch normale OP Codes wie <function role="opcode">mov</function>, <function role="opcode">lods</function>, und <function role="opcode">stos</function> Zugriff darauf. Egal welche
Änderungen wir an dem Speicherabbild der Datei vornehmen,
sie werden vom System in die Datei geschrieben. Wir
müssen die Datei nicht offen lassen: So lange sie
@@ -2559,10 +2475,8 @@ repne scasb
wirst du zwei verschiedene Systemaufrufe
finden die sich <function role="syscall">mmap</function>
nennen. Das kommt von der Entwicklung von &unix;: Es gab das
- traditionelle <acronym>BSD</acronym> <function
- role="syscall">mmap</function>, Systemaufruf 71. Dieses wurde
- durch das <acronym>&posix;</acronym> <function
- role="syscall">mmap</function> ersetzt, Systemaufruf 197. Das
+ traditionelle <acronym>BSD</acronym> <function role="syscall">mmap</function>, Systemaufruf 71. Dieses wurde
+ durch das <acronym>&posix;</acronym> <function role="syscall">mmap</function> ersetzt, Systemaufruf 197. Das
FreeBSD System unterstützt beide, weil ältere
Programme mit der originalen <acronym>BSD</acronym> Version
geschrieben wurden. Da neue Software die
@@ -2596,15 +2510,14 @@ repne scasb
<function role="syscall">munmap</function> Systemaufruf:</para>
<tip>
- <para>Für eine detailliert Behandlung von <function
- role="syscall">mmap</function>, sieh in W. Richard Stevens'
- <ulink url="http://www.int80h.org/cgi-bin/isbn?isbn=0130810819">
- Unix Network Programming, Volume 2, Chapter 12</ulink>
+ <para>Für eine detailliert Behandlung von <function role="syscall">mmap</function>, sieh in W. Richard Stevens'
+ <link xlink:href="http://www.int80h.org/cgi-bin/isbn?isbn=0130810819">
+ Unix Network Programming, Volume 2, Chapter 12</link>
nach.</para>
</tip>
</sect2>
- <sect2 id="x86-file-size">
+ <sect2 xml:id="x86-file-size">
<title>Feststellen der Datei Grösse</title>
<para>Weil wir <function role="syscall">mmap</function> sagen
@@ -2612,8 +2525,7 @@ repne scasb
wollen und wir außerdem die gesamte Datei abbilden wollen,
müssen wir die Grösse der Datei feststellen.</para>
- <para>Wir können den <function
- role="syscall">fstat</function> Systemaufruf verwenden um alle
+ <para>Wir können den <function role="syscall">fstat</function> Systemaufruf verwenden um alle
Informationen über eine geöffnete Datei zu erhalten
die uns das System geben kann. Das beinhaltet die Datei
Grösse.</para>
@@ -2631,12 +2543,12 @@ repne scasb
<para>Das ist ein sehr unkomplizierter Aufruf: Wir
übergeben ihm die Adresse einer
- <structname>stat</structname> Structure und den Deskriptor
+ <varname remap="structname">stat</varname> Structure und den Deskriptor
einer geöffneten Datei. Es wird den Inhalt der
- <structname>stat</structname> Struktur ausfüllen.</para>
+ <varname remap="structname">stat</varname> Struktur ausfüllen.</para>
<para>Ich muss allerdings sagen, das ich versucht habe die
- <structname>stat</structname> Struktur in dem
+ <varname remap="structname">stat</varname> Struktur in dem
<varname>.bss</varname> Bereich zu deklarieren, und
<function role="syscall">fstat</function> mochte es nicht:
Es setzte das Carry Flag welches einen Fehler anzeigt.
@@ -2644,7 +2556,7 @@ repne scasb
auf dem Stack anlegt, hat alles gut funktioniert.</para>
</sect2>
- <sect2 id="x86-ftruncate">
+ <sect2 xml:id="x86-ftruncate">
<title>Ändern der Dateigrösse</title>
<para>Dadurch das unser Programm
@@ -2655,15 +2567,13 @@ repne scasb
erhalten, müssen wir eventuell die Dateigrösse
anpassen.</para>
- <para>Der Systemaufruf <function
- role="syscall">ftruncate</function> erlaubt uns, dies zu tun.
+ <para>Der Systemaufruf <function role="syscall">ftruncate</function> erlaubt uns, dies zu tun.
Abgesehen von dem etwas unglücklich gewählten Namen
<function role="syscall">ftruncate</function> können wir
mit dieser Funktion eine Datei vergrössern, oder
verkleinern.</para>
- <para>Und ja, wir werden zwei Versionen von <function
- role="syscall">ftruncate</function> in
+ <para>Und ja, wir werden zwei Versionen von <function role="syscall">ftruncate</function> in
<filename>syscalls.master</filename> finden, eine ältere
(130) und eine neuere (201). Wir werden die neuere Version
verwenden:</para>
@@ -2676,7 +2586,7 @@ repne scasb
pad</varname> verwendet wird.</para>
</sect2>
- <sect2 id="x86-ftuc">
+ <sect2 xml:id="x86-ftuc">
<title>ftuc</title>
<para>Wir wissen jetzt alles nötige, um
@@ -3011,18 +2921,14 @@ align 4
</sect2>
</sect1>
- <sect1 id="x86-one-pointed-mind">
- <sect1info>
+ <sect1 xml:id="x86-one-pointed-mind">
+ <info><title>One-Pointed Mind</title>
<authorgroup>
- <author>
- <firstname>Daniel</firstname>
- <surname>Seuffert</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Daniel</firstname><surname>Seuffert</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>One-Pointed Mind</title>
+
<para>Als ein Zen-Schüler liebe ich die Idee eines
fokussierten Bewußtseins: Tu nur ein Ding zur gleichen
@@ -3047,7 +2953,7 @@ align 4
werden kann. Man schreibt nur die Programme selbst, für die
keine vorhandene Lösung existiert.</para>
- <sect2 id="x86-csv">
+ <sect2 xml:id="x86-csv">
<title>CSV</title>
<para>Ich will dieses Prinzip an einem besonderen Beispiel
@@ -3172,7 +3078,7 @@ align 4
<para>Um das elfte Feld jeden Datensatzes zu erhalten kann ich
nun folgendes eingeben:</para>
- <screen>&prompt.user; <userinput>csv '-t;' <replaceable>data.csv</replaceable> | awk '-F;' '{print $11}'</userinput></screen>
+ <screen>&prompt.user; <userinput>csv '-t;' data.csv | awk '-F;' '{print $11}'</userinput></screen>
<para>Der Code speichert die Optionen (bis auf die
Dateideskriptoren) in <varname role="register">EDX</varname>:
@@ -3479,7 +3385,7 @@ write:
Eingabepuffer leer ist, dann leert es seine Ausgabe und liest
die nächste Zeile.</para>
- <sect3 id="x86-buffered-dark-side">
+ <sect3 xml:id="x86-buffered-dark-side">
<title>Die dunkle Seite des Buffering</title>
<para>Diese Änderung verhindert einen mysteriösen
@@ -3607,18 +3513,14 @@ write:
</sect2>
</sect1>
- <sect1 id="x86-fpu">
- <sect1info>
+ <sect1 xml:id="x86-fpu">
+ <info><title>Die <acronym>FPU</acronym> verwenden</title>
<authorgroup>
- <author>
- <firstname>Fabian</firstname>
- <surname>Borschel</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Fabian</firstname><surname>Borschel</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Die <acronym>FPU</acronym> verwenden</title>
+
<para>Seltsamerweise erwähnt die meiste Literatur zu
Assemblersprachen nicht einmal die Existenz der
@@ -3632,7 +3534,7 @@ write:
<emphasis>nur</emphasis> mit einer Assemblersprache realisiert
werden kann, ihre große Stärke ausspielen.</para>
- <sect2 id="x86-fpu-organization">
+ <sect2 xml:id="x86-fpu-organization">
<title>Organisation der <acronym>FPU</acronym></title>
<para>Die <acronym>FPU</acronym> besteht aus 8 80&ndash;bit
@@ -3650,19 +3552,14 @@ write:
<para>Sie können mit einen Wert auf dem
<acronym>TOS</acronym> ablegen, indem Sie
- <function role="opcode">fld</function>, <function
- role="opcode">fild</function>, und <function
- role="opcode">fbld</function> verwenden. Mit weiteren op-Codes
+ <function role="opcode">fld</function>, <function role="opcode">fild</function>, und <function role="opcode">fbld</function> verwenden. Mit weiteren op-Codes
lassen sich <emphasis>Konstanten</emphasis>&mdash;wie z.B.
<emphasis>Pi</emphasis>&mdash;auf dem <acronym>TOS</acronym>
ablegen.</para>
<para>Analog dazu können Sie einen Wert
holen, indem Sie <function role="opcode">fst</function>,
- <function role="opcode">fstp</function>, <function
- role="opcode">fist</function>, <function
- role="opcode">fistp</function>, und <function
- role="opcode">fbstp</function> verwenden. Eigentlich
+ <function role="opcode">fstp</function>, <function role="opcode">fist</function>, <function role="opcode">fistp</function>, und <function role="opcode">fbstp</function> verwenden. Eigentlich
holen (<function>pop</function>) nur die op-Codes, die auf
<emphasis>p</emphasis> enden, einen Wert, während die
anderen den Wert irgendwo speichern (<function>store</function>)
@@ -3711,25 +3608,19 @@ write:
Register mit sich selbst.</para>
<para>Der offizielle Intel op-Code für den
- <acronym>TOS</acronym> ist <varname
- role="register">st</varname> und für die
- <emphasis>Register</emphasis> <varname
- role="register">st(0)</varname>&ndash; <varname
- role="register">st(7)</varname>. <varname
- role="register">st</varname> und <varname
- role="register">st(0)</varname> beziehen sich dabei auf das
+ <acronym>TOS</acronym> ist <varname role="register">st</varname> und für die
+ <emphasis>Register</emphasis> <varname role="register">st(0)</varname>&ndash; <varname role="register">st(7)</varname>. <varname role="register">st</varname> und <varname role="register">st(0)</varname> beziehen sich dabei auf das
gleiche Register.</para>
<para>Aus welchen Gründen auch immer hat sich der
Originalautor von <application>nasm</application> dafür
entschieden, andere op-Codes zu verwenden, nämlich
- <varname role="register">st0</varname>&ndash; <varname
- role="register">st7</varname>. Mit anderen Worten, es gibt
+ <varname role="register">st0</varname>&ndash; <varname role="register">st7</varname>. Mit anderen Worten, es gibt
keine Klammern, und der <acronym>TOS</acronym> ist immer
<varname role="register">st0</varname>, niemals einfach nur
<function role="opcode">st</function>.</para>
- <sect3 id="x86-fpu-packed-decimal">
+ <sect3 xml:id="x86-fpu-packed-decimal">
<title>Das Packed Decimal-Format</title>
<para>Das <emphasis>packed decimal</emphasis>-Format verwendet
@@ -3779,9 +3670,8 @@ write:
<note>
<para>Das lesenswerte Buch&mdash;falls Sie es finden
- können&mdash;ist Richard Startz' <ulink
- url="http://www.int80h.org/cgi-bin/isbn?isbn=013246604X">
- 8087/80287/80387 for the IBM PC &amp; Compatibles</ulink>.
+ können&mdash;ist Richard Startz' <link xlink:href="http://www.int80h.org/cgi-bin/isbn?isbn=013246604X">
+ 8087/80287/80387 for the IBM PC &amp; Compatibles</link>.
Obwohl es anscheinend die Speicherung der <emphasis>packed
decimal</emphasis> im little&ndash;endian-Format für
gegeben annimmt. Ich mache keine Witze über meine
@@ -3794,7 +3684,7 @@ write:
</sect3>
</sect2>
- <sect2 id="x86-pinhole-photography">
+ <sect2 xml:id="x86-pinhole-photography">
<title>Ausflug in die Lochblendenphotographie</title>
<para>Um sinnvolle Programme zu schreiben, müssen wir nicht
@@ -3807,7 +3697,7 @@ write:
die <emphasis>Lochblendenphotographie</emphasis>, bevor wir
weiter machen können.</para>
- <sect3 id="x86-camera">
+ <sect3 xml:id="x86-camera">
<title>Die Kamera</title>
<para>Die einfachste Form, eine Kamera zu beschreiben, ist
@@ -3834,7 +3724,7 @@ write:
genannt.</para>
</sect3>
- <sect3 id="x86-the-pinhole">
+ <sect3 xml:id="x86-the-pinhole">
<title>Die Lochblende</title>
<para>Streng genommen ist die Linse nicht notwendig: Die
@@ -3852,7 +3742,7 @@ write:
Bild seine Schärfe.</para>
</sect3>
- <sect3 id="x86-focal-length">
+ <sect3 xml:id="x86-focal-length">
<title>Brennweite</title>
<para>Dieser ideale Lochblendendurchmesser ist eine Funktion
@@ -3874,7 +3764,7 @@ write:
durch Experimente bestimmt werden können.</para>
</sect3>
- <sect3 id="x86-f-number">
+ <sect3 xml:id="x86-f-number">
<title>Der f&ndash;Wert</title>
<para>Der f&ndash;Wert ist eine sehr nützliche
@@ -3913,7 +3803,7 @@ write:
<programlisting> t * (B / A)&#178;</programlisting>
</sect3>
- <sect3 id="x86-normalized-f-number">
+ <sect3 xml:id="x86-normalized-f-number">
<title>Normalisierte f&ndash;Werte</title>
<para>Während heutige moderne Kameras den Durchmesser
@@ -3940,7 +3830,7 @@ write:
manche Werte gerundet wurden.</para>
</sect3>
- <sect3 id="x86-f-stop">
+ <sect3 xml:id="x86-f-stop">
<title>Der f&ndash;Stopp</title>
<para>Eine typische Kamera ist so konzipiert, daß die
@@ -3958,13 +3848,13 @@ write:
</sect3>
</sect2>
- <sect2 id="x86-pinhole-software">
+ <sect2 xml:id="x86-pinhole-software">
<title>Entwurf der Lochblenden-Software</title>
<para>Wir können jetzt festlegen, was genau unsere
Lochblenden-Software tun soll.</para>
- <sect3 id="xpinhole-processing-input">
+ <sect3 xml:id="xpinhole-processing-input">
<title>Verarbeitung der Programmeingaben</title>
<para>Da der Hauptzweck des Programms darin besteht, uns
@@ -4081,7 +3971,7 @@ Syntax error: beste</screen>
Entscheidungen treffen.</para>
</sect3>
- <sect3 id="x86-pinhole-options">
+ <sect3 xml:id="x86-pinhole-options">
<title>Optionen anbieten</title>
<para>Das wichtigste, was wir zum Bau einer Lochkamera
@@ -4238,7 +4128,7 @@ Syntax error: beste</screen>
<parameter>-p037</parameter> interpretieren.</para>
</sect3>
- <sect3 id="x86-pinhole-output">
+ <sect3 xml:id="x86-pinhole-output">
<title>Die Ausgabe</title>
<para>Wir müssen festlegen, was und in welchem Format
@@ -4597,13 +4487,10 @@ Syntax error: beste</screen>
Stack lassen.) <varname role="register">st(1)</varname>
enthält die <constant>1</constant>.</para>
- <para>Im nächsten Schritt, <function
- role="opcode">fyl2x</function>, wird der Logarithmus von
+ <para>Im nächsten Schritt, <function role="opcode">fyl2x</function>, wird der Logarithmus von
<varname role="register">st</varname> zur Basis 2 berechnet,
- und anschließend mit <varname
- role="register">st(1)</varname> multipliziert. Deshalb haben
- wir vorher die <constant>1</constant> in <varname
- role="register">st(1)</varname> abgelegt.</para>
+ und anschließend mit <varname role="register">st(1)</varname> multipliziert. Deshalb haben
+ wir vorher die <constant>1</constant> in <varname role="register">st(1)</varname> abgelegt.</para>
<para>An dieser Stelle enthält
<varname role="register">st</varname> den gerade berechneten
@@ -4629,12 +4516,9 @@ Syntax error: beste</screen>
<para>Wir haben nun den nächstliegenden, normalisierten
f&ndash;Wert auf dem <acronym>TOS</acronym> liegen, den auf
den Logarithmus zur Basis 2 gerundeten, nächstliegenden
- ganzzahligen Wert in <varname
- role="register">st(1)</varname>, und das Quadrat des
- aktuellen f&ndash;Wertes in <varname
- role="register">st(2)</varname>. Wir speichern den Wert
- für eine spätere Verwendung in <varname
- role="register">st(2)</varname>.</para>
+ ganzzahligen Wert in <varname role="register">st(1)</varname>, und das Quadrat des
+ aktuellen f&ndash;Wertes in <varname role="register">st(2)</varname>. Wir speichern den Wert
+ für eine spätere Verwendung in <varname role="register">st(2)</varname>.</para>
<para>Aber wir brauchen den Inhalt von
<varname role="register">st(1)</varname> gar nicht mehr. Die
@@ -4762,7 +4646,7 @@ Syntax error: beste</screen>
</sect3>
</sect2>
- <sect2 id="x86-fpu-optimizations">
+ <sect2 xml:id="x86-fpu-optimizations">
<title>FPU Optimierungen</title>
<para>In Assemblersprache können wir den Code für die
@@ -4903,7 +4787,7 @@ Syntax error: beste</screen>
</tip>
</sect2>
- <sect2 id="x86-pinhole-the-code">
+ <sect2 xml:id="x86-pinhole-the-code">
<title><application>pinhole</application>&mdash;Der Code</title>
<programlisting>
@@ -5741,7 +5625,7 @@ printnumber:
da.</para>
</sect2>
- <sect2 id="x86-pinhole-using">
+ <sect2 xml:id="x86-pinhole-using">
<title>Das Programm <application>pinhole</application>
verwenden</title>
@@ -5796,7 +5680,7 @@ von 150 sein?</userinput>
bekommen.</para>
</sect2>
- <sect2 id="x86-pinhole-scripting">
+ <sect2 xml:id="x86-pinhole-scripting">
<title>Skripte schreiben</title>
<para>Da wir uns dafür entschieden haben, das Zeichen
@@ -5921,18 +5805,14 @@ focal length in millimeters,pinhole diameter in microns,F-number,normalized F-nu
</sect2>
</sect1>
- <sect1 id="x86-caveats">
- <sect1info>
+ <sect1 xml:id="x86-caveats">
+ <info><title>Vorsichtsmassnahmen</title>
<authorgroup>
- <author>
- <firstname>Daniel</firstname>
- <surname>Seuffert</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Daniel</firstname><surname>Seuffert</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Vorsichtsmassnahmen</title>
+
<para>Assembler-Programmierer, die aufwuchsen mit
<acronym>&ms-dos;</acronym> und windows &windows; neigen oft
@@ -5956,7 +5836,7 @@ focal length in millimeters,pinhole diameter in microns,F-number,normalized F-nu
Idee</emphasis> in einer &unix;-Umgebung! Lassen Sie mich
erklären warum.</para>
- <sect2 id="x86-protected">
+ <sect2 xml:id="x86-protected">
<title>&unix; ist geschützt</title>
<para>Zum Einen mag es schlicht nicht möglich sein.
@@ -5971,7 +5851,7 @@ focal length in millimeters,pinhole diameter in microns,F-number,normalized F-nu
Dinosaurier werden.</para>
</sect2>
- <sect2 id="x86-abstraction">
+ <sect2 xml:id="x86-abstraction">
<title>&unix; ist eine Abstraktion</title>
<para>Aber es gibt einen viel wichtigeren Grund, weshalb Sie
@@ -6062,18 +5942,14 @@ focal length in millimeters,pinhole diameter in microns,F-number,normalized F-nu
</sect2>
</sect1>
- <sect1 id="x86-acknowledgements">
- <sect1info>
+ <sect1 xml:id="x86-acknowledgements">
+ <info><title>Danksagungen</title>
<authorgroup>
- <author>
- <firstname>Daniel</firstname>
- <surname>Seuffert</surname>
- <contrib>Übersetzt von </contrib>
- </author>
+ <author><personname><firstname>Daniel</firstname><surname>Seuffert</surname></personname><contrib>Übersetzt von </contrib></author>
</authorgroup>
- </sect1info>
+ </info>
- <title>Danksagungen</title>
+
<para>Dieses Handbuch wäre niemals möglich gewesen
ohne die Hilfe vieler erfahrener FreeBSD-Programmierer aus
@@ -6084,9 +5960,8 @@ focal length in millimeters,pinhole diameter in microns,F-number,normalized F-nu
FreeBSD im Besonderen.</para>
<para>Thomas M. Sommers öffnete die Türen für
- mich. Seine <ulink
- url="http://www.codebreakers-journal.com/content/view/262/27/">Wie
- schreibe ich "Hallo Welt" in FreeBSD-Assembler?</ulink> Webseite
+ mich. Seine <link xlink:href="http://www.codebreakers-journal.com/content/view/262/27/">Wie
+ schreibe ich "Hallo Welt" in FreeBSD-Assembler?</link> Webseite
war mein erster Kontakt mit Assembler-Programmierung unter
FreeBSD.</para>