X86 地址中的冒号是什么意思?

X86 地址中的冒号是什么意思?,x86,windbg,memory-address,memory-segmentation,X86,Windbg,Memory Address,Memory Segmentation,我有一个崩溃转储,其中显示以下异常信息: 0:000> .ecxr eax=00000000 ebx=00000001 ecx=000000dc edx=000032f0 esi=00000020 edi=78746341 eip=00000000 esp=00000007 ebp=00000020 iopl=0 nv up di pl nz na po cy cs=0014 ss=0034 ds=0000 es=1000 fs=df5c gs=0000

我有一个崩溃转储,其中显示以下异常信息:

0:000> .ecxr
eax=00000000 ebx=00000001 ecx=000000dc edx=000032f0 esi=00000020 edi=78746341
eip=00000000 esp=00000007 ebp=00000020 iopl=0         nv up di pl nz na po cy
cs=0014  ss=0034  ds=0000  es=1000  fs=df5c  gs=0000             efl=00000001
0014:00000000 ??              ???
为什么exeption地址显示为
0014:00000000
,而不仅仅是
00000000
?据我所知,
0014
是代码段,但我没有找到任何关于语法的文档


还有,有没有办法将这种语法转换成简单的绝对地址?

是的,
seg:off
是100%的标准表示法。它只是向您显示完整的CS:EIP值

CS base是
0
,除非你做了一些非常奇怪的事情(例如,
retf
在CS中弹出一些东西,碰巧索引了一个非零基数的GDT条目,如果有的话)


所以线性地址就是
00000000
。e、 g.当ESP指向的是0而不是您的返回地址时,您试图跳转到空函数指针或其他东西,或者试图
ret

是,
seg:off
是100%标准表示法。它只是向您显示完整的CS:EIP值

CS base是
0
,除非你做了一些非常奇怪的事情(例如,
retf
在CS中弹出一些东西,碰巧索引了一个非零基数的GDT条目,如果有的话)


所以线性地址就是
00000000
。e、 g.当ESP指向0而不是返回地址时,您试图跳转到空函数指针或其他对象,或试图
ret

是的,冒号前面的部分是段,后面的部分是偏移量(在本例中为EIP)。通常在32位代码中,代码段的段基是0。除非你有其他证据,否则你应该继续这个假设。所以线性地址是0。地址0通常不映射到任何地址空间,这就解释了崩溃的原因。(如果您有理由认为第14段的实际段基不是0,Windbg可能会告诉您。)是的,冒号之前的部分是段,后面的部分是偏移量(本例中为EIP)。通常在32位代码中,代码段的段基是0。除非你有其他证据,否则你应该继续这个假设。所以线性地址是0。地址0通常不映射到任何地址空间,这就解释了崩溃的原因。(如果您有理由认为第14段的实际段基数不是0,Windbg可能会告诉您。)谢谢。你知道为什么要显示这个片段吗?通常它不是显示地址的一部分。@Paul:IDK为什么WinDBG认为这是个好主意。当前CS值已单独显示。纯粹是用户界面设计的选择。GDB没有;GDB是一个可移植的调试器(用于各种ISA),它是围绕平面内存模型构建的。IDK if WinDBG的根在16位的土地上,
seg:off
实际上很重要,因为正常的内存模型不是平坦的。或者,如果作者对16位x86有丰富的经验,因此将当前程序计数器显示为seg:off似乎很自然。@Paul:或者,它对于调试可能在代码段之间跳转以切换模式的内核代码很有用?IDK if WinDBG可以调试内核,尽管.WinDBG可以用作内核调试器,但这是一个用户模式崩溃转储。@Paul:对,但我不希望它根据您是否调试内核而改变其输出格式。内核调试是用例之一,这意味着将故障地址打印为
cs:eip
cs:rip
是有意义的。(虽然内核也会使用CS base=0,所以我想这只是为了帮助内核开发人员注意到CS值。)谢谢。你知道为什么要显示这个片段吗?通常它不是显示地址的一部分。@Paul:IDK为什么WinDBG认为这是个好主意。当前CS值已单独显示。纯粹是用户界面设计的选择。GDB没有;GDB是一个可移植的调试器(用于各种ISA),它是围绕平面内存模型构建的。IDK if WinDBG的根在16位的土地上,
seg:off
实际上很重要,因为正常的内存模型不是平坦的。或者,如果作者对16位x86有丰富的经验,因此将当前程序计数器显示为seg:off似乎很自然。@Paul:或者,它对于调试可能在代码段之间跳转以切换模式的内核代码很有用?IDK if WinDBG可以调试内核,尽管.WinDBG可以用作内核调试器,但这是一个用户模式崩溃转储。@Paul:对,但我不希望它根据您是否调试内核而改变其输出格式。内核调试是用例之一,这意味着将故障地址打印为
cs:eip
cs:rip
是有意义的。(虽然内核也会使用CS base=0,所以我想这更只是为了帮助内核开发人员注意到CS值。)