来自高级编程背景,我有兴趣学习低级编程.我想知道如何编译编译器?
在查看wiki中的一些文章后,数字机器代码被认为是最低级语言,但必须有一个编译器来编译这个机器代码.编写的编译器是什么语言?
基本的电脑操作问题,但我不知道如何问.当我们说计算机有一个指令集时,计算机如何知道该集合是什么?它在机器内部的ROM芯片上?它在某个地方的cpu上?制造商把它放在哪里,以便它可以读取磁盘并开始阅读汇编程序机器代码?谢谢.
这个问题是在乞求一堆“你为什么要这样做?” 回应。
我无法在68k 程序员参考手册 中找到此信息,但这可能是因为我不确定要搜索什么措辞。
这是 68kADD操作码的指令格式。

位 0-2 和 9-11 指定寄存器。68k 寄存器的二进制表示是什么?它们是“地址”吗?
是的,我知道我可以编写 68k 汇编程序并对其进行调试以找到此信息。我正在寻找参考。谢谢!
我有三个问题:
我的目标: 我正在尝试制作一个基本的操作系统。这将使用个人制作的引导加载程序和内核。我也会尝试从 Linux 内核(即驱动程序)中获取一些零碎的东西,并将它们集成到我的内核中。我希望创建一个 32 位类似 DOS 的操作系统来处理大多数现代计算机上的内存。我认为我不会为我的操作系统创建可执行格式,因为我的操作系统不会动态到需要它。
我的情况: 我在带有 Intel Celeron CPU 的 x86-64 windows 8 笔记本电脑上运行;我相信它使用安全启动。我将在带有 Intel Core I3 CPU 的 x86-64 台式机上测试我的操作系统。我对操作系统及其技术有一般的了解。我知道这个项目所需的 C、ASM 和计算机理论。我认为值得一提的是,我 16 岁,没有接受过计算机科学方面的正规教育。
我的研究:在谷歌搜索 C 通常编译成的内容后,我找到了机器代码、二进制、纯二进制、原始二进制、汇编和可重定位目标代码的答案。据我所知,程序集通常会组装成 PE 格式的可执行文件。我听说过 Cygwin、GCC C 和 MingW C 编译器。至于汇编程序,我听说过 FASM、MASM 和 NASM。我搜索过OSDev和OSDever等网站。
我尝试过的:我尝试设置 GCC(一个噩梦)并创建一个交叉编译器(另一个噩梦)。
结论:如您所知,我对编译器、汇编器和可执行格式感到困惑。请消除我的无知并回答我的问题。这些可能是唯一让我无法在简历上安装操作系统的原因。抱歉,我会包含更多链接,但是 stackoverflow 不会让我创建两个以上的链接。万分感谢!
考虑到 C 是一种系统编程语言,如何将 C 代码编译为可以在没有操作系统的情况下调用的原始 x86 机器代码?(即:您可以假设我有一个引导扇区,它将原始机器代码从磁盘加载到内存中,然后直接跳转到第一条指令)。
现在,为了加分:理想情况下,我想使用 Visual Studio 2010 的编译器进行编译,因为我已经有了它。如果做不到这一点,那么完成任务的最佳方法是什么,而不必安装一堆依赖项或必须在整个系统中进行大规模的彻底配置更改?我会在 Windows 7 上进行编译。
来自Intel 的 x86 手册,第 2 卷,第 3.1.1.2 节:指令汇总表中的操作码列(带有 VEX 前缀的指令)
NDS、NDD、DDS:指定 VEX.vvvv 字段对于寄存器操作数的编码有效:
- VEX.NDS:VEX.vvvv 以指令语法对第一个源寄存器进行编码,其中源寄存器的内容将被保留。
- VEX.NDD:VEX.vvvv 对 ModR/M:reg 字段无法编码的目标寄存器进行编码。
- VEX.DDS:VEX.vvvv 以三操作数指令语法对第二个源寄存器进行编码,其中第一个源寄存器的内容将被结果覆盖。
我认为这与“非破坏性来源”有关,我认为这就是 NDS 所代表的意思。其他代表什么?这如何影响指令的编码?同样,为什么它们很重要 - 因为据我所知,AMD 手册不包含任何对这些术语的参考?
我猜想Wasm二进制文件通常是JIT编译为本机代码,但是如果有Wasm源,是否有工具可以查看实际生成的x86-64机器代码?或以不同的方式询问,是否存在使用Wasm并输出本机代码的工具?
EVEX.z 位在 AVX-512 中与 k 寄存器结合使用以控制屏蔽。如果 z 位为 0,则为合并屏蔽,如果 z 位为 1,则 k 寄存器中的零元素在输出中为零。
语法如下所示:
VPSUBQ zmm0{k2}{z},zmm1,zmm2
Run Code Online (Sandbox Code Playgroud)
其中 {z} 代表 z 位。
但是如何设置或测试 EVEX.z 位?我搜索了我能找到的所有资源,但没有找到答案。
在ARM64汇编代码中,寄存器号31什么时候表示XZR,什么时候表示SP?
我正在尝试围绕 x86 指令编码格式。我阅读的所有资料仍然使这个主题变得混乱。我开始有点理解它,但我无法理解的一件事是 CPU 指令解码器如何区分操作码前缀和操作码。
我知道指令的整个格式基本上取决于操作码(当然在操作码中定义了额外的位字段)。有时指令没有前缀,操作码是第一个字节。解码器怎么知道?
我假设指令解码器能够分辨出差异,因为操作码字节和前缀字节不会共享相同的二进制值。因此解码器可以判断字节中唯一的二进制数是指令还是前缀。例如(在本例中,我们将坚持使用单字节操作码)REX或LOCK前缀不会与架构指令集中的任何操作码共享相同的字节值。
x86 assembly cpu-architecture machine-code instruction-encoding
machine-code ×10
assembly ×6
x86 ×3
c ×2
compilation ×2
x86-64 ×2
68000 ×1
arm64 ×1
avx512 ×1
cpu ×1
executable ×1
instructions ×1
intel ×1
low-level ×1
webassembly ×1