Почему я получаю ошибку сегмента, когда у меня длина массива больше 2 - PullRequest
0 голосов
/ 19 июня 2019

Я использую malloc для создания массива (прежде чем меня будут критиковать за использование malloc в c ++, я хочу сделать это только потому, что хотел бы узнать) длины length.Каждый раз, когда у меня длина больше 2, я получаю ошибку сегмента, и я не знаю почему.Когда я использую отладчик, я получаю ошибку сегмента в строке, которая не существует, когда я получаю компилятор для вывода файла .S.

Это для Linux x86-64

Первоначально япопытался создать массив x64 asm, но когда я продолжал получать ошибки сегмента, я пытался писать то же самое на c ++, но я продолжал получать ошибки сегмента

c ++, код, выполняющий то, что fillArrayWithRandom64 без печати

int main(){
    uint64_t length=4;
    uint64_t* arr=(uint64_t*)malloc(8*length);
    for(uint64_t i=0;i<length;i++){
        *(arr+i)=genRandom64();
        cout<<"Value at "<<i<<":"<<*(arr+i)<<endl;
    }
    free(arr);
    return 0;
}

Создает массив и заполняет случайными числами

fillArrayWithRandom64:#rdi is length
#returns pointer to array
    cmp     rdi,0
    jle     _fillArrayWithRandom64Bad

    push    rbp
    mov     rbp,rsp

    push    rdi     #-8     length
    imul    rdi,8
    call    malloc@PLT
    push    rax     #-16    pointer
    pushq   0       #-24    counter

    _fillArrayWithRandom64L1:
        call    genRandom64
        mov     rbx,[rbp-16]
        mov     rcx,[rbp-24]
        mov     [rbx+rcx*8],rax

        inc     rcx
        mov     [rbp-24],rcx
        cmp     rcx,[rbp-8]
        jl      _fillArrayWithRandom64L1

    mov     rax,[rbp-16]
    mov     rsp,rbp
    pop     rbp
    ret
    _fillArrayWithRandom64Bad:
        mov     rax,0
        ret

Моя функция случайных чисел

genRandom64:#returns 64
    call    rand@PLT
    push    rax
    call    rand@PLT
    shl     rax,32
    pop     rbx
    or      rax,rbx
    ret

Мой ожидаемый результат был "Значение в (i) :( какое-то случайное число)" Я получилОшибка сегмента (ядро сброшено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...