prints only 7 and 11. I am just starting to learn assembler. Tell me, please, what is the matter? and yes, I also cannot figure out the output of the array for the time being, so I pass it directly from the register.
;программа ищет 10 простых чисел и выводит их на консоль .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc ;wsprintf include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib ;wsprintf includelib \masm32\lib\kernel32.lib BSIZE equ 15 SSIZE equ 10 .data ifmt BYTE "%d",0 buf BYTE BSIZE dup(?) stdout DWORD ? cWritten DWORD ? crlf BYTE 0dh, 0ah .data? PrimeNumbers DWORD SSIZE dup(?) .code start: mov ebx, 3 ;begin from number 3 mov edi, 0 ;0 element of array mov ebp, 0 ;counter of primes nxtdig: mov edx, 0 ;edx:eax число mov eax, ebx mov ecx, ebx ;счетчик цикла sub ecx, 2 ;число проверок меньше проверяемого числа на 2 mov esi, 2 ;начинаем с деления на 2 nxtpr: div esi cmp edx, 0 ;сравниваем остаток с 0 jz skip ;да - идем к след.проверке mov edx, 0 ;no -> mov eax, ebx ;восстан число в edx:eax inc esi ;высчитываем след число для деления loop nxtpr ;проверка edx и конец итерации цикла mov PrimeNumbers[edi], ebx ;если не на что уже делить (ecx = 0) invoke GetStdHandle, STD_OUTPUT_HANDLE ;вывод числа на консоль mov stdout, ebx invoke wsprintf, ADDR buf, ADDR ifmt, ebx ;форматирование числа для вывода invoke WriteConsoleA, stdout, ADDR buf, ;вывод числа BSIZE, ADDR cWritten, NULL invoke WriteConsoleA, stdout, ADDR crlf, 2, ADDR cWritten, NULL ; вывод новая строка (числа в столбик) inc ebp ;увеличиваем счетчик простых чисел cmp ebp, SSIZE ;найдено ли нужное кол-во простых? (10) jz done ;да - выходим add edi, 4 ;нет - след элем массива skip: inc ebx ;увеличиваем - переходим jmp nxtdig ;к следующему числу для проверки done: invoke ExitProcess, 0 end start