代码之家  ›  专栏  ›  技术社区  ›  marzelin

我的C代码到CPU指令的翻译正确吗?

  •  0
  • marzelin  · 技术社区  · 6 年前

    对于此代码:

    int main(void) {
      int a = 1;
      int b = 2;
      int* pa = &a;
      *pa = a + b;
      printf("%d", a);
    }
    

    在编译时,编译器计算它需要多少空间。我们有两个整数和一个指针。的确如此 2*4 + 8 = 16 pa 位于起始点地址,长度为8字节。 b 位于起始地址+8字节处,长度为4字节。 a 位于起始地址+12字节,长度为4字节。

    1. 要求操作系统分配16个字节,并为内存中的空间提供地址。这将是起点地址。
    2. 1 .
    3. 2
    4. 翻译的相对地址 (起始地址+12字节)到它的绝对位置,并将它放在
    5. 获取位置处的字节 和字节的位置 b类 ,添加它们,然后在位置处获取字节 宾夕法尼亚州 宾夕法尼亚州 作为地址,并将计算出的和放在那里。
    6. 打印位置处的字节
    7. 释放内存,让操作系统知道程序已经完成。

    这是有效的翻译吗?

    编辑:

    假设使用了一个超级简单的编译器(没有优化)。它只关心C代码的有效执行。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Antti Haapala -- Слава Україні    6 年前

    据我所知,是的,这是一个有效的翻译。不,这几乎是100%肯定不是你的编译器要产生的翻译。C标准有所谓的 as-if rule 这意味着编译器可以自由生成 任何 犹如

    例如,在实践中,编译器可以生成以下程序:

    • '3' 在函数调用中用作第一个参数的寄存器中
    • 呼叫 putchar
    • 将用作返回值的寄存器归零
    • main 功能

    对于一个观察者来说,这个程序的副作用和你的程序的副作用是无法区分的:它会打印出来 3 具有 0 作为返回值。

        2
  •  4
  •   paxdiablo    6 年前

    差不多了 怎么翻译 ,尽管函数的局部变量通常在堆栈上分配,而不是请求操作系统提供一些内存来存储它们。

    当然,有了智能编译器,源代码中有足够的信息,可以简单地将整个过程优化到:

    int main(void) { putchar('3'); }
    

    ISO C标准没有规定 怎样

        3
  •  1
  •   João Neto    6 年前

    变量 a b pa 将在堆栈中分配。因此,不需要向操作系统请求内存分配——您只需要使用由进程本身控制的堆栈。也许它不会要求16个字节——4个字节就足够了,因为您有效地使用了变量 . 即使那个是常数,所以 可以替换为 1

    第四步: 编译器可能会完全跳过此步骤,因为您没有使用 宾夕法尼亚州 直到下一步重新分配。

    推这两个论点( %d\0 字符串和值 1 printf . 不知道它是否输出到终端——也许 stdout 正在重定向到文件吗?

    最终不可能确切地知道源代码将产生什么指令。取决于体系结构、操作系统/OS版本、编译器/cc版本、编译器标志。。。