【问题标题】:Assembly instruction address汇编指令地址
【发布时间】:2010-06-14 14:49:03
【问题描述】:

为什么每次我反汇编同一个 .exe 文件时,相同的指令在同一个地址?那是什么地址(RAM?HDD?虚拟?)?

【问题讨论】:

    标签: assembly disassembly virtual-address-space


    【解决方案1】:

    基本思想是,为了允许程序的可移植性并允许不同的程序在同一系统上运行而不会发生冲突,您所看到的基本上相当于操作系统在程序运行时将其转换为实际地址的相对地址。

    您完全需要地址的原因是指令引用了其他指令的地址,例如跳转。

    【讨论】:

    • 我看不出这与虚拟地址有什么关系。操作系统加载程序会根据内存中的图像加载位置更改函数地址,而不管地址如何解析(虚拟或非虚拟)。
    • 确实如此;我想我是在混淆概念。编辑了我的答案以删除该部分。
    【解决方案2】:

    没有理由。这就是那个操作系统上的可执行/链接格式决定如何工作的。每种架构都是不同的,例如,即使在 x86 和 x64 上,可执行文件也可以加载到随机的虚拟地址,或者每次都加载到同一个地址。反汇编器将给出文件中的偏移量或虚拟地址,它只是在运行时确定的基地址 + 文件偏移量,可能还有节偏移量。这是高度架构依赖,所以我真的不能给出一个具体的答案......

    【讨论】:

    • 做某事有不同的方法这一事实并不意味着没有理由。
    • @danben:在 x86 上,数据总是获得相同的虚拟地址,因为指令直接指向那些 VA,在 x86 中这样做更方便,所以它就是这样完成的。但是对于图书馆,虚拟地址必须是可重定位的,否则你会遇到冲突。在 x64 上,引用相对地址同样容易。所以没有理由使用直接寻址,因此每次运行都使用相同的 VA,它刚刚完成是因为开发人员觉得这样做......尽管现在所有酷孩子都使用 ASLR,所以那里不像以前那么多的静态 VA 基础。
    • 我唯一的一点是你必须做 something 以避免冲突/提高安全性,我相信这是对 OP 问题的答案 - 我不不认为他在问一种技术相对于另一种技术的优点。
    • @danben,他问为什么代码每次都加载到相同(不不同)的地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多