Assembly mov/movq/movabs的最大64位立即数
似乎可以立即添加maxAssembly mov/movq/movabs的最大64位立即数,assembly,x86,x86-64,Assembly,X86,X86 64,似乎可以立即添加max64位值,您必须使用movabsq指令,而不能只执行movq或mov。例如,以下是我所做的测试: movq $0xFFFFFFFFFFFFFFFF, %rbx mov $0xFFFFFFFFFFFFFFFF, %rbx movq $0xEFFFFFFFFFFFFFFF, %rbx # starts with 'E' // probably added as 8- mov $0xEFFFFFFFFFFFFFFF, %rbx # starts wit
64
位值,您必须使用movabsq
指令,而不能只执行movq
或mov
。例如,以下是我所做的测试:
movq $0xFFFFFFFFFFFFFFFF, %rbx
mov $0xFFFFFFFFFFFFFFFF, %rbx
movq $0xEFFFFFFFFFFFFFFF, %rbx # starts with 'E' // probably added as 8-
mov $0xEFFFFFFFFFFFFFFF, %rbx # starts with 'E' // bytes because cannot be
movabsq $0xFFFFFFFFFFFFFFFF, %rbx # // reduced by sign-extension
其组装方式如下:
0x0000000000401000 48 c7 c3 ff ff ff ff ? mov $0xffffffffffffffff,%rbx
0x0000000000401007 48 c7 c3 ff ff ff ff ? mov $0xffffffffffffffff,%rbx
0x000000000040100e 48 bb ff ff ff ff ff ff ff ef ? movabs $0xefffffffffffffff,%rbx
0x0000000000401018 48 bb ff ff ff ff ff ff ff ef ? movabs $0xefffffffffffffff,%rbx
0x0000000000401022 48 bb ff ff ff ff ff ff ff ff ? movabs $0xffffffffffffffff,%rbx
为什么会发生这种情况?例如,为什么mov/movq
将其添加为四字节值,0x-FF-FF
?然而,当值小于8字节最大值时,它尝试将其添加为8字节立即数,而我唯一获得完整值的方法是指定movabsq
(而不执行类似-1
之类的技巧)。或者,程序集是否试图“智能化”,只是看到“哦,这个值与32位符号扩展相同,我们可以通过这样做节省4个字节?”
如果这个问题的答案是肯定的,那么“改善/减少可能的装配效率”是装配工的责任之一吗?或者这是由编译器完成的,而汇编器只需要将呈现给它的程序集转换成ELF(或目标的任何格式)?是的,汇编器总是选择最小的有效编码,这是使用一种编码而不是手工编写机码的一部分好处。如果他们没有这样做,你就不得不担心告诉他们如何优化每条指令的编码。(虽然
movq
vs.movabs
的存在一开始就已经是这样了。但是,用例是针对链接时才知道的符号地址)@PeterCordes我明白了,所以我回答了我的问题——汇编程序只是通过符号扩展来优化输出。这个链接解释了另一部分。此外,如果你想添加此链接,此链接也很好:(哦,你刚刚添加了它,谢谢)@PeterCordes顺便说一句,我肯定不是第一个这么说的人,但是为什么不写一本书或写一篇博客或其他什么东西,收集你所有的精彩答案(还有代码高尔夫,其中一些答案非常简洁)。我相信这比帮助像我这样的人解决我最基本的装配问题要持久得多:)你可以浏览我的答案。以及其中一些的链接。我曾考虑过写一本书,但那将是一项艰巨的工作,任何一成不变的东西(甚至是墨水)都无法在事情发生变化时更新,或者我发现自己犯了错误,或者其他什么。另外,我喜欢对一件狭隘的事情进行一次简短的深入探讨,而不必将其全部结合成一个连贯的介绍。