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

230 lines
8.9 KiB
HTML

<HTML>
<HEAD>
<TITLE>MMX Erweiterung -- Register, Datentypen und Befehle</TITLE>
<SCRIPT LANGUAGE="Javascript">
<!-- Test Browser Version
// Javascript written 1998 by Jens Hohmuth (Script-Version: 3.0)
// (c) Copyright 1998 by Jens Hohmuth@fh-zwickau.de. All rights reserved.
var browserok= 0;
var version= parseInt( navigator.appVersion );
if( version >= 3 ) browserok= 1;
if( document.images ) browserok= 1;
if( browserok )
{
var imgdata_touched = new Array();
var imgdata_released= new Array();
}
// load imagedata
function precache( name, pic1, pic2 )
{
if( browserok )
{
imgdata_touched [ name ]= new Image();
imgdata_touched [ name ].src= pic2;
imgdata_released[ name ]= new Image();
imgdata_released[ name ].src= pic1;
}
}
// "Release", called if mouse left button
function release( name )
{
if( browserok )
{
document.images[ name ].src= imgdata_released[ name ].src;
}
}
// "Touch", called if mouse over link-button
function touch( name )
{
if( browserok )
{
document.images[ name ].src= imgdata_touched[ name ].src;
}
}
// load (precache) Buttons
if( browserok )
{
precache( "left", "../images/arrowl.gif", "../images/arrowlp.gif" );
precache( "right", "../images/arrowr.gif", "../images/arrowrp.gif" );
precache( "index", "../images/index.gif", "../images/indexp.gif" );
}
//-->
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#C0C0C0" BACKGROUND="../images/stone.jpg">
<H1><FONT COLOR="#800000">2 Register, Datentypen und Befehle der
MMX-Erweiterung</FONT></H1>
<A NAME="Neue Register"><H2><FONT COLOR="#000080">Neue (?) Register</FONT></H2></A>
<P>Ein MMX-Prozessor stellt 8 neue Register zur Verf&uuml;gung. Diese
Register sind frei verf&uuml;gbar und werden als MM0 bis MM7 angesprochen.
Die Register sind jeweils 64-Bit breit und k&ouml;nnen ausschlie&szlig;lich
zur Speicherung und Bearbeitung von Daten verwendet werden. Eine
Speicheradressierung mit Hilfe der MMX-Register ist nicht m&ouml;glich. Die
MMX-Register sind in Abbildung 1 prinzipiell dargestellt.</P>
<CENTER>
<P>
<IMG SRC="../images/mmx_1.gif" ALT="MMX-Register" BORDER=3>
<BR>
<I><B>Abb. 1:</B> MMX-Register</I>
</P>
</CENTER>
<P>Dabei mu&szlig; beachtet werden, da&szlig; die MMX-Register den Flie&szligkomma-
Registern entsprechen ! Wird ein MMX-Register mit einem Wert beschrieben, so
wird der Inhalt im 64-Bit breiten Mantisse-Feld des entsprechenden
Flie&szlig;komma-Registers gespeichert. Alle Exponenten-Bits werden dabei auf
den Wert 1 gesetzt. Auf &auml;hnliche Weise wirken sich Schreibzugriffe auf
Flie&szlig;komma-Register auf die MMX-Register aus. Jeder Zugriff auf ein
MMX-Register setzt zus&auml;tzlich den Wert TOS (Top of Stack) auf 0 zur&uuml;ck.</P>
<P>Eine Vermischung von Flie&szlig;komma- und MMX-Befehlen ist aus diesem Grund
nicht m&ouml;glich bzw. setzt eine besondere Aufteilung von MMX- und
Flie&szlig;kommabefehlen voraus. Weiterhin sollten MMX-Routinen mit dem Befehl EMMS
(Empty MMX State) beendet werden, wenn andere Module eventuell Flie&szlig;komma-
Operationen durchf&uuml;hren. Durch den EMMS-Befehl werden die Flie&szlig;komma-
Register als nicht belegt gekennzeichnet und k&ouml;nnen damit von
Flie&szlig;komma-Befehlen genutzt werden. Wird EMMS nicht benutzt, kann eine
Exception die Folge sein, wenn der Prozessor versucht, auf die
Flie&szlig;komma-Register zuzugreifen (diese wurden ja bereits mit MMX-Werten belegt).</P>
<P>Die Umschaltungen zwischen MMX- und Flie&szlig;komma-Befehlen sollten
jedoch m&ouml;glichst gering gehalten werden, da eine solche Umschaltung bis
zu 50 Taktzyklen ben&ouml;tigen kann.</P>
<P>Der Vorteil der Alias-Bildung zwischen MMX- und Flie&szlig;kommabefehlen
besteht darin, da&szlig; f&uuml;r die Nutzung von MMX-Befehlen kein neuer
Prozessorstatus eingef&uuml;hrt werden mu&szlig;te. Dadurch ist es z.B.
m&ouml;glich, Programme, die unter einem pre-emptiven Betriebsystem ablaufen,
ohne zus&auml;tzliche &Auml;nderungen mit MMX-Befehlen auszustatten. Die
&quot;Rettung&quot; der MMX-Registerinhalte kann dann, im Falle eines
Taskwechsels, von den gleichen Mechanismen &uuml;bernommen werden, wie die
Sicherung von Flie&szlig;komma-Registerinhalten.</P>
<A NAME="Neue Datentypen"><H2><FONT COLOR="#000080">Neue Datentypen</FONT></H2></A>
<P>Die sogenannten &quot;Gepackten-Daten&quot; wurden mit der MMX-Erweiterung
eingef&uuml;hrt. Dabei k&ouml;nnen MMX-Befehle mit acht Byte, vier Word oder
zwei Doubleword operieren, die in einem 64-Bit breiten MMX-Register gespeichert
sind. Diese 64-Bit werden dann als &quot;Gepackte-Daten&quot; bezeichnet.
Abbildung 2 veranschaulicht die m&ouml;glichen Aufteilungen eines 64 Bit-breiten
Wertes.</P>
<CENTER>
<P>
<IMG SRC="../images/mmx_2.gif" ALT="Gepackte Daten" BORDER=3>
<BR>
<I><B>Abb. 2:</B> Gepackte Daten</I>
</P>
</CENTER>
<P>Auf welche Daten (Byte, Word oder Doubleword) ein MMX-Befehl letztendlich
Operationen ausf&uuml;hrt, wird durch den MMX-Befehlsnamen festgelegt. Ebenfalls
durch den Befehlsnamen wird festgelegt, wie das h&ouml;chstwertigste Bit (MSB -
most significant bit) der einzelnen &quot;gepackten&quot; Daten interpretiert
werden soll. So kann zwischen vorzeichenbehafteten und vorzeichenlosen Daten
unterschieden werden.</P>
<P>Diese Unterscheidung ist auch f&uuml;r eine weitere Eigenschaft der MMX-
Befehle von Bedeutung, der sogenannten &quot;Saturation&quot;. Dadurch kann,
wie weiter oben bereits festgestellt wurde, der Wertebereich der einzelnen
&quot;gepackten&quot; Daten im Falle eines &Uuml;berlaufs auf das Maximum
(bzw. Minimum) beschr&auml;nkt werden. Diese Eigenschaft wird ebenfalls durch
den Namen des Befehls festgelegt (durch ein Befehlsuffix). Das folgende Beispiel
soll die &quot;Saturation&quot;-Thematik verdeutlichen.</P>
<CENTER>
<TABLE BORDER="0" WIDTH="100%">
<TR ALIGN="CENTER" VALIGN="CENTER">
<TD ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#FF0000">
<IMG SRC="../images/bred.gif" ALT="Beispiel" BORDER=0>
</TD>
<TD ALIGN="LEFT" VALIGN="TOP" WIDTH="99%">
<P>Gegeben ist der folgende 64-Bit Wert.</P>
<FONT COLOR="#0000FF"><PRE> FDCE365310DDC3A2h</PRE></FONT>
<P>Wird dieser Wert als Byte-gepackter Datentyp interpretiert, so ergibt sich
folgende Bytefolge (alle Werte hexadezimal, 1 Quadword= 64 Bit= 8 Byte):</P>
<FONT COLOR="#0000FF"><PRE> FD CE 36 53 10 DD C3 A2</PRE></FONT>
<P>Die einzelnen Bytes sollen als vorzeichenlose Werte betrachtet werden. Zu
jedem Byte wird der Wert 20h addiert. Ohne &quot;Saturation&quot; ergibt sich
das folgende Ergebnis (alle Werte hexadezimal).</P>
<FONT COLOR="#0000FF"><PRE> FD CE 36 53 10 E4 C3 A2
+ 20 20 20 20 20 20 20 20
-----------------------
1D EE 56 73 30 04 E3 C2</PRE></FONT>
<P>In diesem Beispiel w&uuml;rden das 1. und 6. Byte den Wertebereich verlassen
und nicht das korrekte Ergebnis liefern. Der &quot;&Uuml;berlauf&quot; der
Addition f&uuml;hrt zu den falschen Werten 1Dh und 04h.</P>
<P>Mit &quot;Saturation&quot; wird die Addition wie folgt ausgef&uuml;hrt.</P>
<FONT COLOR="#0000FF"><PRE> FD CE 36 53 10 E4 C3 A2
+ 20 20 20 20 20 20 20 20
-----------------------
FF EE 56 73 30 FF E3 C2</PRE></FONT>
<P>Die Bytes 1. und 6. werden jetzt auf ihre maximalen Werte (= 0FFh)
beschr&auml;nkt.</P>
<P>Nat&uuml;rlich ist eine solche &Uuml;berpr&uuml;fung des Wertebereiches auch
ohne die MMX-Erweiterung denkbar, nur kann sie ein Prozessor mit MMX gleichzeitig
mit allen gepackten Daten und noch dazu in nur einem einzigen Befehl ausf&uuml;hren.
Die MMX-Erweiterung kann deshalb in diesen F&auml;llen effizienter arbeiten.</P>
</TD>
</TR>
</TABLE>
</CENTER>
<P>Wie zwischen den unterschiedlichen Befehlsarten (vorzeichenlos/vorzeichenbehaftet,
Saturation benutzen/nicht benutzen) unterschieden wird, soll als n&auml;chstes
betrachtet werden.</P>
<!-- wie gehts weiter ------------------------------------------------------>
<P><HR SIZE=2></P>
<A HREF="mmx_1.htm" onMouseOver="touch( 'left' );" onMouseOut="release( 'left' );">
<IMG SRC="../images/arrowl.gif" NAME="left" ALT="zurueck" BORDER=0 ALIGN=LEFT></A>
<A HREF="mmx_3.htm" onMouseOver="touch( 'right' );" onMouseOut="release( 'right' );">
<IMG SRC="../images/arrowr.gif" NAME="right" ALT="weiter" BORDER=0 ALIGN=RIGHT></A>
<CENTER>
<A HREF="index.htm#Register" onMouseOver="touch( 'index' );" onMouseOut="release( 'index' );">
<IMG SRC = "../images/index.gif" NAME="index" ALT="Zum Index" BORDER=0></A>
</CENTER>
<BR>
<!-- Adresse --------------------------------------------------------------->
<HR SIZE=2>
<ADDRESS>
Probleme oder Vorschl&auml;ge zu dieser Webseite, bitte per email an:
<A HREF="mailto:hohmuth@t-online.de">
<B>hohmuth@t-online.de</B>
</A>
<BR>
Letzte &Auml;nderungen am: 02.01.1999, Jens Hohmuth.
</ADDRESS>
</BODY>
</HTML>