内存引用作为 NDISASM 输出中的指令参数是什么意思?
What is the meaning of memory references as instruction parameters in NDISASM output?
我正在使用 ndisasm 反汇编程序。我的问题是调用指令和跳转之后的内存引用是什么意思?
它们是相对于指令还是从程序开始算起?他们指的是 ndisasm 输出文本第一列中的地址吗?
它指的是输出第一列给出的地址,通常也是指令相对于文件开头的位置。该程序不知道代码将加载到内存中的哪个位置,因此通常无法告诉您目标实际位于内存中的哪个位置。
请注意,这仅适用于 near 直接跳转和调用指令(包括条件 Jcc 跳转指令)的目标地址,因为这些地址是相对于指令编码的。其他指令中的地址不使用相对编码,因此显示的地址不是指第一列中的地址。相反,它是在运行时使用的实际地址,假设程序在加载到内存中时没有重新定位到其他地方。
(64位RIP相对寻址是上述的一个例外,使用这种寻址方式的指令使用相对地址编码。)
由于显示地址实际含义的差异,ndisasm 通常只擅长反汇编平面二进制文件,如引导加载程序和 MS-DOS .COM 文件。在这种情况下,您可以告诉它程序将在内存中加载的位置(使用 -o
选项),因此显示的地址是一致的并反映程序在内存中的加载位置。
我正在使用 ndisasm 反汇编程序。我的问题是调用指令和跳转之后的内存引用是什么意思?
它们是相对于指令还是从程序开始算起?他们指的是 ndisasm 输出文本第一列中的地址吗?
它指的是输出第一列给出的地址,通常也是指令相对于文件开头的位置。该程序不知道代码将加载到内存中的哪个位置,因此通常无法告诉您目标实际位于内存中的哪个位置。
请注意,这仅适用于 near 直接跳转和调用指令(包括条件 Jcc 跳转指令)的目标地址,因为这些地址是相对于指令编码的。其他指令中的地址不使用相对编码,因此显示的地址不是指第一列中的地址。相反,它是在运行时使用的实际地址,假设程序在加载到内存中时没有重新定位到其他地方。
(64位RIP相对寻址是上述的一个例外,使用这种寻址方式的指令使用相对地址编码。)
由于显示地址实际含义的差异,ndisasm 通常只擅长反汇编平面二进制文件,如引导加载程序和 MS-DOS .COM 文件。在这种情况下,您可以告诉它程序将在内存中加载的位置(使用 -o
选项),因此显示的地址是一致的并反映程序在内存中的加载位置。