c - 我将 C 代码翻译成 CPU 指令是否正确?

标签 c memory-management instructions processing-instruction

对于这段代码:

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

在编译时,编译器会计算它需要多少空间。我们有 2 个整数和一个指针。所以它是 2*4 + 8 = 16。然后它指定给定变量的内存相对于起始点地址的位置。 pa是起始地址,长度为8字节。 b 位于起始地址 + 8 个字节,长度为 4 个字节。 a在起点地址+12字节,长度为4字节。

然后去指令执行时间:

  1. 要求操作系统分配 16 个字节并为内存中的该空间提供地址。这将是起点地址。
  2. 1的二进制表示放在a的位置。
  3. 2的二进制表示放在b的位置。
  4. a的相对地址(起点地址+12字节)翻译成它的绝对位置,放在pa的位置。
  5. 获取位置a 的字节和位置b 的字节,将它们相加,然后获取位置pa 的字节。使用位于 pa 位置的字节作为地址,并将计算出的总和放在那里。
  6. 打印位置 a 的字节,首先将它们转换为十进制数。
  7. 释放内存并让操作系统知道程序已完成。

这是一个有效的翻译吗?

编辑:

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

最佳答案

这几乎是一种翻译它的方式(a),尽管函数的局部变量通常在堆栈上分配,而不是向操作系统请求一定数量的内存来存储它们。

当然,使用智能编译器,源代码中有足够的信息可以简单地将整个事情优化为:

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

(a) ISO C 标准不规定如何事情在幕后完成,只是规定它们以特定方式运行。将 C 视为实现标准的虚拟机。 VM 如何执行它并不真正相关,并且除了行为之外当然没有以任何方式强制执行。

关于c - 我将 C 代码翻译成 CPU 指令是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52181952/

相关文章:

c,如何检测另一个进程是否正在写入文件

c++ - 除了使用 new 之外,还有什么会导致内存泄漏? (c++)

memory-management - 查找 Solaris 中从虚拟页到物理页的映射

c - 从文件加载到链表

c - 输入更多字符会跳过提示

c - 使用 strtok 的奇怪标记结果

合并内存并处理 C 中的指针运算

assembly - while 搜索字符串的每个字符并在 emu8086 中更改它如何结束无限循环?

assembly - 如何在不影响rip相对寻址的情况下正确链接两个目标文件?

c - 每个 C 指令有多少个 asm 指令?