【发布时间】:2012-05-10 12:24:07
【问题描述】:
我一直在阅读有关汇编的信息。从我对编程语言的理解来看,编译器(汇编器......我知道在其他地方争论的两者之间存在细微的差异),生成目标代码。大量没有指令的不友好的机器语言。该目标代码由处理器解释,然后链接器使其成为可执行文件。我知道每个处理器都必须在其正确的组装中进行交谈。 IE。 .386, .486, .586 令我困惑的是通过 MASM 运行 DOS 程序和通过没有 NASM 或 GAS 的 Linux 运行相同程序之间的差异。如果源代码编译成目标代码,此时不是跨平台吗?我可以像 Linux 一样简单地从我的戴尔双启动 Windows。我在这里错过了什么?
我也一直在寻找一种查看目标代码的方法,这样我就不必通过 Immunity Debugger 来破译执行。只是我编写的源代码的指令机器代码指令。有没有办法在 Linux 中产生类似 objdump 的结果?
【问题讨论】:
-
DOS 以(16 位)实模式执行,这与 32 位 Windows/Linux 中使用的保护模式有很大不同。它是如此不同,以至于它可以被认为是不同的架构(如 ARM 与 MIPS),因此它不再是跨平台的。 Windows 使用一种特殊的硬件兼容模式(虚拟模式)来执行 DOS 二进制文件,但在较新的 (x86_64) 系统上,即使这样也不可能了
-
问题的核心是虽然汇编是低级的,但它仍然必须与操作系统接口。而且由于它的级别有多低,它必须使用最低级别的调用机制与操作系统进行交互,这在操作系统之间是完全不同的。此外,程序集通常直接访问自身进程的内存,根据操作系统的不同,其布局完全不同。你见过 DOS 和 Linux 上命令行参数所需的不同汇编源吗?
-
@Linuxios 是否可以在 windows linux 和 mac 的可执行文件中使用机器代码?
标签: windows linux assembly masm