繁体   English   中英

编译后的c可执行程序如何知道如何在特定的内存地址处表示一系列位?

[英]How does a compiled c executible know how to represent a series of bits at a specific memory address?

我了解在编译过程中C变量将替换为内存地址,并且类型为info的符号表无法在编译后生存。

我试图了解在编程执行过程中如何存储和检索数据(表示)。 我知道变量已映射到内存地址,并且我的预编译代码指定了类型(位数和读取方式)。 但是,如果在代码被编译为可执行文件时类型丢失了,那么机器代码(.exe)如何知道特定内存地址上的数据大小以及如何表示这些位?

我已经问过许多类似的问题,但是答案总是被框定为CPU不在乎或不知道该系列比特打算代表什么。 但是,这并不是我要问的。 我想知道可执行程序如何知道有效位数,以及在类型(整数,字符,双精度,字符串或位域)未知的情况下如何读取(表示)它们?

编译器生成专门用于其所需功能的机器指令。 (这可以分多个步骤完成,以编译器自己的语言生成中间代码,然后将其转换为汇编语言,然后将其汇编为机器指令。)

机器说明具有特定的形式,例如:

  • 从地址1234将32位加载到寄存器8中
  • 将寄存器7中的64位存储到地址4320中。
  • 从当前程序计数器之后的9000字节内存中将32位加载到寄存器3中。
  • 将寄存器4中的8位存储到堆栈指针之外的124个字节的存储器中。
  • 从寄存器3加到寄存器4中。
  • 比较寄存器3与寄存器4。
  • 如果最后一个比较指示符号大于,则分支。
  • 将寄存器4的内容右移5位(“逻辑上”填充零)。
  • 将寄存器4的内容右移5位(“算术地”,将符号位复制)。

因此,如果您的程序正在读取char值,则编译器会生成一条指令以加载8位。 如果您的程序正在读取一个int值,则编译器会生成一条指令以加载32位(假定int在您的C实现中为32位)。

在许多指令中,处理器不需要知道数据类型是什么。 加载32位就是加载32位,无论这些位是int还是指针。 即使在添加有符号或无符号整数时,也要设计位模式,以便一个加法指令可用于有符号或无符号整数。

一些指令需要知道数据类型。 有符号和无符号整数不能与相同的指令进行比较。 对于有符号的32位int ,位0xffffffff表示-1,该值小于0(位0x00000000),但是对于无符号的int ,这些位表示4,294,967,295,该值大于零。 因此,对于x < y ,如果它们是带符号的,则编译器将生成一条指令;如果它们是无符号的,则编译器将生成另一条指令。 (实际上,可能有一个比较指令针对多种类型的数据,但它会产生多个指示各种可能结果的位,而另一条指令会根据结果测试这些位和分支。如果比较指令未针对数据类型进行定制,然后是测试和分支指令。)

暂无
暂无

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

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