Ошибка сегментации при попытке доступа к памяти стека с помощью rsp (64-битная сборка NASM) - PullRequest
0 голосов
/ 07 октября 2019

Мне нужно внедрить сито из эратосфена в 64-х битный насм. Это должно быть быстро, и мне сказали использовать стек. Но когда я пытаюсь получить доступ к стеку при использовании больших чисел (наибольшее число, которое работает около 1'047'000, самое большое, которое должно работать - 100'000'000), это приводит к ошибке сегментации. Есть ли другой способ решить эту проблему с помощью стека?

    MOV rax, [inputNr]  ; copy the input number to rax
    SHL rax, 3      ; multiply with the size of an element (8)
    SUB rsp, rax        ; stack now points to the start of the array

    MOV byte [rsp], 1   ; zero is not prime
    MOV byte [rsp+8], 1 ; one is not prime
    MOV rcx, 2      ; as 2 is our first prime we start here
L1: 
    CMP byte [rsp+rcx*8], 1 ; compare the number to 1 (not prime)
    JNE prime       ; if not equal it is prime got to increment the counter and set multiple of this number to 1
    JE skip
prime:
    CALL isPrime        ; the number is prime, save this in the array and eliminate multiples of it

skip:   
    INC rcx         ; increment the counter
    MOV rax, rcx        ; copy the value of the counter to eax
    MOV rbx, rcx        ; copy it too to ebx
    MUL rbx         ; square the counter
    CMP rax, [inputNr]  ; compare the square of counter to the input nr
    JL L1           ; if smaller continue loop

Ошибка сегментации в этой точке: MOV byte [rsp], 1 У нас также нет возможности расширить наш стек для этой программы, поэтому должно бытьОбходной путь.

isPrime просто удаляет все кратные фактического простого числа с настройкой 1 для каждого при циклическом просмотре «массива стека».

...