Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2017, 15:54   #1
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию ассемблер (графика с помощью рекурсии)

Пожалуйста, подскажите как реализовать рекурсию. Не получается. Есть пример на паскале готовый, но как сделать на ассемблере?
Вот, что у меня на данный момент:
Код:
 
 include D:\masm32\include\masm32rt.inc 
 .386
option casemap:none

includelib kernel32.lib 
includelib user32.lib 

.data

x1 dword 350
y1 dword 100
x2 dword 650
y2 dword 400
r dword 50
hwnd dd 0
hInst dd 0
szTitleName db 'задание 10', 0 
szClassName db 'Приложение Win32', 0 
msg MONMSGSTRUCT <?>
wc WNDCLASS <?>
ps PAINTSTRUCT <?>

.code 

Main PROC
invoke GetModuleHandle, 0 ;получение значения баз. адреса,
mov hInst, eax ;по которому загружен модуль.
mov wc.style, CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
mov wc.lpfnWndProc, offset WndProc ;адрес оконной процедуры
mov wc.cbClsExtra, 0 
mov wc.cbWndExtra, 0 
mov eax, hInst ;дескриптор приложения 
mov wc.hInstance, eax ;в поле hInstance
invoke LoadIcon, 0, IDI_APPLICATION 
mov wc.hIcon, eax ;дескриптор значка в поле hIcon
invoke LoadCursorA, 0, IDC_ARROW
mov wc.hCursor, eax ;дескриптор курсора в поле hCursor
mov wc.hbrBackground, WHITE_BRUSH ;цвет бекграунда окна белый
mov dword ptr wc.lpszMenuName, 0 ;главного меню нет
mov dword ptr wc.lpszClassName, offset szClassName ;имя класса окна
invoke RegisterClassA, offset wc ;регистрация класас окна
invoke CreateWindowEx, 0, offset szClassName, offset szTitleName, \
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, \
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInst, 0
mov hwnd, eax ;создание окна
invoke ShowWindow, hwnd, SW_SHOWNORMAL ;показ окна
invoke UpdateWindow, hwnd ;перерисовывка содержимого окна
cycle1: ;цикл сообщений
invoke GetMessage, offset msg, 0, 0, 0
cmp ax, 0 
je end_c 
invoke TranslateMessage, offset msg ;трансляция ввода с клавиатуры
invoke DispatchMessage, offset msg ;отправляем сообщение
;оконной процедуре
jmp cycle1 
end_c: 
invoke ExitProcess, 0 ;выход из приложения
Main ENDP

WndProc PROC USES ebx edi esi, _hwnd:DWORD, _wmsg:DWORD, _wparam:DWORD, _lparam:DWORD 
local _hdc:DWORD
cmp _wmsg, WM_DESTROY 
je wmdestroy 
cmp _wmsg, WM_PAINT
je wmpaint
invoke DefWindowProcA, _hwnd, _wmsg, _wparam, _lparam ;обраб. по умолчанию
jmp exit_proc
wmpaint:
invoke BeginPaint, _hwnd, offset ps ;получаем контекст устройства
mov _hdc, eax
invoke Ellipse, _hdc, x1, y1, x2, y2 ;

invoke EndPaint, _hdc, offset ps ;освобождаем контекст

mov eax, 0 ;возвращаемое значение - 0
jmp exit_proc
wmdestroy: 
invoke PostQuitMessage, 0 ;послать сообщение WM_QUIT
mov eax, 0 ;возвращаемое значение - 0
exit_proc: 
ret 
WndProc ENDP 
END Main

Вот, рабочая на паскале:
Код:
uses crt,graph;

var
k:integer;

gd,gm,mx,my:integer;

ch :char;

procedure krug(x,y,r:integer);

begin

if r>k then

begin

krug(x+r,y,r div 2);

krug(x,y+r,r div 2);

krug(x-r,y,r div 2);

krug(x,y-r,r div 2);

end;

circle(x,y,r);

end;

Procedure Init; {инициализация графического режима}

var err: integer;

begin

DetectGraph(gd,gm);

InitGraph(gd,gm,' путь драйвера');

if GraphResult<>grok then
begin

Writeln(GraphErrorMsg(err));

Readln; Halt(1);

end;

end;

BEGIN
k:=50;

Init;

krug(getmaxX div 2, getmaxY div 2, getmaxY div 4);
readln;

END.

Последний раз редактировалось Asya7; 21.02.2017 в 15:58.
Asya7 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с задачей по рекурсии: массив 1..N. с N переход на позицию N + 1 или N + 5. Определить с помощью рекурсии можно ли собрать сумму чисел K polsovatel C# (си шарп) 2 22.09.2016 02:52
Вычисление с помощью рекурсии и итерации -С Jar Помощь студентам 1 18.05.2014 16:24
С помощью рекурсии без операторов цикла и перехода написать процедуру P(N) WhyBeNormal Помощь студентам 1 29.01.2009 01:20
Pascal: Вычисление корна с помощью рекурсии. MaGWaY_minsk Помощь студентам 2 11.11.2008 22:20
написать с помощью рекурсии функцию поиска последнего слова в строке? - Си Cvetok Помощь студентам 1 13.05.2008 15:43