mov
指令有4种类型:movb
,movw
,movl
。
后缀b
,w
,l
表示源寄存器的大小。
但是,在组装时,我发现后缀有问题。
参见下面的示例。
.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
错误吗?
答案 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确实是正确的。
通常,除非不存在寄存器操作数,否则您可以简单地省略大小后缀,然后由汇编程序进行推断。汇编程序通常会做得很好。