Мне нужно внедрить сито из эратосфена в 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 для каждого при циклическом просмотре «массива стека».