diff options
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.xml | 529 |
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 — 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 µsoft.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 +> cmp al, 0Ah +> jne .loop +> 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–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>—wie z.B. <emphasis>Pi</emphasis>—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>– <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>– <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>– <varname - role="register">st7</varname>. Mit anderen Worten, es gibt + <varname role="register">st0</varname>– <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—falls Sie es finden - können—ist Richard Startz' <ulink - url="http://www.int80h.org/cgi-bin/isbn?isbn=013246604X"> - 8087/80287/80387 for the IBM PC & Compatibles</ulink>. + können—ist Richard Startz' <link xlink:href="http://www.int80h.org/cgi-bin/isbn?isbn=013246604X"> + 8087/80287/80387 for the IBM PC & Compatibles</link>. Obwohl es anscheinend die Speicherung der <emphasis>packed decimal</emphasis> im little–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–Wert</title> <para>Der f–Wert ist eine sehr nützliche @@ -3913,7 +3803,7 @@ write: <programlisting> t * (B / A)²</programlisting> </sect3> - <sect3 id="x86-normalized-f-number"> + <sect3 xml:id="x86-normalized-f-number"> <title>Normalisierte f–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–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–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–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–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>—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> |