assembly - 在添加中使用下半部分后取消引用 64 位寄存器

标签 assembly x86-64

<分区>

我有一个 64 位寄存器,其中包含一个内存地址。如果我对寄存器的下半部分执行算术运算然后尝试取消引用它,我会得到一个段错误。这是一个例子:

movsx rax, BYTE PTR [rdi]  # ok
add edi, 1 # the address is correct but....
movsx rax, BYTE PTR [rdi] # segmentation fault here

如果我在第 2 行将 edi 更改为 rdi,它就可以工作,所以我只是想知道为什么在这种情况下我不能使用 rdi 的下半部分。如果有人有任何关于正确使用寄存器下部的信息的链接/引用,我也将不胜感激。

非常感谢您的帮助。

最佳答案

当您对 edi 或任何其他 32 位下半部分寄存器进行操作时,它会自动将整个寄存器的上半部分归零。

因此 rdi 的高 32 位在 add edi, 1 之后将为零。

关于assembly - 在添加中使用下半部分后取消引用 64 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10256522/

相关文章:

c - 处理数组和 for 循环的汇编代码,以及如何解码映射函数

c - 为什么数组有调用约定?

assembly - 为什么我不能将 64 位值 MOV 到 64 位寄存器?

c - arg 在 ASM 函数中包含什么?

optimization - 是否有任何好的、现代的在线指南来手动优化汇编代码?

assembly - 二元炸弹 - 第 2 阶段

macos - macOS 上的 NASM 间接寻址程序集不正确

assembly - call *(%rax, %rcx,8) 在循环中是什么意思?为什么RAX和RCX之后要变?

windows - x64 程序集中的 'shadow space' 是什么?

assembly - x64 ymm/SIMD/向量指令,其中 ymm 寄存器在寄存器中指定?