在内存堆栈上分配空间 - kernel panic

在内存堆栈上分配空间

#include<iostream>
using namespace std;
int times=0;
int d[10]={0,1,2,5,6};
int main()
{
int a[10]={0,1,2,5,6};
int *b=a;
int *i=new int[10]{2,5,6,44};
i[a[1]]=5;
}

全局变量在数据段

times:
        .zero   4
d:
        .long   0
        .long   1
        .long   2
        .long   5
        .long   6
        .zero   20

数组a在堆栈上

        mov     QWORD PTR [rbp-64], 0
        mov     QWORD PTR [rbp-56], 0
        mov     QWORD PTR [rbp-48], 0
        mov     QWORD PTR [rbp-40], 0
        mov     QWORD PTR [rbp-32], 0
        mov     DWORD PTR [rbp-60], 1
        mov     DWORD PTR [rbp-56], 2
        mov     DWORD PTR [rbp-52], 5
        mov     DWORD PTR [rbp-48], 6

指针b指向a

        lea     rax, [rbp-64]
        mov     QWORD PTR [rbp-8], rax

new在堆上分配内存

        mov     edi, 40
        call    operator new[](unsigned long)
        mov     rcx, rax
        mov     rax, rcx
        mov     edx, 9
        mov     DWORD PTR [rax], 2
        add     rax, 4
        sub     rdx, 1
        mov     DWORD PTR [rax], 5
        add     rax, 4
        sub     rdx, 1
        mov     DWORD PTR [rax], 6
        add     rax, 4
        lea     rsi, [rdx-1]
        mov     DWORD PTR [rax], 44
        lea     rdx, [rax+4]
        lea     rax, [rsi-1]
        jmp     .L2

可以看到系统调用new只是返回了内存 ,并没有把数据填进去,数据是后面入的堆

间址 i[a[1]]=5

        mov     eax, DWORD PTR [rbp-60]
        cdqe
        lea     rdx, [0+rax*4]
        mov     rax, QWORD PTR [rbp-16]
        add     rax, rdx
        mov     DWORD PTR [rax], 5

这也说明了没有内存直接到内存的复制

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。