什么时候应该在 x86 汇编中使用 MOVS 而不是 MOV?

Posted

技术标签:

【中文标题】什么时候应该在 x86 汇编中使用 MOVS 而不是 MOV?【英文标题】:When should one use MOVS opposed to MOV in x86 Assembly? 【发布时间】:2016-03-28 19:02:05 【问题描述】:

我在The Intel 64 and 32 Bit Architectures Software Developer Manual 中遇到了这两个说明,我只是想知道两者之间的区别是什么,以及何时应该使用其中一个而不是另一个。

【问题讨论】:

MOVS 指令执行任意大小的内存到内存复制。 MOV 指令执行 8、16、32 或 64 位寄存器到寄存器、寄存器到内存或内存到寄存器的复制。 This might be a better reference 为您服务(参见第 3 章)。 一旦您知道 movmovs 做了什么(并且因为您在英特尔手册中阅读过它们,您就知道它们做了什么),关于何时成为边缘观点的问题。 【参考方案1】:

MOVS 指令通常用于多次使用,因为它会自动增加或减少 ediesi 的值。增量或减量分别取决于方向标志是清除还是设置。这可以与REP 前缀一起使用,通过递减ecx 直到它达到零来使其重复。

根据我阅读的一些文档,movs 指令的历史是一次移动一个字节的字符串,尽管您可以让它移动更大的项目(特别是单词和四字)。它会自动将ediesi 更改正确的数量,但它仍然只会将ecx 减一,因此例如,如果您要移动Unicode 字符串,请小心。

http://x86.renejeschke.de/html/file_module_x86_id_279.html 页面解释了 rep 前缀及其变体的确切条件。

【讨论】:

以上是关于什么时候应该在 x86 汇编中使用 MOVS 而不是 MOV?的主要内容,如果未能解决你的问题,请参考以下文章

x86汇编编程中如何表示FFFFFFBB等十六进制值?

x86汇编编程中如何表示FFFFFFBB等十六进制值?

如何在 x86 汇编中编写自己的 atoi 函数

x86汇编语言的MOV指令

这个 x86 汇编冒泡排序程序有啥问题?

使用 TYPE 指令汇编 MASM x86