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

Задачи для Ассемблер

помогите кто чем может ...Найти и вывести на экран все простые числа в интервале от А до В... (А-двухбайтное и В-двухбайтное, вводятся с клавиатуры) напишите код программы хотябы.. .
.386
.model flat, stdcall
option casemap :none

include windows.inc
include msvcrt.inc
includelib msvcrt.lib

.data
  Prompt db "Введите A: ", 0
  Message db "Простые числа в заданном интервале: ", 13, 10, 0
  WaitMsg db 13, 10, 10, "Для завершения работы нажмите любую клавишу... ", 0
  InFmt db "%u", 0
  OutFmt db "%8u", 0

.data?
  A dw ?
  B dw ?
  Tmp dd ?
  Primes dw 6543 dup (?)

.code
N172618774:
    invoke crt_printf, addr Prompt
    invoke crt_scanf, addr InFmt, addr Tmp
    mov ax, word ptr Tmp
    mov A, ax
    inc byte ptr Prompt + 8
    invoke crt_printf, addr Prompt
    invoke crt_scanf, addr InFmt, addr Tmp
    mov ax, word ptr Tmp
    mov B, ax
    cmp ax, A
    jae @F
    xchg A, ax
    mov B, ax
@@:
    mov edi, offset Primes
    mov ax, 2
    stosw
    inc ax
    mov bx, ax
CreatePrimes:
    stosw
CreatePrimesTest:
    cmp B, bx
    jb OutPrimes
    add bx, 2
    mov esi, offset Primes + 2
@@:
    mov ax, [esi]
    mul ax
    test dx, dx
    jnz OutPrimes
    cmp ax, bx
    ja @F
    mov ax, bx
    div word ptr [esi]
    test dx, dx
    jz CreatePrimesTest
    add esi, 2
    jmp @B
@@:
    mov ax, bx
    jmp CreatePrimes

OutPrimes:
    mov ax, bx
    stosw
    invoke crt_printf, addr Message
    mov esi, offset Primes
@@:
    lodsw
    cmp A, ax
    ja @B
@@:
    cmp B, ax
    jb Quit
    movzx eax, ax
    invoke crt_printf, addr OutFmt, eax
    lodsw
    jmp @B

Quit:
    invoke crt_printf, addr WaitMsg
    invoke crt__getch
    invoke crt__exit, NULL

    end N172618774

Ввод и вывод осуществляется библиотечными функциями. Проверка корректности ввода не производится. Максимальное вводимое число не должно превышать 64000.
Компилятор MASM, пакет The Masm32 SDK, ОС Windows 32.

Пример работы:
МП
Максим Пшеницын
51 590
Лучший ответ
Как самый простой вариант, берем пишем прожку на С

#include <stdio.h>

int main() {
short a, b;

scanf("%hd", &a);
scanf("%hd", &b);

if (a > b) {
puts("a > b.");
return -1;
}

for (;a <= b; ++a) {
printf("%hd", a);
}

return 0;
}
Потом смотрим ассемблерный листинг, мусор выкидываем, пишем стандартную инициализацию, а printf, scanf и puts заменяем на вызовы самописных процедур ввода-вывода (это можно загуглить) .
Kamil Półtorak
Kamil Półtorak
3 437