首页 > 解决方案 > x86 汇编编程(GAS 语法):如何获取存储在寄存器中的变量的第 n 位

问题描述

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

/tmp/SASM/program.asm:54:错误:找到'$',预期:')'

/tmp/SASM/program.asm:54:错误:表达式后出现垃圾 `$5,%edx)'

下面是我的代码:

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

标签: assemblyx86bit-manipulationatt

解决方案


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

  1. 第一个变体

     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
    
  2. 第二种变体

     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
    
  3. 第三种变体

     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
    
  4. 还有更多的可能性,其有用性取决于周围的代码......


推荐阅读