Assembly x86汇编编程(GAS语法):如何获取存储在寄存器中的变量的第n位

Assembly x86汇编编程(GAS语法):如何获取存储在寄存器中的变量的第n位,assembly,x86,bit-manipulation,att,Assembly,X86,Bit Manipulation,Att,我试图获取存储在EDX寄存器(使用GAS或AT&T语法的英特尔x86汇编)中的变量的第5位,并将其移动到ESI寄存器。然而,当我执行我的程序时,我得到以下错误: /tmp/SASM/program.asm:54:错误:找到“$”,应为“)” /tmp/SASM/program.asm:54:错误:表达式后的垃圾“$5,%edx)” 下面是我的代码: mov (shl $5, %edx), %esi 您必须使用多条指令来检查是否设置了第5位。但您有几种可能检查这种情况(列表还远未完成): 第一变

我试图获取存储在EDX寄存器(使用GAS或AT&T语法的英特尔x86汇编)中的变量的第5位,并将其移动到ESI寄存器。然而,当我执行我的程序时,我得到以下错误:

/tmp/SASM/program.asm:54:错误:找到“$”,应为“)”

/tmp/SASM/program.asm:54:错误:表达式后的垃圾“$5,%edx)”

下面是我的代码:

mov (shl $5, %edx), %esi

您必须使用多条指令来检查是否设置了第5位。但您有几种可能检查这种情况(列表还远未完成):

  • 第一变体

     xorl  %esi , %esi   ; set ESI to 0
     shrl  $5   , %edx   ; shift 5 bits right into CARRY
     setc  %sil          ; set lowest bit of ESI if CARRY is set
    
  • 第二种变体

     xorl  %esi , %esi   ; set ESI to 0
     shrl  $5   , %edx   ; shift 5 bits right in to CARRY
     rcll  $1   , %esi   ; rotate CARRY flag into lowest bit of ESI
    
  • 第三种变体

     xorl   %esi, %esi   ; set ESI to 0
     testl  $16 , %edx   ; AND operation of 16 decimal and ESI - check if the 5th bit is set
     setnz  %sil         ; set the lowest bit of ESI if the TEST operation doesn't set the ZERO flag
    
  • 还有更多的可能性,其有用性取决于周围的代码


  • 您不能将这样的随机指令组合起来创建寻址模式。您需要至少2条说明才能执行此操作。
    esi
    之后应该包含哪些内容?也许可以尝试
    mov%edx,%esi;和$1非常感谢您的解释:D.您介意解释一下“rcll$1,%esi”如何将edx寄存器的值向右移位5位到esi寄存器中吗?我不明白您所说的“将进位标志旋转到ESI的最低位”是什么意思。ROL旋转寄存器中的位,RCL在旋转中包括进位标志。