Assembly “;PTR&x201D;和“;靠近PTR”;?

Assembly “;PTR&x201D;和“;靠近PTR”;?,assembly,x86,masm,Assembly,X86,Masm,我正在查找包含“NEAR PTR”的示例,但它们很容易被“PTR”替换。使用“近PTR”有什么好处吗?近是16位过去的遗留问题。假设您的代码是32位或64位,它们是相同的 这是关于内存段(Wikipedia指向x86和的链接) 在PTR和NEAR-PTR中,只需存储一个32/64位内存地址,不带段 如果在64位MASM下编译下一个代码: _DATA SEGMENT justPtr LABEL PTR db nearPtr LABEL NEAR PTR db justPt

我正在查找包含“NEAR PTR”的示例,但它们很容易被“PTR”替换。使用“近PTR”有什么好处吗?

近是16位过去的遗留问题。假设您的代码是32位或64位,它们是相同的

这是关于内存段(Wikipedia指向x86和的链接)

在PTR和NEAR-PTR中,只需存储一个32/64位内存地址,不带段

如果在64位MASM下编译下一个代码:

_DATA SEGMENT
    justPtr LABEL PTR db
    nearPtr LABEL NEAR PTR db

    justPtrSize dd SIZEOF justPtr
    nearPtrSize dd SIZEOF nearPtr
_DATA ENDS
并在Visual Studio调试器下检查大小:

?justPtrSize
8
?nearPtrSize
8

事实上,PTR占用8字节(64位),与NEAR PTR占用的方式相同。

您可以在32位和64位代码中使用远指针,它们通常没有多大意义。他们所做的一个例子是通过
fs
gs
访问TLS数据!我只是想澄清,32位和64位代码中仍然存在远指针。@fuz有一些操作系统使用分段(16:32)代码和数据。Watcom C/C++编译器(当时是一个商业编译器,现在是免费的开源编译器)能够为这样的操作系统编译代码。在本例中,
sizeof(void*)
为6。@MartinRosenau-Watcom C/C++10.0的独特之处在于它包含了对winmem32的完全支持,winmem32是Windows 3.1的32位平面地址空间模型。我不记得16:32的分段模型。Microsoft(可能还有其他)16位工具集包括支持Windows 3.1版本的巨型模型globalalloc()和globallock(),它们使用选择器而不是段,每个选择器“指向”64KB内存块,增量为_AHINCR==8,从64KB内存块提升到64KB内存块,16:16分段模型。@MartinRosenau-Windows 3.1还具有Windows NT 3.1 32位API的32位平面地址空间子集,但其应用程序通常使用32位工具集构建,其中包括用于Win32的“thunk”库。可能与