繁体   English   中英

C 编译器如何将常量转换为二进制

[英]How does a C compiler convert a constant to binary

为了具体起见,让我们考虑最新版本的 GCC 编译器。

考虑指令int i = 7; .

在组装中它会像

MOV 7, R1

这会将值 7 插入到寄存器 R1。 确切的说明在这里可能并不重要。

据我了解,现在编译器会将MOV指令转换为特定于处理器的 OPCODE。 然后它将分配一个(可能是虚拟的)寄存器。 那么常数值7需要在寄存器中为go。

我的问题:

7实际上是如何转换为二进制的?

编译器实际上是否重复除以 2 以获得二进制表示? (可能之后它将转换为十六进制,但让我们继续进行二进制步骤)。

或者,考虑到 7 是作为文本文件中的字符写入的,是否有一种巧妙的基于查找表的技术将任何字符串(表示数字)转换为二进制值?

如果当前的 GCC 编译器使用内置的 function 将字符串 7 转换为二进制 0111,那么第一个编译器如何将基于文本的字符串转换为二进制值

谢谢你。

7实际上是如何转换为二进制的?

首先,以 2 为基数的二进制数字格式与专业程序员所谓的“二进制可执行文件”之间存在区别,这意味着生成的机器代码,为了方便起见,通常以十六进制表示。 解决后一个含义:

使用二进制文件反汇编(例如在https://godbolt.org/ )并自己查看

int main (void)
{
  int i = 7;
  return i;
}

确实被翻译成类似的东西

mov    eax,0x7
ret  

转换为二进制操作码:

B8 07 00 00 00
C3

其中 B8 = mov eax , B9 = mov ecx等等。 7 被翻译成07 00 00 00因为mov需要 4 个字节,这是一个小端 CPU。

这就是编译器/链接器停止关心的地方。 代码是根据 CPU 的 ABI(应用程序二进制接口)生成的,从这里开始如何处理这个机器码就取决于 CPU。

至于它是如何以 base 2 二进制的实际形式进入硬件的……它已经是那种形式了。 我们在 PC 中看到的一切都是对人类用户的翻译便利,他们比原始二进制更容易阅读十进制或十六进制。

If the current GCC compiler uses built in function to convert a string 7 to a binary 0111, then how did the first compiler convert a text based string to a binary value? 这是鸡蛋鸡的问题,但简单地说这些编译器是逐步创建的,并且在某些时候编译器是用它的语言编写的,例如 c 编译器是由 c 等编写的。

在回答您的问题之前,我们应该定义“编译”的含义或编译器的作用。 简单地说这个编译就是一个管道。 获取您的高级代码执行一些操作并生成汇编代码(特定于机器),机器定义的汇编器获取您的汇编代码并将其转换为二进制 object 文件。
在编译器级别,他们所做的只是在文本文件中创建相应的汇编格式。 在此处输入图像描述

汇编程序是另一个程序,它获取这个text文件并将其转换为“二进制”格式。
汇编器也可以用 c 语言编写,这里我们还需要一个映射,即 movl->(0000110101110...) 但这个是二进制而不是 ascii。 我们需要将这个二进制文件按原样写入文件。
将数字转换为二进制格式也是多余的,因为数字在加载到 memory 时已经是二进制格式。
问题是如何将它们转换/放置到 memory 是操作系统加载程序的问题,超出了我的知识范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM