Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly mov/movq/movabs的最大64位立即数_Assembly_X86_X86 64 - Fatal编程技术网

Assembly mov/movq/movabs的最大64位立即数

Assembly 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

似乎可以立即添加max
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顺便说一句,我肯定不是第一个这么说的人,但是为什么不写一本书或写一篇博客或其他什么东西,收集你所有的精彩答案(还有代码高尔夫,其中一些答案非常简洁)。我相信这比帮助像我这样的人解决我最基本的装配问题要持久得多:)你可以浏览我的答案。以及其中一些的链接。我曾考虑过写一本书,但那将是一项艰巨的工作,任何一成不变的东西(甚至是墨水)都无法在事情发生变化时更新,或者我发现自己犯了错误,或者其他什么。另外,我喜欢对一件狭隘的事情进行一次简短的深入探讨,而不必将其全部结合成一个连贯的介绍。