addq (%rbx), %rax
和
movl (%rbx), %ecx
addq %rcx, %rax
我的猜测是,执行此movl (%rbx), %ecx
时,%rbx的高32位被丢弃。
因此,第二个示例中的%rax
仅具有%rbx
中的低32位。正确吗?
[假设这是AT&T语法,第一个从有效地址(%rbx)
的内存中读取64位,然后将该64位值添加到64位%rax
,从而得到64位答案(加上条件代码) 。
在后者中,不是%rbx
本身的高32位被丢弃,而是仅从存储器中读取了32位(尽管也从有效地址(%rbx)
中读取。)
因为它读取32位,所以没有高32位(要丢弃)。处理器会将32位值零扩展为64位%rcx
,然后相加将在64位进行。
因此,第二个示例中的%rax仅具有%rbx的低32位。正确吗?
是,在某种意义上(假设您的意思是%rcx
):加法运算符为64位宽,但是%rcx
的32位值为零,其后为%rbx
中地址的32位内存值,还请注意%rax
还提供了addq
之前的自己的64位源。