Я использую 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) :( какое-то случайное число)" Я получилОшибка сегмента (ядро сброшено)