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) |