WriteDec получает свой аргумент в EAX .Это печать, а не указатель (!), Который вы помещаете в EDX.WriteDec принимает целое число по значению
Когда вы звоните WriteDec
в первый раз (по первому четному номеру после 3), EAX = 4/2 = 2
, так что это то, что вы печатаете.Используйте отладчик для просмотра регистров, вы, вероятно, видели бы 2
в EAX.
И, кстати, ваш цикл проверяет только четные числа, а не все композиты.(И вы делаете это массово неэффективно. Даже тривиально, просто test al,1
, чтобы протестировать младший бит EAX. Эта версия готова для нас перейти к циклу пробного деления послеИсключение четных чисел, но на данный момент самое простое разветвление - это просто распечатка или нет.
mov ecx, terms
mov ebx, current
trial: ; do {
inc ebx
test bl, 1
jnz odd ; low bit set = not divisible by 2 = odd
;; TODO: trial division loop after ruling out even numbers
;; mov eax,ebx
;; xor edx,edx
;; div something in a loop
even:
mov eax, ebx ; WriteDec takes an arg in EAX, and preserves all others
call WriteDec
call CrLf
odd:
cmp ebx, ecx
jb trial ; }while(current < terms)
;; The loop instruction is inefficient, don't bother with it
;; and you don't need a down-counter for the loop anyway
;; you already have terms
mov current, ebx ; in case you care?
Самый простой способ проверить составную часть - это пробное деление: Проверка, есличисло простое в NASM Win64 Assembly .
Если вы хотите напечатать все композиты до определенного числа, было бы намного эффективнее запустить Сито Эратосфена длянайти нечетные композиты до достаточно высокого значения, затем циклически печатать каждое четное число и нечетные числа, если в решетке установлена их запись растрового изображения или байтовой карты.