近和远JMP

ST-*_*ser 7 x86 assembly nasm

我正在进行Linux汇编,我知道它有一个平坦的内存模型.令我困惑的是NEAR和FAR JMP.

NEAR属于同一部分,而FAR是另一部分.据我所知,linux虚拟内存中没有任何段?另外我们如何知道我的程序代码是否分布在多个部分中?

pax*_*blo 9

它现在已经很长时间了.保护模式x86中的正确术语是选择器.

话虽如此,近跳和远跳之间的区别在于前者保持相同的代码选择器cs而后者(通常)改变它.

在平面存储器模型中,前一种情况几乎总是如此.

可以拥有一个操作系统,其中平面内存模型由多个选择器提供服务,但我看不到它的有用用例,并且它不是Linux的工作方式,至少在x86上.


Ale*_*nze 6

NEAR在同一段中,而FAR在另一段中。

一次近距离跳转将跳转到当前代码段内的某个位置(由指向cs)。通常,远跳转用于跳转到不同代码段中的某个位置,但是如果远地址中的段选择器与中的值一致,它也可以跳转到当前代码段中的某个位置cs

据我了解,Linux虚拟内存中没有段?

对于使用某种分段内存的Linux CPU端口,我不会感到惊讶。所以,我想说要看情况。但是,您不太可能在x86平台上看到Linux使用细分。但是,您或其他人也可以使小型Linux以实模式运行并使用段。

另外,我们如何知道我的程序代码是否分为多个段?

您检查CPU和OS。自然,如果您编写可移植的C代码,那么您就不必担心了。