assembly - 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
解决方案
您必须使用多条指令来检查是否设置了第 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
还有更多的可能性,其有用性取决于周围的代码......
推荐阅读
- python - 使用triplet loss进行训练:Nan in summary histogram tensorflow
- java - Java JTextPane Markdown 格式 - 删除格式定义字符
- matlab - 如何在 Matlab 工作区中存储矩阵的所有列
- jupyter-notebook - 在 Jupyter 中安装 xeus-cling 后 C++14 不可见(Ubuntu 18.04 - Anaconda)
- flutter - 将 Flutter 应用程序复制到新项目时要复制哪些文件夹?
- microsoft-graph-api - 使用新的 microsoft-graph-auth 库 java sdk 会出现未经授权的错误
- python - 当我尝试重定向到生产中的注册和登录页面时出现 500 错误消息
- c# - 使用索引单例分别处理类的不同实例中的事件
- java - 在我的应用程序的安装程序中嵌入 JRE 8 安装的最佳方式是什么?
- javascript - 无法获取字符串数组