c - 为什么 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 的汇编版本(我已经习惯了),我该怎么做?
解决方案
该代码与您的命令行不匹配。那既不是 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 只是语言问题的一小部分,并且绝不会期望在工具之间进行代码移植。
为汇编程序使用的汇编语言重新编写代码是底线。
推荐阅读
- python-3.x - 识别满足数据框中三个条件的两行组
- asp.net - 如何根据为 vb.net 中的文本框输出设置的条件更改颜色
- mysql - 选择json数组中满足mysql条件的所有对象
- java - 春天。加载带有部分的 application.properties
- cucumber - 如何使用传递的变量更改小黄瓜文本
- python - Numpy:重新编码每个元素所属的五分位数的数值数组
- docker - 通过 kick-start 安装 Docker
- c# - 使用系统范围的互斥锁
- javascript - 使用 dropzone 发送数据
- php - Doctrine - OneToOne 关系不适用于扩展 MappedSuperclass