首页 > 解决方案 > 为什么 hello world 在 C 中生成的汇编代码没有 .code 段,也没有像 x86 汇编那样的微小模型?

问题描述

本学期我正在学习 80x86 的汇编。我写的一个典型的 asm 文件看起来像

.model tiny
.486
.data
#initializations
.code
.startup
#actual code
.exit
end

当我为一个简单的 hello world 创建一个 .s 文件时,我期待类似的格式。但我没有看到任何具有专有名称的片段,而且它们都非常不同。我编译使用g++ -S -O0 hello.c

为什么 c 的程序集与他们让我们在课堂上编写的程序集如此不同?我正在学习的程序集是否被不同的编程语言使用?如果我想从一些更高级别的代码中获取 hello world 的汇编版本(我已经习惯了),我该怎么做?

标签: cassemblygccx86

解决方案


该代码与您的命令行不匹配。那既不是 C(文件名)也不是 C++ 代码(命令行)。那就是汇编语言。

汇编语言因工具(masm、tasm、nasm、gas 等)而异,预计不会以任何方式兼容或标准化。不只是谈论英特尔与 at&t 的所有代码,这适用于所有目标,而不仅仅是 x86,很容易在 ARM 和其他人身上看到。

您应该尝试使用汇编程序而不是 C 或 C++ 编译器,因为它会创建另一种汇编语言,即使 gcc 例如会将汇编语言传递给 gas,它可以通过 C 预处理器对其进行预处理,从而创建另一种编程语言与提供给它的 gnu 汇编器不兼容。

x86 是您想要学习的最后一个汇编语言/指令集,如果您要学习它,那么从 8086/88 开始是 IMO 的首选方式,尽管存在细微差别,但更容易理解。由于这似乎是一门课程,因此您被此 ISA 卡住,无法选择更好的第一个指令集。(第一第二第三...)

在 x86 世界中非常多,但对于任何其他目标,都希望该语言在工具之间不兼容,如果它恰好工作或大部分工作,那是一个奖励。同样,没有理由假设任何工具都将具有“masm compatible”或其他模式,只需说明 intel 与 at&t 只是语言问题的一小部分,并且绝不会期望在工具之间进行代码移植。

为汇编程序使用的汇编语言重新编写代码是底线。


推荐阅读