【问题标题】:Is "assembly language" different with or without an OS?有或没有操作系统,“汇编语言”是否不同?
【发布时间】:2014-09-09 17:13:12
【问题描述】:

我正在阅读一本关于 x86/x86-64 汇编编程的书。 在那本书中,几乎所有的实验都是由“加载器”加载的。 这让我很困惑,因为我以前从未使用过这种汇编代码。

我想知道从-S--emit-asm 编译器选项生成的程序集是否在操作系统抽象硬件的“虚拟环境”中运行?

当我在编译器输出的 asm 文件中看到 eaxxmm0esp 时, 它们是指我CPU中的真实寄存器吗?或者只是一个将在运行时由操作系统解释的概念对象?

【问题讨论】:

  • 我猜eax,esp等。对应于处理器中存在的真实 32 位寄存器!
  • 即使对于 x86/x86-64 程序集,您也可以找到不同的符号,您有 Intel 语法(例如:mov eax,[ecx])和 AT&T 语法(相同的例如:movl ( %ecx),%eax)。但是寄存器是一样的,是一样的架构。如果您查看 ARM(或其他),您会看到不同的寄存器。并且指令集在给定处理器上的所有操作系统中都是相同的。
  • 机器码相同,但执行环境不同。这包括您运行的权限级别、可以调用的服务、代码的加载方式等等。
  • 您正在查看文件中字节的友好表示。该文件需要先加载到内存中,然后处理器才能执行程序。这是装载机的工作。

标签: assembly operating-system bootloader


【解决方案1】:

我想知道从 -S 或 --emit-asm 编译器选项生成的程序集是否在操作系统抽象硬件的“虚拟环境”中运行?

在大多数情况下,它是相同的物理硬件。如果您在虚拟机环境(VMWare、HyperV)中运行,那么它自然是抽象的。

在某些情况下,操作系统确实对硬件进行了抽象。有时会模拟过时和不受支持的指令。操作系统有时允许通过模拟 INP/OUTP 命令与某些硬件外围设备进行交互——这些命令通常禁止用于非内核代码。

某些命令在操作系统下的工作方式与它们在裸机上的工作方式不同 - 例如,堆栈增长是通过保护页面实现的,其中超出允许区域的内存访问会导致操作系统控制并增长堆栈。

当涉及到普通命令(例如mov eax, esp)时,它是在物理硬件上执行的。

【讨论】:

    【解决方案2】:

    这些是真正的寄存器,而汇编语言随着计算机体系结构的变化而变化,因此寄存器

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多