assembly - 将 32 位寄存器移动到 8 位寄存器中
问题描述
我想搬进edx
去al
,但我收到了这个错误
lib/io/print.asm:50: error: invalid combination of opcode and operands
这是代码
mov edx, 0x41
mov al, edx
提前致谢
解决方案
问题是第二行:
mov al, edx
edx
寄存器是 32 位的,但是是al
8 位的,所以你不能直接将一个移到另一个。如果要将低 8 位移edx
入dl
,请执行以下操作:
mov al, dl
或者,也许您想将所有内容edx
移入eax
,如下所示:
mov eax, edx
不同之处在于第一个选项使 的高 24 位eax
保持不变,而第二个选项将它们设置为与 的相应位相同edx
。
如果您不关心高 24 位,例如,因为您不打算使用它们,或者因为您知道它们在任何一种情况下都为零,那么第二个选项可能会稍微快一些,因为它打破了对前一个的依赖的值eax
,所以它可以在准备好后立即执行edx
,而不管eax
之前发生了什么。
movzx eax, dl
MOVZX 具有避免对 AL 目标的错误依赖的相同好处,同时仅从 EDX 中获取一个字节并将其零扩展。您想要的字节在 AL 中。
如果您想要源 EDX 的不同字节,您可以移动和移位,或movzx eax, dh
.
推荐阅读
- laravel - Laravel - 左连接不存在的雄辩过滤器
- c# - 如何将文本移动到 .PDF 中的 X、Y 位置
- regex - .htaccess mod-rewrite:修改工作 RewriteRule 以捕获任何查询字符串
- php - 有没有办法将数据插入多个表?php mysql
- javascript - 为什么媒体查询在通过 javascript 更改后不更新值?
- ansible - Ansible:每n小时最多运行一次任务
- python - 如何强制我的训练数据匹配我的神经网络的输出形状?
- python - 使用 urllib 时的语法错误,可能还有更多错误
- c# - ASP.NET Web 应用程序问题中的引导程序
- c++ - 命名空间范围内的外部 - gcc vs clang vs msvc