首页 > 解决方案 > 汇编mov指令后缀?

问题描述

(我将这个问题基于 x86-64 架构)

如果主内存是一个由地址索引的字节数组 - 你为什么应该使用movq(%rdx), %rax而不是movb(%rdx), %rax?我的意思movq是用于移动一个四字并且movb用于移动一个字节。因此mov#(%rdx), %rax,据我所知,源是内存中的一个位置,因此应该是 1 个字节。我知道寄存器%rax实际上是 x86-64 上的四字,但这并不意味着我们是四字moving移动 - 我们正在将一个字节移动到可以容纳四字(8 个字节)的地方 - 对吧?

那么为什么不使用movb(%rdx), %rax或者可能movzbq (%rdx), %rax呢?

标签: cassemblyx86-64

解决方案


后缀告诉指令将移动多少字节。因此,当您这样做时movq (%rdx), %rax,将从内存中的地址开始移动 8 个字节%rdx

movb (%rdx), %rax不是有效的指令。 movb (%rdx), %al会将地址 at%rdx的 1 个字节移动到%rax. movzbq (%rdx), %rax移动 1 个字节,将其零扩展为 8 个字节,并将该值写入%rax


推荐阅读