c - 移入 2 个 32 位寄存器

标签 c assembly x86

void rotate( unsigned long mask[], int rotateCnt ); 

此函数将当前 64 位掩码 (mask[]) 旋转 rotateCnt 位。如果rotateCnt为正,则向左旋转;如果 rotateCnt 为负,则向右旋转。只有 rotateCnt 的低 6 位应该用于 rotateCnt

但我必须在模拟 1 个 64 位寄存器的 2 个 32 位寄存器中进行循环,在逻辑上跨两个 32 位寄存器执行 64 位操作。他们告诉我做 2 个循环,但我想不通?任何h

最佳答案

当您使用 x86 时,请查看 shld and shrd .您不需要循环(我不明白为什么他们要求循环)。

更新

这是一个 DevStudio 2005 风格的函数,它使用内联汇编程序来执行您想要的操作。不要在没有完全理解它是如何工作的情况下将其作为解决方案提出的(尤其是负计数如何正确旋转),因为你的老师很容易发现你在不知道它是如何工作的情况下复制了它(即老师:“这是如何工作的?”,你:“呃……”=> 失败)。

void Rotate
(
  unsigned *value, // pointer to two 32bit integers
  int count        // number of bits to rotate: >= 0 left, < 0 = right
)
{
  __asm
  {
    mov esi,value
    mov eax,[esi]
    mov edx,[esi+4]
    mov ecx,count
    mov ebx,eax
    shld eax,edx,cl
    shld edx,ebx,cl
    test cl,32
    jz noswap
    xchg edx,eax
noswap:
    mov [esi],eax
    mov [esi+4],edx
  }
}

关于c - 移入 2 个 32 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10434237/

相关文章:

assembly - x86 汇编中的 mov 指令

c - malloc() 在 Windows 上崩溃但在 Mac 上没有

c - libxml2:来自 xmlNode 的 xpath

c - 当用户按 Enter 时结束输入 scanf

visual-studio-2010 - 在 Visual Studio 2010 下为 x64 构建的 native C 代码中无法解释的堆栈分配

iphone - Iphone 的 MMX 说明

assembly - x86/x64 asm 中的指令重新排序 - 使用最新 CPU 进行性能优化

c - GCC 4.7 字符串文字的源字符编码和执行字符编码?

open-source - 是否有适用于 x86 的开源实时操作系统?

linux - Linux 如何使用 PCID 的值?