汇编程序可以在1byte寄存器上使用movw指令吗?

时间:2018-09-03 11:19:40

标签: assembly x86 elf disassembly mov

mov指令有4种类型:movbmovwmovl
后缀bwl表示源寄存器的大小。

但是,在组装时,我发现后缀有问题。
参见下面的示例。

 .global main
 main:
  movb %ss, (%ecx) # ==> assemble (X)
  movw %ss, (%ecx) # ==> assemble (O)

即使源寄存器%ss的大小为1字节,

1字节指令movb %ss, (%ecx)汇编 失败
2字节指令movw %ss, (%ecx)汇编 成功

为什么会这样?
仅仅是Linux as错误吗?

1 个答案:

答案 0 :(得分:4)

ss寄存器的长度为16位(2字节),因此当SELECT id1, id2, date, sum(column1) FROM ( SELECT id1, id2, date, column1 FROM table WHERE date >= now() - 7 UNION ALL SELECT id1, id2, arrayJoin( arrayMap( x -> today() - 7 + x, range(7) ) ) as date2, 0 as column1 FROM table WHERE date >= now() - 7 GROUP BY id1, id2 ) GROUP BY id1, id2, date ORDER BY date, id1, id2 被正确拒绝时,movw确实是正确的。

通常,除非不存在寄存器操作数,否则您可以简单地省略大小后缀,然后由汇编程序进行推断。汇编程序通常会做得很好。