【发布时间】:2013-11-04 03:32:23
【问题描述】:
当我写入寄存器时,一切都很好,
movq $0xffffffffffffffff, %rax
但我得到错误:当我写入内存位置时,操作数大小不匹配,
movq $0xffffffffffffffff, -8(%rbp)
这是为什么呢?我在编译后的 C 代码中看到,在 asm 中这些数字被分成两部分,并且出现了两条 movl 指令。
也许您可以告诉我 mowq 和其他说明的文档记录在哪里。
【问题讨论】:
-
@jww:你错过了删除“谢谢”绒毛和其他填充物。如果您根本不想编辑旧帖子,请务必将其删除 (meta.stackoverflow.com/questions/288160/no-thanks-damn-it)。
-
0xffffffffffffffff可表示为符号扩展的 imm32 (-1)。我认为您在没有实际测试这个特定常量的情况下编写了这个示例,因为 gas 版本 2.29.1 可以很好地组装它;48 c7 45 f8 ff ff ff ff movq $0xffffffffffffffff,-0x8(%rbp)(从 objdump 反汇编)。 如果高 32 位不是第 31 位的所有副本,那么它就不能使用内存目标进行编码。 -
顺便说一句,
mov r64, imm64的 AT&T 助记符是movabs。当您使用 64 位寄存器目标时,英特尔语法汇编器会根据常量选择编码。
标签: assembly x86 x86-64 att instruction-set