我有一个64位寄存器,它保存一个内存地址。如果我对寄存器的下半部分执行一个算术运算,然后尝试取消引用它,我会得到一个分段错误。下面是一个例子:
movsx rax, BYTE PTR [rdi] # ok
add edi, 1 # the address is correct but....
movsx rax, BYTE PTR [rdi] # segmentation fault here
在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进行排序? 这是我的代码: