关于装配的一些一般信息

时间:2012-03-07 13:42:55

标签: assembly cpu low-level

我不小心结束了这里:http://altdevblogaday.com/2011/11/09/a-low-level-curriculum-for-c-and-c/,结果证明这是迄今为止我读过的最丰富的内容之一。我知道汇编是某种低级语言,可以由处理器直接执行,但是,我也读到每个处理器都有它自己的汇编。

问题:

  • 这是真的吗?
  • 我可以在上网本和PC上运行一些基本程序集吗?
  • AVR(使用RISC架构的人)和使用CISC的x86处理器(他们使用的指令集)之间的唯一区别是什么?
  • 如何运行汇编代码以及存储哪种文件?

3 个答案:

答案 0 :(得分:2)

每个处理器架构都有自己的汇编语言,这意味着它自己的指令集。大多数指令集都相当类似,所以通过学习它们中的任何一个,你至少有机会弄清楚另一个架构正在发生什么。如果您的上网本和PC都是某种* 86,它们可能几乎相同。

尝试汇编的最简单方法是在C程序中嵌入一些汇编代码。这称为“内联汇编”(您可以通过Google搜索找到一些示例)。这允许您让C程序执行输入和输出等高级操作,并让程序集只对该数据进行一些计算。

答案 1 :(得分:2)

每个处理器系列都有自己的指令集。

有些汇编程序可以转换来自两个(或更多)不同指令集的输入 - 例如,Google“表驱动汇编程序”。这些通常在它们使用的所有处理器上使用类似的语法,这些处理器可能(通常是)从与处理器“本机”的汇编程序(例如,处理器供应商提供的汇编程序)略有不同或完全不同。

正如这表明的那样,处理器中还有两个(或更多)不同的汇编程序,广泛使用,有时使用完全不同的语法。仅举一个明显的例子,在x86处理器上,英特尔语法和AT& T语法都是常用的。

从编程的角度来看,处理器的指令集和可用的寄存器几乎都是该处理器可见的。这两者在处理器之间(根本上)不同。

用汇编语言编写的代码通常存储在源文件中。扩展名随汇编程序而变化(例如,“。asm”或“.S”)。你组装的就像编译用更高级语言编写的代码一样。这会产生一个目标文件。从那里你链接产生一个可执行文件,就像任何其他目标文件一样。

答案 2 :(得分:1)

  1. 是的,是的。虽然来自同一系列的两个处理器可能具有不同的汇编语言,但实际上一种语言可能是另一种语言的扩展。有时来自不同制造商(例如Intel和AMD)的处理器共享大量的指令集。此外,尽管有大量的汇编语言,但它们都有相对较少的基本概念。一旦学会用一种汇编语言编程,学习第二种汇编语言通常可以轻松完成一个数量级。当然,这条规则也有例外:例如,学习遵循哈佛架构的CPU的程序集比学习第二个冯诺依曼程序集稍微复杂一些。在RISC和CISC之间切换也可能带来挑战。
  2. 这取决于:如果您的PC和上网本拥有来自同一家庭的CPU,您可能会很幸运。但是,除了能够运行汇编语言程序的指令集之外,操作系统也非常重要。例如,Linux和Windows不共享相同格式的可执行文件。
  3. 硬件比指令集要多得多。有些CPU具有相同的指令集,使用非常不同的硬件。典型的例子是8088与8086:它们的指令集完全相同,但由于外部数据总线的宽度,它们的硬件基本相同。
  4. 首先编译汇编代码,就像编写C程序一样。 .asm是汇编程序的典型扩展,但它远非普遍规则。您还可以使用特定于编译器的扩展将汇编嵌入到C / C ++文件中。