这些汇编代码之间的功能区别是什么?

问题描述 投票:0回答:1
addq (%rbx), %rax

movl (%rbx), %ecx
addq %rcx, %rax

我的猜测是,执行此movl (%rbx), %ecx时,%rbx的高32位被丢弃。

因此,第二个示例中的%rax仅具有%rbx中的低32位。正确吗?

assembly x86-64
1个回答
0
投票

[假设这是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位源。

© www.soinside.com 2019 - 2024. All rights reserved.