Assembly movq和64位数字

Assembly movq和64位数字,assembly,x86,x86-64,att,instruction-set,Assembly,X86,X86 64,Att,Instruction Set,当我给登记簿写信时,一切都很好 movq $0xffffffffffffffff, %rax 但我得到了一个错误:当我写入内存位置时,操作数大小不匹配 movq $0xffffffffffffffff, -8(%rbp) 为什么呢?我在编译的C代码中看到,在asm中,这些数字被分成两部分,并显示两条movl指令 也许你可以告诉我mowq和其他说明的记录位置 为什么呢 因为MOV r64,imm64是有效的x86指令,但MOV r/m64,imm64不是(它没有编码) 我在编译的C代码中

当我给登记簿写信时,一切都很好

movq  $0xffffffffffffffff, %rax
但我得到了一个错误:当我写入内存位置时,操作数大小不匹配

movq  $0xffffffffffffffff, -8(%rbp)
为什么呢?我在编译的C代码中看到,在asm中,这些数字被分成两部分,并显示两条movl指令

也许你可以告诉我mowq和其他说明的记录位置

为什么呢

因为
MOV r64,imm64
是有效的x86指令,但
MOV r/m64,imm64
不是(它没有编码)


我在编译的C代码中看到,在asm中,这些数字被分成两部分,并显示两条movl指令

MOV r/m64,imm32
是一条有效的x86指令,这就是为什么您会看到其中两条用于将64位立即数存储到内存中


也许你可以告诉我mowq和其他说明的记录位置

为什么呢

因为
MOV r64,imm64
是有效的x86指令,但
MOV r/m64,imm64
不是(它没有编码)


我在编译的C代码中看到,在asm中,这些数字被分成两部分,并显示两条movl指令

MOV r/m64,imm32
是一条有效的x86指令,这就是为什么您会看到其中两条用于将64位立即数存储到内存中


也许你可以告诉我mowq和其他说明的记录位置

为什么呢

因为
MOV r64,imm64
是有效的x86指令,但
MOV r/m64,imm64
不是(它没有编码)


我在编译的C代码中看到,在asm中,这些数字被分成两部分,并显示两条movl指令

MOV r/m64,imm32
是一条有效的x86指令,这就是为什么您会看到其中两条用于将64位立即数存储到内存中


也许你可以告诉我mowq和其他说明的记录位置

为什么呢

因为
MOV r64,imm64
是有效的x86指令,但
MOV r/m64,imm64
不是(它没有编码)


我在编译的C代码中看到,在asm中,这些数字被分成两部分,并显示两条movl指令

MOV r/m64,imm32
是一条有效的x86指令,这就是为什么您会看到其中两条用于将64位立即数存储到内存中


也许你可以告诉我mowq和其他说明的记录位置



In.

谢谢,但是没有这条指令的逻辑是什么?英特尔不认为这条指令会非常有用,所以他们选择不在上面浪费稀少的指令编码。@markgz:AMD设计的是x86-64 ISA扩展,而不是英特尔。但是,是的,他们决定大多数64位指令仍然使用32位立即数(符号扩展),因为大常量很少(而且64位地址通常由RIP相对LEA处理)。但是,是的,5字节
mov r32,imm32
特殊编码(寄存器号位于操作码字节中)的REX.W=1版本变为
mov r64,imm64
,而REX.W=1
mov r/m32,imm32
变为
mov r/m64,符号扩展\u imm32
。已经有两种不同的操作码可以将一个立即数移动到寄存器,所以AMD利用了这一点。谢谢,但这条指令不存在的逻辑是什么?英特尔不认为这样的指令会非常有用,所以他们选择不在其上浪费稀缺的指令编码。@markgz:AMD设计了x86-64 ISA扩展,不是英特尔。但是,是的,他们决定大多数64位指令仍然使用32位立即数(符号扩展),因为大常量很少(而且64位地址通常由RIP相对LEA处理)。但是,是的,5字节
mov r32,imm32
特殊编码(寄存器号位于操作码字节中)的REX.W=1版本变为
mov r64,imm64
,而REX.W=1
mov r/m32,imm32
变为
mov r/m64,符号扩展\u imm32
。已经有两种不同的操作码可以将一个立即数移动到寄存器,所以AMD利用了这一点。谢谢,但这条指令不存在的逻辑是什么?英特尔不认为这样的指令会非常有用,所以他们选择不在其上浪费稀缺的指令编码。@markgz:AMD设计了x86-64 ISA扩展,不是英特尔。但是,是的,他们决定大多数64位指令仍然使用32位立即数(符号扩展),因为大常量很少(而且64位地址通常由RIP相对LEA处理)。但是,是的,5字节
mov r32,imm32
特殊编码(寄存器号位于操作码字节中)的REX.W=1版本变为
mov r64,imm64
,而REX.W=1
mov r/m32,imm32
变为
mov r/m64,符号扩展\u imm32
。已经有两种不同的操作码可以将一个立即数移动到寄存器,所以AMD利用了这一点。谢谢,但这条指令不存在的逻辑是什么?英特尔不认为这样的指令会非常有用,所以他们选择不在其上浪费稀缺的指令编码。@markgz:AMD设计了x86-64 ISA扩展,不是英特尔。但是,是的,他们决定大多数64位指令仍然使用32位立即数(符号扩展),因为大常量很少(而且64位地址通常由RIP相对LEA处理)。但是,是的,5字节
mov r32,imm32
特殊编码(寄存器号位于操作码字节中)的REX.W=1版本变为
mov r64,imm64
,而REX.W=1
mov r/m32,imm32
变为
mov r/m64,符号扩展\u imm32
。已经有两种不同的操作码可以将立即数移动到寄存器中,所以AMD利用了这个优势。@jww:您没有删除“谢谢”绒毛和其他填充物。如果你想编辑一篇旧文章,一定要删除它()。
0xffffffffffffff
可以表示为si