【发布时间】:2014-09-09 17:13:12
【问题描述】:
我正在阅读一本关于 x86/x86-64 汇编编程的书。 在那本书中,几乎所有的实验都是由“加载器”加载的。 这让我很困惑,因为我以前从未使用过这种汇编代码。
我想知道从-S 或--emit-asm 编译器选项生成的程序集是否在操作系统抽象硬件的“虚拟环境”中运行?
当我在编译器输出的 asm 文件中看到 eax、xmm0 或 esp 时,
它们是指我CPU中的真实寄存器吗?或者只是一个将在运行时由操作系统解释的概念对象?
【问题讨论】:
-
我猜
eax,esp等。对应于处理器中存在的真实 32 位寄存器! -
即使对于 x86/x86-64 程序集,您也可以找到不同的符号,您有 Intel 语法(例如:mov eax,[ecx])和 AT&T 语法(相同的例如:movl ( %ecx),%eax)。但是寄存器是一样的,是一样的架构。如果您查看 ARM(或其他),您会看到不同的寄存器。并且指令集在给定处理器上的所有操作系统中都是相同的。
-
机器码相同,但执行环境不同。这包括您运行的权限级别、可以调用的服务、代码的加载方式等等。
-
您正在查看文件中字节的友好表示。该文件需要先加载到内存中,然后处理器才能执行程序。这是装载机的工作。
标签: assembly operating-system bootloader