dword wordval;
int get_svalue(BYTE k)
// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value
{
_asm {
   xor ecx, ecx
   mov cl,k
   mov eax,[wordval]
   shl eax,cl
   shr eax, 16
   dec cl
   bt eax,ecx
   jc end_macro
signed_value:inc cl
   mov ebx,[start_neg_pow2]
   add ax,word ptr [ebx+ecx*2]
 end_macro:
}
}帮我看下这段代码什么意思。谢谢(最好帮我翻译成c写的代码)

解决方案 »

  1.   

    DWORD wordval;
    int get_svalue(BYTE k)
    {
        int nRet = wordval;
        nRet <<= k;
        nRet >>= 16;
        k--;
        char* p = &start_neg_pow2;
        if (k % nRet != 0)
            nRet += *(p+k*2);
        return nRet;
    }完全忘了汇编了,好长时间不碰了,哈哈哈,上面写的别信。
      

  2.   

     bt   eax,ecx  ->  if   (k   %   nRet   !=   0) 
    这句转换有误, 应该是
    if(nRet & (1<<k))
      

  3.   

    谢谢
      char*   p   =   &start_neg_pow2; 中&start_neg_pow2 那里来的哟
      

  4.   

     char*       p       =       &start_neg_pow2;   中&start_neg_pow2   那里来的哟下面这句来的:[]在汇编中表示间接寻址,即地址值等于[]中的值(若为寄存器则为寄存器之值)!
    mov   ebx,[start_neg_pow2] 
      

  5.   

     start_neg_pow2 为 dword 类型。 运行了下,和汇编的效果不一样哟。
    应该是翻译的有点问题。昨天自己翻译了几段都是比较简单的。还好自己能搞定。现在的就有点麻烦。自己也很少弄着。呵呵。
      

  6.   

    mov   ebx,[start_neg_pow2] 
      ->
    两个可能
         ebx = start_neg_pow2;
    或者 ebx = *(DWORD *)start_neg_pow2;
      

  7.   

    SWORD get_svalue(BYTE k)
    {
    unsigned long ret = wordval, idx = k; ret = ret << idx;
    ret = ret >> 16;
    idx--; if (!(ret & (1<<idx)))
    {
    idx++;
    ret += *((WORD*)(start_neg_pow2+(idx<<1)));
    }
    return ret;
    }jpg解码里的代码吧,呵呵
    我也遇到了这个问题,想把这个解码器用到pocket pc上
    结果被这些汇编代码拦住了,已经搞定了
      

  8.   

    DWORD x=k;
    DWORD eax_bitx;
    DWORD *p;
    DWORD eax=wordval;
    SWORD return_num;
    //eax=eax|0xffff0000;
    eax=eax<<x;
    eax=eax>>16;
    x=x-1;
    eax_bitx=eax>>x;
    eax_bitx=eax_bitx&0x0000000f;
    if(eax_bitx==0)
    {
    x++;
    p=(WORD*)start_neg_pow2;
    x=x*2;
    p=(char*)p+x;
    //p=(WORD*)start_neg_pow2+x;
    eax=eax&0x0000ffff;
    eax=eax+*p;
    eax=eax<<16;
    eax=eax>>16;
    }
    return eax;这个代码 我已经测试通过