2012-05-17 79 views
0

请帮我将下面的代码转换为等效的C代码。提前致谢。该模块返回一个uint值。代码如下。将程序集转换为等效的c代码

inline uint jpeg_decoder::huff_extend(uint i, int c) 
{ 
    _asm 
    { 
    mov ecx, c 
    mov eax, i 
    cmp eax, [ecx*4+extend_mask] 
    sbb edx, edx 
    shl edx, cl 
    adc eax, edx 
    } 
} 
+0

感谢您的回复。我没有尝试任何东西,因为我不习惯安装程序代码。我可以理解变量c被放入到ex寄存器的ecx寄存器变量中,但为什么没有其他寄存器,我不能弄清楚,我怎么能从这个方法返回一个值,我也无法弄清楚。请帮助我。 –

+4

[Intel架构软件开发人员手册](http://download.intel.com/design/intarch/manuals/24319101.pdf)是x86汇编的规范参考。尝试使用它来理解这个汇编代码,然后返回关于你不明白的部分的*特定*问题。 –

+1

@ Li-aungYip来吧,这个问题很具体。其实这并不难,并在5分钟内回复(可能不适合你,但是有很多聪明的人),所以不需要发布一个技术参考链接,根本无法帮助他。 – hirschhornsalz

回答

1

也许你不熟悉的sbbadc指令,它们是减法借加带进位
sbb edx,edx是一个常见的构造,如果进位被置位,则将edx设置为-1 - 取消进位标志并将其移入寄存器(开发者手册不会告诉您的)的指令。
移位指令再次移入进位位 - 只有在实际存在移位的情况下。

所以功能基本上是这样做的:

if (extend_mask[c] > i) 
    return i + (c != 0); 
else 
    return i; 
+0

非常感谢,它会在rwally帮助我。 –