当前位置: 首页 > 知识库问答 >
问题:

在添加[重复]中使用下半部分后取消64位寄存器的引用

许俊晤
2023-03-14

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

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

共有1个答案

阚通
2023-03-14

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

因此,RDI的高位32位在Add edi之后为零,1

 类似资料:
  • 基本上指令有8->16、8->32、8->64、16->32和16->64。 32->64的转换在哪里?我必须使用签名版本吗? 如果是的话,您如何使用完整的64位来表示无符号整数?

  • 我正在调试以下函数: 函数是用

  • 3、段寄存器的引用 段寄存器是因为对内存的分段管理而设置的。16位CPU有四个段寄存器,所以,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图2.7所示。 段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。 段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另

  • 由于解引用< code > NULL ptr (< code > NULL )在< code>C和< code>C 中都是未定义的行为,我想知道表达式< code > 如果也是未定义行为,那么链接答案中的OFFSETOF宏是如何工作的? 我一直认为< code>ptr- 我认为我的问题的答案在C和C中是相似的。

  • 我在这里看到了一个如何使用比较器界面对 ArrayList 进行排序的示例,所以我尝试了一下。对于Strsing,它可以完美地工作,但是对于一个我想排序为整数的变量,它不会编译,说“int不能被取消引用”。 我能做什么才能使它工作并允许我按分数变量对ArrayList进行排序? 这是我的代码: