
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
> Danke, hat geklappt. Aber verstehen tu ichs nicht...... > woher weiss "data" das es mit dem befehl "shl 1" grade "databit" von rechts > nach links einschieben soll??!! das ist erklärbär :-) das war eine absichtliche doppeldefinition. du hast 24 (offizielle) bytes als RAM. das sind (auch) 12 words oder 192 bit. bei der definition dieser befehiehlst du dem compiler, die namen adressen zuzuordnen, denn was andres versteht der kontroller ja nicht wirklich. der compiler geht dabei so vor, dass er words grundsätzlich an "ungeradzahligen" bytes ausrichtet. deshalb kann, soll und muss man bei CCBasic stehts zuerst die words und dann die bytes definieren, wenn man keine lust hat, mit deren ordnungszahlen in konflikt zu geraten und speicherplatz zu verschenken. allerdings kann man genau damit - wenn das mal nötig ist - eine absichtliche doppel- oder mehrfachdefinition erreichen. dazu beispiele: define a byte define b word müsste eigentlich 3 byte variablenspeicher verbrauchen. machts aber nicht weil: a ist byte[1] und das word kann erst an byte[3] angelegt werden. es ist damit word[2] und belegt byte[3+4]. das byte[2] bleibt leer und unbenutzt, es sei denn, man definiert es irgendwo noch mal explizit mit seiner ordnungszahl. so sollte man es also nicht machen. andres beispiel: define c word define b byte[2] define c bit[9] jetzt solltest du bereits erkannt haben, was hier passiert: obwohl 3 variablen definiert wurden, benötigt diese definition nur exakt 2 byte speicher. warum? weil byte[2] im bereich des words liegt und das bit ebenfalls, denn das word belegt bit[1...16]. physikalisch ist das bit[9] ja eigegtnlich bit 0 des byte[2], dazu komme ich aber weiter unten. man kann also problemlos überlappende speicherbereiche mehrfach definieren. bei der definition von bits ist die angabe der ordnungzahl übrigens pflicht! es versteht sich von selbst, dass ich, wenn ich dann den inhalt einer variable verändere - und wenn es auch nur ein bit ist, somit der inhalt aller variablen der betreffenden speicherzelle ein anderer ist. so, zurück zum schieberegister: define a byte define b bit[1] im speicher sieht das byte so aus: 7 6 5 4 3 2 1 <b>0</b> zu beachten dabei: auch wenn der basic-compiler bits von 1 bis 192 definiert wissen will: bits werden in der hardware immer von 0 an gezählt und words kennt die hardware praktisch gar nicht. ein byte liegt dabei seitenverkehrt, das heißt: die niederwertigste stelle liegt wie beim taschenrechner rechts. die dicke null markiert den punkt des magischen data_bit. dieses wird also in abhängigkeit des portstatus gesetzt. der aufruft der funktion SHift Left macht die variable selbst zum operanden. damit wandert ihr ihnhalt in einen rechenpuffer und wird durch eine systemroutine behandelt, wobei ihr das ergebnis am schluss der operation wieder übergeben wird. man muss sich also nicht darum kümmern, das macht das system. mit SHL (oder SHR) wird das gesamte(!) bitmuster, das sich in der speicherzelle befindet, geschoben. prinzipiell ist das übrigens eine multiplikation (oder division) mit 2. ich hoffe, das war einigermassen bildlich beschrieben. für manche ist es schwer, in bits und bytes zu denken und sich das zu nutze zu machen. aber das kommt mit der zeit :-) mit dem wissen wird keiner geboren und der CControl ist das optimale spielding, es zu lernen. |
| Antwort schreiben |