【问题标题】:Can I use movl instead of movb or movw in Assembly on modern systems?我可以在现代系统的汇编中使用 movl 而不是 movb 或 movw 吗?
【发布时间】:2014-12-14 20:29:43
【问题描述】:

我正在学习如何在 Assembly 中编程,我有一个澄清问题。在我的书中,它充分说明了将正确的后缀与命令结合使用的重要性。然而,在课堂上,老师只使用了“movl”操作数。我的老师是为了简单而这样做还是近年来'movb'和'movw'命令已经过时了?例如,在 char 类型上使用 movl 而不是 movb 时效率会降低吗?它甚至会起作用吗? 谢谢

更新:我说的是 x86-64 程序集

【问题讨论】:

  • 顺便说一句,一些处理器可以处理非对齐数据,但不是全部。再说一次,如果您解析收到的消息,...字段通常不是零填充的...或者如果您有一个大数组,例如,兆字节大小的结构作为元素,将所有字节填充为 32 位字 DO有效果。

标签: assembly x86 cpu-architecture micro-optimization mov


【解决方案1】:

这个问题与什么样的架构有关?

例如,在现代 x86 上,使用 mov[b/w] 加载会由于部分寄存器更新而降低性能(防止寄存器重命名/扩展依赖链)。使用movzx/movsx 将零/符号扩展到完整大小的寄存器以防止这种情况发生。

【讨论】:

  • 是的,我说的是 x86 架构。只是为了澄清; movzx 会通过补零将数据扩展为 32 位,让数据完全占据寄存器?
  • @jnel899:是的。有关在各种微架构上编写部分寄存器的详细信息,另请参阅 Why doesn't GCC use partial registers?
【解决方案2】:

在高级语言中使用整数与字符相当。它们并没有过时,但在小例子中,将小数存储为 32 位字或字节并不重要。但是,如果您操作字符串,我强烈建议您使用字节。 (或者你可能不小心覆盖了一些相邻的字符。)

【讨论】:

  • 非常好,我知道很容易犯错误。您还提出了一个很好的观点,即使用大型结构执行此操作也会出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2010-11-08
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多