📜  编译器设计中目标代码的介绍

📅  最后修改于: 2021-09-27 14:57:52             🧑  作者: Mango

假设您有 ac 程序,然后将 C 程序交给编译器,编译器将生成汇编代码的输出。现在,汇编语言代码将提供给汇编程序,而汇编程序将生成一些代码。这就是所谓的目标代码

汇编

但是,当你编译一个程序时,你不会同时使用编译器和汇编器。你只需要把程序交给编译器,编译器就会给你直接可执行的代码。编译器实际上与加载器和链接器一起在汇编器中组合在一起。所以所有模块都保存在编译器软件本身中。因此,当您调用 gcc 时,您实际上不仅仅是在调用编译器,而是在调用编译器,然后是汇编器,然后是链接器和加载器。

一旦你调用编译器,你的目标代码就会出现在硬盘中。此目标代码包含各个部分 –

编译2

  • 标题 –
    标头将说明此目标代码中存在的各个部分是什么,然后指向该部分。因此标头将说明文本段将要开始的位置和指向它的指针以及数据段将要开始的位置,并说明重定位信息和符号信息在那里。

    它只不过是一个索引,就像你有一本教科书一样,索引页将包含每个主题的页码。同样,标题会告诉您,每个信息所在的宫殿是什么。因此,稍后对于其他软件,直接进入这些部分将很有用。

  • 文本段——
    它只不过是一套指令。
  • 数据段——
    数据段将包含您使用过的任何数据。例如,您可能使用了某些约束,然后该约束将出现在数据段中。
  • 搬迁信息——
    每当您尝试编写程序时,我们通常使用符号来指定任何内容。让我们假设您有指令 1、指令 2、指令 3、指令 4……。
    编译3

    现在如果你在某处说Goto L4(即使你不写高级语言的Goto语句,编译器的输出也会写),那么该代码将被转换为目标代码并且L4将被Goto替换4. 现在 L4 级的 Goto 4 工作正常,只要程序要从地址 0 开始加载。但大多数情况下,RAM 的初始部分将专用于操作系统。即使它不是专用于操作系统的,也可能是其他一些已经在地址 0 处运行的进程。因此,当您要将程序加载到内存中时,意味着是否必须将程序加载到主内存,它可能被加载到任何地方。假设 1000 是新的起始地址,那么所有地址都必须更改,即重新分配
    编译4

    原始地址称为可重定位地址,我们将程序加载到主内存后获得的最终地址称为绝对地址

    符号表——

    它包含您程序中的每个符号。例如,int a, b, c 那么,a, b, c 是符号。它将显示您的程序包含哪些变量。

    调试信息——

    这将有助于找出变量如何持续变化。

    GATE CS 角问题

    练习以下问题将帮助您测试您的知识。所有问题都在前几年的 GATE 或 GATE 模拟测试中提出。强烈建议您练习它们。

    1. GATE-CS-2001 |问题 17