【发布时间】:2017-05-03 20:32:27
【问题描述】:
假设我们有一个简单的代码:
int* q = new int(13);
int main() {
return 0;
}
很明显,变量q 是全局变量并已初始化。从this answer,我们期望q变量存储在程序文件中的初始化数据段(.data)中,但它是一个指针,所以它是值(这是堆段中的地址)是在运行时确定的。那么程序文件中数据段中存储的值是多少呢?
我的尝试:
在我的想法中,编译器在 data 段中为变量q(64 位地址通常为 8 个字节)分配了一些空间,没有有意义的值。然后,在main函数代码之前的text段中放置一些初始化代码,以在运行时初始化q变量。汇编中的这样的东西:
....
mov edi, 4
call operator new(unsigned long)
mov DWORD PTR [rax], 13 // rax: 64 bit address (pointer value)
// offset : q variable offset in data segment, calculated by compiler
mov QWORD PTR [ds+offset], rax // store address in data segment
....
main:
....
有什么想法吗?
【问题讨论】:
-
与
gcc链接时,默认起点为_start。此初始化将在其中包含代码,然后它将调用main。所以人们在没有 clib 的情况下进行汇编编程,但与gcc链接,必须在他们的代码开头放置_start:标签,而链接默认 clib 的人从main:开始(在他们的源代码中,二进制文件从 @ 987654335@ 来自 lib)。 :) -
详细说明,
_start不是函数,因此您不能在 C 或 C++ 中编写_start。在汇编中,你不必写函数,你可以写任意代码,所以你可以自己写_start。 -
知道了,谢谢 Ped7g 和 Dietrich Epp。
-
int *q将进入.bss,而不是.data部分,因为它仅在运行时由构造函数初始化。可执行文件的数据段中不需要有 8 个字节。
标签: c++ pointers assembly heap-memory compile-time