gpt4 book ai didi

assembly - "mov (%rax),%eax"和 "mov %rax,%eax"有什么区别?

转载 作者:行者123 更新时间:2023-12-03 22:34:23 30 4
gpt4 key购买 nike

mov (%rax),%eax有什么区别和 mov %rax,%eax ?我确定这是一个简单的问题,但我在任何地方都找不到答案。

这是提示我的问题的原始代码:

mov    -0x8(%rbp),%rax
mov (%rax),%eax
lea (%rax,%rax,1),%edx
mov -0x8(%rbp),%rax
mov %edx,(%rax)
mov -0x8(%rbp),%rax
mov (%rax),%eax

最佳答案

在 AT&T 语法中,指令:

mov (%rax), %eax                  # AT&T syntax


或者,等效于 Intel 语法:

mov eax, DWORD PTR [rax]          ; Intel syntax


取消引用存储在 rax 中的内存地址,从该内存地址读取一个 32 位值,并将其存储在 eax 中。登记。

因为被解引用的内存地址存储在 rax , 可以是 64 位地址,在 64 位操作系统上运行时是必须的。

但是那个内存地址指向的数据只有32位大小,所以可以存放在32位 eax中。登记。

请注意,此指令会将 rax 的高 32 位隐式清零。寄存器,以便下 32 位一半(称为 eax )将包含加载的数据,而上 32 位一半将为空。

AT&T 语法中的括号(或 Intel 语法中的方括号)是您这条指令将寄存器内容视为指针的线索。
这就是它不同于例如:

mov %rcx, %rax                    # AT&T syntax


mov rax, rcx                      ; Intel syntax


这只是复制 rcx 的内容注册到 rax登记。没有取消引用。寄存器中的值直接作用。

请注意,上面的示例类似于您问题中的另一个示例:

mov %rax, %eax                    # AT&T syntax (INVALID!)


mov eax, rax                      ; Intel syntax (INVALID!)


但不完全相同。最后一种情况实际上是无效指令,因为存在操作数大小不匹配。如果有效,则指令将复制 64 位 rax 的内容。注册到 32 位 eax登记。当然,这是不可能的。不允许缩小转换,因此它不会组装。

如果你真的想这样做,你必须决定 rax 中 64 位值的哪一半。你想扔掉的。如果您决定丢弃高位而仅将低位复制到 eax ,你不需要做任何事情——只需使用 eax直接地。但是,如果您想丢弃低位而只使用高位,则应首先右移 32。

请注意,这是一个相当简单的一般引用问题。您可以在任何关于 x86 汇编语言的书中查找答案,并且教程应该会教您有关括号/方括号语法的重要性。请查看 标记 wiki 以获得一些教程和其他一般引用信息。

关于assembly - "mov (%rax),%eax"和 "mov %rax,%eax"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41232333/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com