Другие языки программирования и технологии

Люди, которые хоть немного разбираются в ассемблере, помогите написать программу)

Поиск всех составных чисел на заданном диапазоне.
Надо написать программу, отображающую на экране все составные числа на диапазоне от 2 до введённого с клавиатуры целого положительного числа N. При запуске, программа должна запросить верхний предел диапазона проверяемых чисел с помощью функции scanf(). Все числа диапазона должны быть проверены на простоту и составные — выведены на экран с помощью функции printf().
MASM + Masm32 SDK, функции scanf и printf импортируются из библиотеки msvcrt.lib.
Проверка корректности ввода с клавиатуры не производится.

.386
.model flat, stdcall
option casemap:none

include kernel32.inc
include msvcrt.inc
includelib kernel32.lib
includelib msvcrt.lib

.stack 100h

.data
Prompt db 'Введите верхний предел диапазона: ',0
InpFormat db '%i',0
OutFormat db '%8i',0
Result db 'Составные числа от 2 до %i:',13,10,0
QuitPrompt db 13,10,10,'Для завершения работы нажмите любую клавишу... ',0

.data
N dd ?
X dd ?
IntBuf dd ?

.code
N88738523:
    invoke crt_printf,addr Prompt
    invoke crt_scanf,addr InpFormat,addr N
    mov dword ptr X,2
    finit
    fstcw word ptr IntBuf
    or word ptr IntBuf,0C00h
    fldcw word ptr IntBuf
    invoke crt_printf,addr Result,N
MainLoop:
    mov eax,X
    cmp N,eax
    jl Quit
    fild X
    fsqrt
    fistp IntBuf
    mov ecx,IntBuf
TestLoop:
    cmp ecx,2
    jb NextNumber
    mov eax,X
    cdq
    idiv ecx
    test edx,edx
    jz PrintNumber
    dec ecx
    jmp TestLoop
PrintNumber:
    invoke crt_printf,addr OutFormat,X
NextNumber:
    inc dword ptr X
    jmp MainLoop
Quit:
    invoke crt_printf,addr QuitPrompt
WaitKey:
    invoke crt__kbhit
    test eax, eax
    jz WaitKey
    invoke ExitProcess,0
    end N88738523

Максим Червоненко
Максим Червоненко
51 590
Лучший ответ