mov [esp-4], eax ; save input value
Если вы планируете использовать локальную переменную, для которой вы зарезервировали комнату, вы должны написать:
mov [esp], eax ; save input value
или альтернативно написать:
mov [ebp-4], eax ; save input value
Правильный пролог / эпилог будет выглядеть так:
push ebp
mov ebp, esp
sub esp, 4 ; local variable
mov eax, [ebp+8] ; store input value
...
NotP:
mov eax, 0
pop ebp ; remove local variable
pop ebp
ret
Prime:
mov eax, 1
pop ebp ; remove local variable
pop ebp
ret
isPrime endp
cmp edx, 0 ; check remainder
je NotP ; if remainder=0 then not prime
jmp Prime
loop L1
Найти остаток, отличный от нуля, недостаточно, чтобы сделать вывод, что числопремьер!Нужны дополнительные тесты.Пока эта инструкция loop L1
никогда не выполняется.
Например, чтобы проверить 15, ваше первое деление выполняет 15/14, что дает ненулевой остаток, но 15 не является простым числом.
L1:
cmp ecx, 3 ; when count=3 to stop
je NotP
Вершина цикла также не может быть правильной!Подумайте о проверке числа 7.
Первое деление - 7/6 и имеет остаток, поэтому цикл должен продолжаться
Второе деление - 7/5 и остаток, поэтому цикл должен продолжаться
Третье деление7/4 и имеет остаток, поэтому цикл должен продолжаться
Вы не пробуете больше делений и делаете вывод, что «не простое», но 7 определенно является простым числом.