Знающие ассемблер Masm прошу!!!

    • DjRMaestro
      DjRMaestro
      Золото
      На форуме с: 25.02.2008 Сообщения: 3.519
      Значит проблема такая:
      Есть код на С++, вот он:
      #include <stdio.h>
      #define N 20000
      //алгоритм "решето Эратосфена"
      unsigned int a[N];
      void main(){
      //заполним все ячейки числами по порядку: 0,1,2,3...
      for(int i=0; i<N; i++){
      a[i] = i;
      }
      //поскольку 1 не простое число, обнулим ячейку с этим числом
      a[1]=0;
      for(int s=2; s<N; s++){
      if(a[s]!=0){
      for(int j=s*2; j<N; j+=s){
      a[j]=0;
      }
      }
      }
      for(i=0; i<N; i++){
      if(a[i]!=0){
      printf("%d\n", a[i]);
      }
      }
      }

      Это код нахождения простых чисел методом решета Эратосфена.
      Я (строго не судите, студент, ничего не знаю) написал код на масме, но наделал кучу косяков.
      Собственно код вот:
      .386
      .model flat, stdcall
      option casemap:none
      include \9-II-SKS\myasm\include\windows.inc
      include \9-II-SKS\myasm\include\kernel32.inc
      include \9-II-SKS\myasm\include\user32.inc
      includelib \9-II-SKS\myasm\lib\user32.lib
      includelib \9-II-SKS\myasm\lib\kernel32.lib
      BSIZE equ 100
      BSZZ equ 15
      .data
      stdout DWORD ?
      cWritten DWORD ?
      nn DWORD ?
      digit DWORD ?
      mn DWORD ?
      per DWORD ?
      Massive DWORD BSIZE dup (?)
      ifmt BYTE "%d",0
      buf BYTE BSIZE dup (?)
      crlf BYTE 0dh, 0ah
      .code
      start:
      invoke GetStdHandle,STD_OUTPUT_HANDLE
      mov stdout, eax
      mov ecx, BSIZE
      mov ebx,0
      mov edi,0
      nxt:
      mov Massive[edi], ebx
      inc ebx
      add edi,4
      loop nxt
      mov Massive [1],0
      mov edi,0
      nxt1:
      inc edi
      mov edx, Massive[edi]
      mov digit, edx
      cmp edi, BSIZE
      jnz nxt3
      cmp digit,0
      jnz nxt1
      mov nn,edi
      mov eax,2
      mul edi
      nxt2:
      mov Massive[eax],0
      add eax,nn
      cmp eax,BSIZE
      ja nxt1
      jnz nxt2
      nxt3:
      mov edi, 0
      mov eax,0
      nxt4:
      mov edx, Massive[edi]
      mov per, edx
      add edi,4
      cmp per,0
      jnz nxt4
      mov eax, Massive[edi]
      invoke wsprintf,ADDR buf,ADDR ifmt,eax
      invoke WriteConsoleA,stdout,ADDR buf,BSZZ,ADDR cWritten,NULL
      cmp edi,BSIZE
      jnz nxt4
      jnz exit
      exit:
      invoke ExitProcess,0
      end start

      Короче говоря мозги кипели, и наделал всякой чуши:(

      Кто есть знающий подскажите на косяки, и помогите доделать плз. ПРОШУ строго не судите это моя почти первая прога на ассемблере:)
  • 1 ответ
    • Pret
      Pret
      Бронза
      На форуме с: 01.03.2007 Сообщения: 454
      лень читать асм но если асм = си выше, то для етого есть "конверторы" с любого высокоуровнего языка можно перегнать код в асм. Поискай такую штуку и оттуда отталкиваться попробуй.