Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: rotate von Variablen Kategorie: Programmierung (von André H. - 4.01.2005 15:48)
Als Antwort auf rotate von Variablen von Günni - 3.01.2005 17:14

Hallo Günni,

> hat Jemand zufällig eine Library/Funktion zum rotieren von Variablen. Also z.B. rechts raus und links
> dafür rein.
> Ich meine nicht die Funktionen shl und shr, denn dabei gehen die zu schiebenden Bits ja verloren.

Eigentlich sollte das OS dies beherschen.
Es gibt nämlich die VM-Codes VM_ROR und VM_ROL. (siehe vmcodes.c2)
Jedoch habe ich nach einem Teast feststellen müssen, da� dies alles andere machen,
nur nicht rotieren. ;-(
Entweder das ROL und ROR bedeutet hier etwas anderes, was auch immer,
oder hier im OS wurde Kaudawelsch programmiert.
Ich würde auch letzteres tippen. Denn ein VM-Code für ASHR gibt es auch. (VM_ASR)
Und dieser funzt.
Aber leider ist dies alles in der Programmiersprache C2 nicht implementiert, sodaÃ?
man hier dies über eine Inline-Funktion implementieren mu�:
inline function ashr_int(int value, int shift) returns int
{// für Integer
 inline vmcodes.VM_ASR;
}

inline function ashr_long(int value, int shift) returns int
{// für Long
 inline vmcodes.VM_ASR or (vmcodes.CALC_LONG_INT shl 8);
}


Aber das hilft Dir für ROL und ROR wenig.
Bevor ich bei OSOPT V3.1 diese Routinen anpasse, muÃ? ich erst sicherstellen,
da� die Routinen auch wirklich für "Rotate" gedacht waren.
OS-Routine für VM_ROL, CALC_INT_ INT: (was die Routine auch immer in Wirklichkeit macht)

0x59e4:  MOV     [-R0],R9
0x59e6:  MOV     [-R0],R8
0x59e8:  CALLS   0x765a ;POP
0x59ec:  MOV     R9,R4
0x59ee:  CALLS   0x765a ;POP
0x59f2:  MOV     R8,R4
0x59f4:  MOV     R12,R8
0x59f6:  SHL     R12,R9
0x59f8:  CMP     R8,#0x0
0x59fa:  JMPR    cc_SGE,0x5a00
0x59fc:  MOV     R8,#0x1
0x59fe:  JMPR    cc_UC,0x5a02
0x5a00:  MOV     R8,#0x0
0x5a02:  OR      R12,R8
0x5a04:  JMPR    cc_Z,0x5a0a
0x5a06:  MOV     R12,#0x1
0x5a08:  JMPR    cc_UC,0x5a0c
0x5a0a:  MOV     R12,#0x0
0x5a0c:  CALLS   0x75d6 ;PUSH
0x5a10:  MOV     R8,[R0+]
0x5a12:  MOV     R9,[R0+]
0x5a14:  RETS



So nun aber zur "eleganten" Lösung diese Problems:

Du kannst dies sehr bequem über eine kleine ASM-Routine lösen.
Da diese unter der Stringgrenze von 30 Byte bleibt, kann man die
Routine sehr einfach im RAM ablaufen lassen:
string ASM_ROR,ASM_ROL;

inline function call_asm(int value, int rotate, int segment, byte stringassembler[]) returns int
{
 inline vmcodes.VM_SYSCALL;
}

function ror(int value, int shift) returns int
{
 return call_asm(value, shift, 8, ASM_ROR);
}

function rol(int value, int shift) returns int
{
 return call_asm(value, shift, 8, ASM_ROL);
}

function sendBitmask(int x)
{byte i;
 for i=15 ... >=0 step -1 hwcom.put(((x shr i) and 1) + 0x30);
}

thread main
{int x,y;
 hwcom.setspeed(8);
 hwcom.clr();
 ASM_ROR="xDAx00x5Ax76xF0x84xDAx00x5Ax76x2Cx48xF0xC4xDAx00xD6x75xFCxF1xFCxF1xDBx00";
 ASM_ROL="xDAx00x5Ax76xF0x84xDAx00x5Ax76x0Cx48xF0xC4xDAx00xD6x75xFCxF1xFCxF1xDBx00";

 x=0b10011000101;

 hwcom.print("X:9");
 sendBitmask(x);
 hwcom.ret();

 y=ror(x,5);

 hwcom.print("ROR:9");
 sendBitmask(y);
 hwcom.ret();

 y=rol(x,5);

 hwcom.print("ROL:9");
 sendBitmask(y);
 hwcom.ret();
 quit 1;
}


Der ASM-Code wird in zwei String-Variablen gespeichert.
Anschlie�end werden diese Strings ausgeführt. ;-)
Verwendet man globale Variable für diese Strings, so mu� man die Strings nur einmal
beim Programmstart mit dem ASM-Code beschreiben.

MfG André H.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: rotate von Variablen (von m??oe - 7.01.2005 22:11)
    Re: rotate von Variablen (von André H. - 15.01.2005 9:54)
Re: rotate von Variablen (von Günni - 4.01.2005 16:17)
    Re: rotate von Variablen (von André H. - 4.01.2005 20:08)
        Re: rotate von Variablen (von Günni - 7.01.2005 21:04)