如何解决x86汇编编程GAS语法:如何获取存储在寄存器中的变量的第n位
我正在尝试获取存储在EDX寄存器(使用GAS或AT&T语法的Intel x86 Assembly)中的变量的第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,%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
-
还有更多的可能性,其有效性取决于周围的代码...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。