Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. komarvl

    komarvl New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2009
    Сообщения:
    6
    А не могли бы написать всю прогу целиком))) Плиззз))
     
  2. komarvl

    komarvl New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2009
    Сообщения:
    6
    Можете помочь с выводом подсчитаных пробелов?

    Data Segment para 'Data'
    max = 100
    string db ' Input string ? ','$'
    st1 db ' First lagerst word ','$'
    inputs label byte
    maxs db max
    nums db ?
    strs db max dup(' ')
    Data Ends
    Code Segment para 'code'
    Assume cs:Code,ds:lol: ata,es:lol: ata
    include in&out.asm
    Main Proc far
    push DS
    sub AX,AX
    push AX
    mov AX,Data
    mov DS,AX
    mov ES,AX
    lea DX,string
    call outstr
    call newline
    lea DX,inputs
    call inpstr

    mov bx,0; счетчик слов
    xor cx,cx
    mov cl,nums
    jcxz exit; дошли до конца символьного ряда
    mov al,20h; пробел
    lea di,strs
    mov bx,1; счетчик слов
    a1: repne scasb
    jcxz exit; дошли до конца символьного ряда
    inc bx; увеличиваем счетчик слов
    jmp a1; продолжаем
    exit:
    ; в bx число
    retf
    Main Endp
    Code Ends
    End Main
     
  3. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Есть одна задачка..Она, может, и простая, но , на мой взгляд- длинная..:

    "Написать программу в которой вычисляются мода ряда. Функция, вычисляющая моду, т.е. значение, встречающееся среди его элементов чаще всего, должна получить два параметра- ряд, в котором имеется мода и число элементов ряда."


    Неужели, чтобы найти моду. придётся сранивать каждый элемент со всеми остальыми и организовывать несколько массивов , использующихся для хранения одинаковых чисел(чтобы потом подсчитать длину этих массивов и определить моду)...???????можно как-то облегчить вычисление моды???
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Зачем так сложно. Достаточно отсортировать массив и потом "пробежаться" по нему еще раз, считая одинаковые элементы. Дополнительные массивы не нужны( в крайнем случае только для отсортированного, если оригинал не будем трогать) - достаточно хранить указатель на "кандидата в моду" ... Естественно, если массив изначально "отсортирован" в противоположную сторону - придется сделать n*(n-1)/2 сравнений.
    Можно на самом деле не сортировать, а действительно искать и считать одинаковые, используя указатель. В этом случае будет точно n*(n-1)/2.
     
  5. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Сасибо,мудрый valterg ;)..я уже решила эту задачу, исполизуя 2 цикла и условие)))
     
  6. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    вот, когда закончу, тогда и выгонят, вернее- сама-уйду 8)
     
  7. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    какой вуз?институт!
     
  8. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    содержит ли программа ошибки?(компиляторborland c++ for dos не работает, не могу проверить)
     
  9. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    "мир непрост, совсем непрост"..)
     
  10. SeruS

    SeruS New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2009
    Сообщения:
    5
    Подскажите плиз, как вбить в счётчик число вводимое на экране, оно при вводе в аски коде, тоесть в щётчик забивается число допустим не 31, а 3331. и не только в щётчик.
     
  11. SeruS

    SeruS New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2009
    Сообщения:
    5
    допустим надо заполнить массив слов вида ****h где мвесто звёздочек 0-F
    Как сделать, что бы слова вводимые с клавиатуры записывлись в массив сразу в том виде, в котором их ввели. То есть. если мы вводи 2222 то в массиве оно должно записаться, как 2222h.
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    SeruS
    2222d равно 8AEh и не равно 2222h
     
  13. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Делаю практику по введению в графич. интерфейс. Нужно добавить обработку событий. Я выбрал возможность рисования. Все сделал, все вроде правильно, но не рисует. Подозреваю, что я что-то не так сделал с GDI-объектом. Рисование сделано правой кнопкой мыши, т.к. левая в примере уже была определена.
    Код (Text):
    1. #include <cstdio>
    2. #include <windows.h>
    3.  
    4. LRESULT CALLBACK MyWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    5.     HDC hdc;
    6.     BOOL fDraw = FALSE;
    7.     POINT ptPrevious;
    8.     SelectObject(GetDC(hWnd),GetStockObject(BLACK_PEN));
    9.  
    10.     switch (uMsg){
    11.     case WM_LBUTTONDOWN: //Левая кнопка мышки
    12.         UINT x, y;
    13.         x = LOWORD(lParam); y = HIWORD(lParam); //Забираем координаты
    14.         CHAR lpszXY[20];
    15.         sprintf(lpszXY, "x = %d, y = %d.", x, y); //И показываем
    16.         MessageBox(hWnd, lpszXY, "Координаты курсора мыши", //Надо взять функцию vaf
    17.             MB_OK | MB_ICONASTERISK);
    18.         break;
    19.     case WM_RBUTTONDOWN:
    20.         fDraw = TRUE;
    21.         ptPrevious.x = LOWORD(lParam);
    22.         ptPrevious.y = HIWORD(lParam);
    23.         break;
    24.     case WM_MOUSEMOVE:
    25.         if (fDraw){
    26.             hdc = GetDC(hWnd);
    27.             MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL);
    28.             LineTo(hdc, ptPrevious.x = LOWORD(lParam),
    29.                 ptPrevious.y = HIWORD(lParam));
    30.             ReleaseDC(hWnd, hdc);
    31.         }
    32.         break;
    33.     case WM_RBUTTONUP:
    34.         if (fDraw){
    35.             hdc = GetDC(hWnd);
    36.             MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL);
    37.             LineTo(hdc, LOWORD(lParam), HIWORD(lParam));
    38.             ReleaseDC(hWnd, hdc);
    39.         }
    40.         fDraw = FALSE;
    41.         break;
    42.  
    43.     //case WM_RBUTTONDOWN: //Правая кнопка мышки
    44.     //  MessageBox(hWnd, "", "Вы нажали правую кнопку мыши", //Надо взять функцию vaf
    45.     //      MB_OK | MB_ICONASTERISK);
    46.     //  hDC=GetDC(hWnd);
    47.     //  SelectObject(hDC,GetStockObject(BLACK_BRUSH));
    48.     //  ReleaseDC(hWnd, hDC);
    49.     //  break;
    50.     case WM_SIZE: //Изменение размера окна
    51.         UINT Width, Height;
    52.         Width = LOWORD(lParam); Height = HIWORD(lParam);
    53.         CHAR lpszWH[20];
    54.         sprintf(lpszWH, "dx = %d, dy = %d.", Width, Height);
    55.         MessageBox(hWnd, lpszWH, "Новые размеры окна",
    56.             MB_OK | MB_ICONASTERISK);
    57.         break;
    58.     case WM_CLOSE: //Закрываем приложение
    59.         if (MessageBox(hWnd, "Закрыть приложение?", "Вопрос",    //Задаем вопрос "Точно ли хотите выйти?"
    60.             MB_YESNO | MB_ICONQUESTION) == IDYES)               //А я в делфи долго гадал, как так сделать...
    61.             DestroyWindow(hWnd); //Пользователь сказал "Да" и окно убито
    62.         break;
    63.     case WM_DESTROY:
    64.         MessageBox(hWnd, "Вы уничтожили окно.", "Внимание",
    65.             MB_OK | MB_ICONEXCLAMATION);
    66.         PostQuitMessage(0);
    67.         break;
    68.     case WM_KEYDOWN:
    69.         switch (wParam){
    70.         case VK_F5:
    71.             MessageBox(hWnd, "Нажата клавиша F5.", "Сообщение",
    72.                 MB_OK | MB_ICONEXCLAMATION);
    73.             break;
    74.         case VK_ESCAPE:
    75.             if (MessageBox(hWnd, "Закрыть приложение?", "Вопрос",
    76.             MB_YESNO | MB_ICONQUESTION) == IDYES)
    77.                 DestroyWindow(hWnd);
    78.             break;
    79.         }
    80.     default:
    81.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
    82.     }
    83.     return 0;
    84. }
    85.  
    86. const CHAR szWndClassName[] = "Новый класс окна Win32";
    87. const CHAR szWindowName[] = "Задание №1 - диалоговые окна на все случаи";
    88.  
    89. int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE, LPSTR lpszCmdLine, int nCmdShow){
    90.     WNDCLASS WndCl; //Структура окна
    91.     WndCl.style = CS_HREDRAW | CS_VREDRAW;//Стиль
    92.     WndCl.lpfnWndProc = MyWndProc;//Адрес оконной процедуры
    93.     WndCl.cbClsExtra = 0; WndCl.cbWndExtra = 0;//дополнительная память
    94.     WndCl.hInstance = hThisInst;//Манипулятор
    95.     WndCl.hIcon = LoadIcon(NULL, IDI_APPLICATION);//Иконка (в данном случае белый прямоугольник)
    96.     WndCl.hCursor = LoadCursor(NULL, IDC_ARROW);//Курсор
    97.     WndCl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//Кисть (серая)
    98.     WndCl.lpszMenuName = (LPCSTR)NULL;//Имя меню в файле ресура (меню нет)
    99.     WndCl.lpszClassName = szWndClassName;//
    100.     if (!RegisterClass(&WndCl)) return 0; //Регистрация в системе
    101.    
    102.     HWND hWnd;
    103.     hWnd = CreateWindow(szWndClassName, szWindowName, WS_OVERLAPPEDWINDOW, //создание окна
    104.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, //Размеры приложения задаются системой
    105.         HWND_DESKTOP, (HMENU)NULL, (HINSTANCE)hThisInst, (LPVOID)NULL);
    106.     ShowWindow(hWnd, nCmdShow);
    107.    
    108.     MSG Msg;
    109.     while (GetMessage(&Msg, NULL, 0, 0)) //цикл обработки сообщений
    110.         DispatchMessage(&Msg);
    111.     return Msg.wParam;
    112. }
     
  14. SeruS

    SeruS New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2009
    Сообщения:
    5
    Нужно на асмеблере масм.
    Mikl___
    Я знаю, чему это ранво, вопрос заключался в том, что как сделать, что бы вводилось не d число, а сразу h.
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    SeruS
    Работа с клавиатурой предполагает указание конкретной OS, так как для Win это будет одно, для KolibriOS другое, а для Linux третье...
     
  16. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    SeruS

    1] не вижу проблемы под win32
    Код (Text):
    1. format1 db ",%Xh",0
    2. ...
    3. invoke wsprintf,addr buffer1,addr format1,[число] ;осторожней с wsprintf она стек не восстанавливает
    4. invoke lstrcat,addr OutputString,addr buffer1
    ...
    2]извращенный метод, - состоит в том чтобы использовать каждые 4 бита числа как индекс в массиве: string0 db "0123456789ABCDEF",0
     
  17. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Zlyden
    Локальные переменные fDraw и ptPrevious объявите статическими.
     
  18. SeruS

    SeruS New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2009
    Сообщения:
    5
    Спасибо за помошь с ассемблером, но я селал по своему, использовав сдвиги.

    Помогите пожалуйста ещё с С билдером.
    Процедура двигает пиксель, по зелёным линиям(строятся тоже из пикселей) пока не дойдёт до контура жёлтого круга. А уменя, при вызове продцедуры виснет С.
    Делал в том году, тоже самое на борланд С 3.1 всё работало, а сейчас нет, не могу понять почему...

    Код (Text):
    1. void serch(int x,int y,int i)
    2.   {
    3.     int a=0,b,e[5];
    4.      while(1) //Бесконченечный цикл(остановка, когда цель достигнута
    5.      {
    6.         b=0;        //Проверка всех возможных направлений движения
    7.  
    8.                 if(Form1->Canvas->Pixels[x][y-1]==clGreen){b++;e[b]=1;}
    9.  
    10.         if(Form1->Canvas->Pixels[x+1][y-1]==clGreen){b++;e[b]=7;}
    11.  
    12.         if(Form1->Canvas->Pixels[x+1][y+1]==clGreen){b++;e[b]=8;}
    13.  
    14.         if(Form1->Canvas->Pixels[x][y+1]==clGreen){b++;e[b]=4;}
    15.  
    16.         if(Form1->Canvas->Pixels[x-1][y+1]==clGreen){b++;e[b]=9;}
    17.  
    18.         if(Form1->Canvas->Pixels[x-1][y-1]==clGreen){b++;e[b]=10;}
    19.  
    20.                 Sleep(100);
    21.  
    22.                 if(b==1){       //Если только 1 направление, то идём назад
    23.                         Form1->Canvas->Pixels[x-1][y+1]=clWhite;x-=1;y+=1;
    24.                         Form1->Canvas->Pixels[x+1][y-1]=clGreen;
    25.                         }
    26.                         else{
    27.                                 if(b==2){               //Если 2 направления, то двигаемся туда же куда и шли
    28.                                         if(e[a]==1){Form1->Canvas->Pixels[x][y-1]=clWhite;y-=1;Sleep(100);Form1->Canvas->Pixels[x][y+1]=clGreen;}
    29.  
    30.                                                 if(e[a]==7){Form1->Canvas->Pixels[x+1][y-1]=clWhite;x+=1;y-=1;Sleep(100);Form1->Canvas->Pixels[x-1][y+1]=clGreen;}
    31.  
    32.                                             if(e[a]==8){Form1->Canvas->Pixels[x+1][y+1]=clWhite;x+=1;y+=1;Sleep(100);Form1->Canvas->Pixels[x-1][y-1]=clGreen;}
    33.  
    34.                                         if(e[a]==4){Form1->Canvas->Pixels[x][y+1]=clWhite;y+=1;Sleep(100);Form1->Canvas->Pixels[x][y-1]=clGreen;}
    35.  
    36.                                                 if(e[a]==9){Form1->Canvas->Pixels[x-1][y+1]=clWhite;x-=1;y+=1;Sleep(100);Form1->Canvas->Pixels[x+1][y-1]=clGreen;}
    37.  
    38.                                                 if(e[a]==10){Form1->Canvas->Pixels[x-1][y-1]=clWhite;x-=1;y-=1;Sleep(100);Form1->Canvas->Pixels[x+1][y+1]=clGreen;}
    39.  
    40.                                              Sleep(100);
    41.  
    42.                                         if(Form1->Canvas->Pixels[x][y-1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    43.  
    44.                                 if(Form1->Canvas->Pixels[x+1][y-1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    45.  
    46.                                 if(Form1->Canvas->Pixels[x+1][y+1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    47.  
    48.                                     if(Form1->Canvas->Pixels[x][y+1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    49.  
    50.                                 if(Form1->Canvas->Pixels[x-1][y+1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    51.  
    52.                                     if(Form1->Canvas->Pixels[x-1][y-1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    53.                                         }
    54.                                         else{                   //Выбор направления на перекрёстке
    55.                                                 a=random(b)+1;
    56.  
    57.                                                 if(e[a]==1){Form1->Canvas->Pixels[x][y-1]=clWhite;y-=1;Sleep(100);Form1->Canvas->Pixels[x][y+1]=clGreen;}
    58.  
    59.                                                 if(e[a]==7){Form1->Canvas->Pixels[x+1][y-1]=clWhite;x+=1;y-=1;Sleep(100);Form1->Canvas->Pixels[x-1][y+1]=clGreen;}
    60.  
    61.                                             if(e[a]==8){Form1->Canvas->Pixels[x+1][y+1]=clWhite;x+=1;y+=1;Sleep(100);Form1->Canvas->Pixels[x-1][y-1]=clGreen;}
    62.  
    63.                                         if(e[a]==4){Form1->Canvas->Pixels[x][y+1]=clWhite;y+=1;Sleep(100);Form1->Canvas->Pixels[x][y-1]=clGreen;}
    64.  
    65.                                                 if(e[a]==9){Form1->Canvas->Pixels[x-1][y+1]=clWhite;x-=1;y+=1;Sleep(100);Form1->Canvas->Pixels[x+1][y-1]=clGreen;}
    66.  
    67.                                                 if(e[a]==10){Form1->Canvas->Pixels[x-1][y-1]=clWhite;x-=1;y-=1;Sleep(100);Form1->Canvas->Pixels[x+1][y+1]=clGreen;}
    68.  
    69.                                                 Sleep(100);
    70.  
    71.  
    72.                                                 c=e[a];
    73.  
    74.                                         for(int g=1;g<6; g++)e[g]=0;
    75.                                                     // Проверка на достижение цели, если цель достигнута, то выход из цикла    
    76.  
    77.                                         if(Form1->Canvas->Pixels[x][y-1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    78.  
    79.                                                 if(Form1->Canvas->Pixels[x+1][y-1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    80.  
    81.                                                 if(Form1->Canvas->Pixels[x+1][y+1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    82.  
    83.                                                 if(Form1->Canvas->Pixels[x][y+1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    84.  
    85.                                                 if(Form1->Canvas->Pixels[x-1][y+1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    86.  
    87.                                                 if(Form1->Canvas->Pixels[x-1][y-1]==clYellow){Form1->Edit1->Text="Iaeaai";break;}
    88.                                                 };
    89.                         };
    90.  
    91.      }
    92.          }
    Правда в том году делал, не пикселями, а линиями, но тут я тоже пробовал линиями, результат тот же.
     
  19. SeruS

    SeruS New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2009
    Сообщения:
    5
    Вот примерно какой рисунок... [​IMG]
    Жёлтая точка, в данном случаее, это то, что двигается этой процедурой.


    И ещё, может подскажите, как это организовать с помощью классов?
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SeruS
    Старый код юзался для попиксельного описания фигур:
    Код (Text):
    1. VECTOR_UP       equ 0
    2. VECTOR_RIGHT    equ 1
    3. VECTOR_DOWN equ 2
    4. VECTOR_LEFT equ 3
    5.  
    6. IMAGE_BORDERS struct
    7. ImageWidth  ULONG ?
    8. ImageHeight ULONG ?
    9. IMAGE_BORDERS ends
    10. PIMAGE_BORDERS  typedef ptr IMAGE_BORDERS
    11.  
    12. SLICING_DATA struct
    13. ContextHandle   HANDLE ?
    14. Borders     IMAGE_BORDERS <>
    15. PointCallback   PVOID ?
    16. Vector      ULONG ?
    17. PointX      ULONG ?
    18. PointY      ULONG ?
    19. SLICING_DATA ends
    20. PSLICING_DATA typedef ptr SLICING_DATA
    21.  
    22. Point proc C
    23. ;Ebx = SLICING
    24. ;Esi = X
    25. ;Edi = Y
    26.     assume ebx:PSLICING_DATA
    27.     test esi,esi
    28.     js carry_       ;X < 0
    29.     test edi,edi
    30.     js carry_       ;Y < 0
    31.     cmp [ebx].Borders.ImageWidth,esi
    32.     jbe carry_
    33.     cmp [ebx].Borders.ImageHeight,edi
    34.     jbe carry_
    35.     Call [ebx].PointCallback
    36.     test eax,eax
    37.     ret
    38. carry_:
    39.     test ebx,ebx    ;Reset fz
    40.     ret
    41. Point endp
    42.  
    43. Slicing proc uses esi edi ebx SlicingData:PSLICING_DATA
    44. ;Вычисляет координаты следующей точки контура и вектор в ней для оси OY направленной вверх.
    45.     mov ebx,SlicingData
    46.     assume ebx:PSLICING_DATA
    47.     mov esi,[ebx].PointX
    48.     mov edi,[ebx].PointY
    49.     mov eax,[ebx].Vector
    50.     add esi,dword ptr [FirstTable + eax*8]      ;X1
    51.     add edi,dword ptr [FirstTable + eax*8 + 4]  ;Y1
    52.     Call Point
    53.     jnz First_Point_
    54.     mov eax,[ebx].Vector
    55.     add esi,dword ptr [NextTable + eax*8]       ;X2
    56.     add edi,dword ptr [NextTable + eax*8 + 4]   ;Y2
    57.     Call Point
    58.     jnz Return_
    59.     dec [ebx].Vector
    60.     jmp Correct_Vector_
    61. First_Point_:
    62.     inc [ebx].Vector
    63. Return_:
    64.     mov [ebx].PointX,esi
    65.     mov [ebx].PointY,edi
    66. Correct_Vector_:
    67.     and [ebx].Vector,11b
    68.     ret
    69. ;              dX  dY
    70. FirstTable:
    71.             DD +1, +1
    72.             DD +1, -1
    73.             DD -1, -1
    74.             DD -1, +1
    75.            
    76. NextTable:
    77.             DD -1,  0
    78.             DD  0, +1
    79.             DD +1,  0
    80.             DD  0, -1
    81. Slicing endp
    82.  
    83. SlicingOverwind proc uses esi edi ebx SlicingData:PSLICING_DATA
    84. ;Вычисляет координаты следующей точки контура и вектор в ней для оси OY направленной вниз.
    85.     mov ebx,SlicingData
    86.     assume ebx:PSLICING_DATA
    87.     mov esi,[ebx].PointX
    88.     mov edi,[ebx].PointY
    89.     mov eax,[ebx].Vector
    90.     add esi,dword ptr [FirstTable + eax*8]      ;X1
    91.     add edi,dword ptr [FirstTable + eax*8 + 4]  ;Y1
    92.     Call Point
    93.     jnz First_Point_
    94.     mov eax,[ebx].Vector
    95.     add esi,dword ptr [NextTable + eax*8]       ;X2
    96.     add edi,dword ptr [NextTable + eax*8 + 4]   ;Y2
    97.     Call Point
    98.     jnz Return_
    99.     dec [ebx].Vector
    100.     jmp Correct_Vector_
    101. First_Point_:
    102.     inc [ebx].Vector
    103. Return_:
    104.     mov [ebx].PointX,esi
    105.     mov [ebx].PointY,edi
    106. Correct_Vector_:
    107.     and [ebx].Vector,11b
    108.     ret
    109. ;              dX  dY
    110. FirstTable:
    111.             DD +1, -1
    112.             DD +1, +1
    113.             DD -1, +1
    114.             DD -1, -1
    115.            
    116. NextTable:
    117.             DD -1,  0
    118.             DD  0, -1
    119.             DD +1,  0
    120.             DD  0, +1
    121. SlicingOverwind endp
    122.  
    123. Describe proc uses esi edi ebx SlicingData:PSLICING_DATA
    124. ;Описывает контур. Исходный вектор равен нулю(Up), фон слева, иначе войдёт в бесконечный цикл!
    125.     mov ebx,SlicingData
    126.     assume ebx:PSLICING_DATA
    127.     mov esi,[ebx].PointX
    128.     mov edi,[ebx].PointY
    129.     invoke Slicing, SlicingData
    130. loop_:
    131.     invoke Slicing, SlicingData
    132.     cmp [ebx].Vector,VECTOR_UP
    133.     jne loop_
    134.     cmp [ebx].PointX,esi
    135.     jne loop_
    136.     cmp [ebx].PointY,edi
    137.     jne loop_
    138.     xor eax,eax
    139. return_:
    140.     ret
    141. Describe endp
    142.  
    143. DescribeOverwind proc uses esi edi ebx SlicingData:PSLICING_DATA
    144. ;Описывает контур. Исходный вектор равен нулю(Down), фон слева, иначе войдёт в бесконечный цикл!
    145.     mov ebx,SlicingData
    146.     assume ebx:PSLICING_DATA
    147.     mov esi,[ebx].PointX
    148.     mov edi,[ebx].PointY
    149.     invoke SlicingOverwind, SlicingData
    150. loop_:
    151.     invoke SlicingOverwind, SlicingData
    152.     cmp [ebx].Vector,VECTOR_DOWN
    153.     jne loop_
    154.     cmp [ebx].PointX,esi
    155.     jne loop_
    156.     cmp [ebx].PointY,edi
    157.     jne loop_
    158.     xor eax,eax
    159. return_:
    160.     ret
    161. DescribeOverwind endp