在 x86 中,当您想要访问内存地址时,您将指定一个地址,该地址将通过两个阶段转换为内存地址:分段和分页:
但是在 x64 中也使用分段吗?(我认为它没有被使用,但我不确定它是不是在所有情况下都使用,或者在某些情况下使用它)。
我有几行非常简单的汇编代码,可以移动一些数据,如下所示:
mov rax,qword ptr gs:[60]
mov rcx,qword ptr ds:[rax+20]
mov rax,qword ptr gs:[60]
mov rcx,qword ptr ds:[rax+20]
mov rbx,qword ptr ds:[rcx+28]
Run Code Online (Sandbox Code Playgroud)
但是,编译器返回
错误 A2202:非法使用段寄存器
我有一种感觉,这可能是我的编译器或版本的问题,任何指针都会有所帮助
具体是:
mov %eax, %ds
Run Code Online (Sandbox Code Playgroud)
慢于
mov %eax, %ebx
Run Code Online (Sandbox Code Playgroud)
或者他们是相同的速度.我在网上研究过,但一直无法找到明确的答案.
我不确定这是否是一个愚蠢的问题,但我认为修改分段寄存器可以使处理器做额外的工作.
NB我关注旧的x86 linux cpus,而不是现代的x86_64 cpus,其中分段的工作方式不同.