Iniciado por
ElRana
Tus deseos son ordenes para moi. En la sintaxis que me mola, AT&T XDXDXD
__asm
(
"movq $src,%%rsi \n\t"
"movq $srcLen,%%rbx \n\t"
"movq dest,%%rdi \n\t"
"xorq %%rax,%%rax \n\t"
"xorq rcx,rcx // CH and CL used \n\t"
"lea rbx,[rbx+rsi-3] \n\t"
"movq %%rax,$LZOldChain \n\t"
"movq %%rbx,$LZSrcBufEnd \n\t"
"movq %%rax,$LZChain \n\t"
"movq %%rax,$LZMaxIndex \n\t"
"movq %%rax,$LZCodeMask ;;LZCode es unsigned long \n\t"
"movq %%rax,$LZFreeIndex \n\t"
"movq MAX_BIT_INDEX-1,$LZCodeMask \n\t"
"movq MAX_BIT_INDEX,$LZMaxIndex //max index for 9 bits == 512 \n\t"
";Esto puede ser probrlemático\n\t"
"movq HASH_FREE,$LZFreeIndex //set index to 258"
"mov %al,$LZOldSuffix"
"mov BASE_BITS,%%ch"
"jmp GetCode"
...)
el resto por tu cuenta XD
Esto sería mas para un GAS (sin el "asm (", sólo con el código tal cual). Tal y como está estaría a medias.
Como me siento generoso, lo pongo de forma menos problemática y mas clara:
__asm
(
";;xorq %%rax,%%rax \n\t"
";;Versión rápida:\n\t mov $0,%%rax \n\t"
";;xorq rcx,rcx // CH and CL used \n\t"
";;movq $0,rcx \n\t"
"lea rbx,[rbx+rsi-3] \n\t"
:"=a"(LZOldChain),
"=b"(LZSrcBufEnd),
:"s"(src),
"b"(srcLen),
"d"(dest)
:"memory"
);
asm((volatile))(:""=a"(LZChain)::"memory);
asm((volatile))("=a"(LZMaxIndex")::"memory");
asm((volatile))("=a"(LZCodeMask")::"memory");
asm((volatile))("=a"(LZFreeIndex")::"memory");
LZCodeMask=MAX_BIT_INDEX-1;
LZMaxIndex=MAX_BIT_INDEX;
LZFreeIndex=HASH_FREE;
asm((volatile))("andq $-15,rax\n\t"::"a"(LZOldSuffix):"memory");
asm((volatile))("jmp GetCode\n\t"::"c"(BASE_BITS):"memory");
... y así en adelante.
Puede que me halla confundido en algo, es difícil editar el código en el navegador, pero para un GNU C con ensamblador incrustado sería tal que asín XD
Happy coding!!!!
Marcadores