Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для Asya_inter
7 / 7 / 0
Регистрация: 14.11.2014
Сообщений: 166

[masm32] Графика на ассемблере (рекурсия)

21.05.2017, 23:25. Показов 3174. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте!Может кто-то делал такое и может помочь? Нужно написать на ассемблере приложение для Windows, рисующую в окне заданную фигуру (с помощью рекурсивной процедуры). Где количество рекурсивных вызовов может задаваться константой в начале программы или вводиться.
Миниатюры
[masm32] Графика на ассемблере (рекурсия)  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2017, 23:25
Ответы с готовыми решениями:

Не могу сделать программы на ассемблере MASM32
Описание Задания Для выполнения задания используется ассемблер MASM32,нужно разработать драйвер клавиатуры, работающий в реальном режиме...

Сделать пару графических кнопок за которыми закрепить определённые функции
Ребят, подскажите плиз как на ассемблере сделать пару графических кнопок за которыми закрепить определённые функции??? Добавлено через...

Графика в ассемблере
Помогите пожалуйста сделать программу на ассемблере. Нужно нарисовать диагональную линию от верхнего правого угла к нижнему левому. Графика...

4
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
21.05.2017, 23:46
Так программа буде похожа на ту, с рисованием окружностей. Только рисовать нужно не перед погружением в следующий уровень, а после вызова. Чтобы прямоугольник с меньшей глубиной закрывал более глубокие.

И фигуру нужно брать с заливкой. Сразу не скажу - это или rectangle или bar.
1
 Аватар для Asya_inter
7 / 7 / 0
Регистрация: 14.11.2014
Сообщений: 166
22.05.2017, 00:00  [ТС]
Да, я конечно понимаю что также. Но сложности какие-то возникают. Да - возможно это из-за отсутствия заливки и не получалось. Сейчас буду дальше разбираться. Спасибо!
Да, про паскаль то там всё ясно. Мало ли кому пригодится, то вот:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{$S+}
program Kanter;
uses Crt,Graph;
label z;
var a,b,n:integer;
g:char;
procedure draw(x,y,n:integer; size:word);
var s:word;
begin
if n-1>0 then
begin
s:= size div 2;
draw(x-size, y+size,n-1,s);
draw(x-size, y-size,n-1,s);
draw(x+size, y+size,n-1,s);
draw(x+size, y-size,n-1,s);
end;
rectangle(x-size, y-size, x+size, y+size);
bar(x-size+1, y-size+1, x+size-1, y+size-1);
end;
 
begin
z:write('n='); readln(n);
if n>7 then begin goto z;end;
a:=detect; b:=detect;
initgraph(a,b,'c:\bp\bgi');
Setcolor(white);
draw(getmaxx div 2,getmaxy div 2,n,getmaxy div 4);
readkey;
closegraph;
end.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
22.05.2017, 00:39
Так программа по структуре идентична. Нужно будет лишь одну процедуру заменить.

Добавлено через 16 минут
Здесь http://radiofront.narod.ru/htm... paint.html приводится пример рисования с помощью WinAPI.
В частности зелёный скруглённый прямоугольник с тёмным окаймлением
Delphi
1
2
3
4
5
6
//рисуем закруглённый прямоугольник
hBrush=CreateSolidBrush(RGB(250,200,100));
SelectObject(hdc, hBrush);
hPen=CreatePen(2,2,RGB(0,0,255));
SelectObject(hdc, hPen);
RoundRect(hdc, 20, 250, 250, 350, 15, 15);
Думаю, что кисть задаёт заполнение, а перо - окаймление.
2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
11.06.2017, 16:45
Взяв за основу упомянутую ранее программу для окружностей по ссылке Графика с применением рекурсии
Заменяю:
- заголовок окна (строка 57)
- процедуру Paint_Proc
- процедуру Paint_Cyrcles на Paint_Rectangles (они очень похожи, только координаты следующей фигуры берутся не по центру текущей, а по её углам)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
; #########################################################################
 
      .386
      .model flat, stdcall  ; 32 bit memory model
      option casemap :none  ; case sensitive
 
;     include files
;     ~~~~~~~~~~~~~
      include D:\MASM32\INCLUDE\windows.inc
      include D:\MASM32\INCLUDE\masm32.inc
      include D:\MASM32\INCLUDE\gdi32.inc
      include D:\MASM32\INCLUDE\user32.inc
      include D:\MASM32\INCLUDE\kernel32.inc
      include D:\MASM32\INCLUDE\Comctl32.inc
      include D:\MASM32\INCLUDE\comdlg32.inc
      include D:\MASM32\INCLUDE\shell32.inc
 
;     libraries
;     ~~~~~~~~~
      includelib D:\MASM32\LIB\masm32.lib
 
      includelib D:\MASM32\LIB\gdi32.lib
      includelib D:\MASM32\LIB\user32.lib
      includelib D:\MASM32\LIB\kernel32.lib
      includelib D:\MASM32\LIB\Comctl32.lib
      includelib D:\MASM32\LIB\comdlg32.lib
      includelib D:\MASM32\LIB\shell32.lib
 
; #########################################################################
 
        ;=================
        ; Local prototypes
        ;=================
        WinMain         PROTO :DWORD,:DWORD,:DWORD,:DWORD
        WndProc         PROTO :DWORD,:DWORD,:DWORD,:DWORD
        TopXY           PROTO :DWORD,:DWORD
        FillBuffer      PROTO :DWORD,:DWORD,:BYTE
        Paint_Proc      PROTO :DWORD,:DWORD
        Paint_Rectangles        PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
 
      ;=============
      ; Local macros
      ;=============
 
      ;
      m2m MACRO M1, M2
        push M2
        pop  M1
      ENDM
 
      return MACRO arg
        mov eax, arg
        ret
      ENDM
 
    .data
        szDisplayName   db "Recursive Rectangles",0
        CommandLine     dd      0
        hWnd            dd      0
        hInstance       dd      0
        hIcon           dd      0
 
        szClassName     db      "GDIs_Class", 0
 
        cxClient        dw      0
        cyClient        dw      0
 
        iMaxDepth       dd      4
 
; ########################### Inserted modules ############################
 
; #########################################################################
 
.code
 
start:
      invoke GetModuleHandle, NULL
      mov hInstance, eax
 
      invoke GetCommandLine
      mov CommandLine, eax
 
      invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
      invoke ExitProcess,eax
 
; #########################################################################
 
WinMain proc hInst     :DWORD,
             hPrevInst :DWORD,
             CmdLine   :DWORD,
             CmdShow   :DWORD
 
      ;====================
      ; Put LOCALs on stack
      ;====================
 
      LOCAL wc   :WNDCLASSEX
      LOCAL msg  :MSG
      LOCAL Wwd  :DWORD
      LOCAL Wht  :DWORD
      LOCAL Wtx  :DWORD
      LOCAL Wty  :DWORD
 
      ;==================================================
      ; Fill WNDCLASSEX structure with required variables
      ;==================================================
 
      invoke LoadIcon,hInst,0    ; icon ID (0-System ID)
      mov hIcon, eax
 
      mov wc.cbSize,         sizeof WNDCLASSEX
      mov wc.style,          CS_BYTEALIGNWINDOW+CS_HREDRAW+CS_VREDRAW
      mov wc.lpfnWndProc,    offset WndProc
      mov wc.cbClsExtra,     NULL
      mov wc.cbWndExtra,     NULL
      m2m wc.hInstance,      hInst
      mov wc.hbrBackground,  COLOR_BTNFACE+1
      mov wc.lpszMenuName,   NULL
      mov wc.lpszClassName,  offset szClassName
      m2m wc.hIcon,          hIcon
      invoke LoadCursor,NULL,IDC_ARROW
      mov wc.hCursor,        eax
      m2m wc.hIconSm,        hIcon
 
      invoke RegisterClassEx, ADDR wc
 
      ;================================
      ; Centre window at following size
      ;================================
 
      mov Wwd, 600
      mov Wht, 480
 
      m2m cxClient, Wwd
      m2m cyClient, Wht
 
      invoke GetSystemMetrics,SM_CXSCREEN
      invoke TopXY,Wwd,eax
      mov Wtx, eax
 
      invoke GetSystemMetrics,SM_CYSCREEN
      invoke TopXY,Wht,eax
      mov Wty, eax
 
      invoke CreateWindowEx,WS_EX_LEFT,
                            ADDR szClassName,
                            ADDR szDisplayName,
                            WS_OVERLAPPEDWINDOW,
                            Wtx,Wty,Wwd,Wht,
                            NULL,NULL,
                            hInst,NULL
      mov   hWnd,eax
 
      invoke LoadMenu,hInst,600  ; menu ID
      invoke SetMenu,hWnd,eax
 
      invoke ShowWindow,hWnd,SW_SHOWNORMAL
      invoke UpdateWindow,hWnd
 
      ;===================================
      ; Loop until PostQuitMessage is sent
      ;===================================
 
    StartLoop:
      invoke GetMessage,ADDR msg,NULL,0,0
      cmp eax, 0
      je ExitLoop
      invoke TranslateMessage, ADDR msg
      invoke DispatchMessage,  ADDR msg
      jmp StartLoop
    ExitLoop:
 
      return msg.wParam
 
WinMain endp
 
; #########################################################################
 
WndProc proc hWin   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD
 
    LOCAL var    :DWORD
    LOCAL caW    :DWORD
    LOCAL caH    :DWORD
    LOCAL Rct    :RECT
    LOCAL hDC    :DWORD
    LOCAL Ps     :PAINTSTRUCT
    LOCAL buffer1[128]:BYTE  ; these are two spare buffers
    LOCAL buffer2[128]:BYTE  ; for text manipulation etc..
 
    .if uMsg == WM_COMMAND
    ;======== menu commands ========
    .elseif uMsg == WM_CREATE
 
    .elseif uMsg == WM_SIZE
        push eax
        push ebx
        mov eax, lParam
        mov cxClient, ax
        shr eax, 16
        mov cyClient, ax
        pop ebx
        pop eax
        return 0
    .elseif uMsg == WM_PAINT
        invoke BeginPaint,hWin,ADDR Ps
          mov hDC, eax
          invoke Paint_Proc,hWin,hDC
        invoke EndPaint,hWin,ADDR Ps
        return 0
 
    .elseif uMsg == WM_CLOSE
 
    .elseif uMsg == WM_DESTROY
        invoke PostQuitMessage,NULL
        return 0
    .endif
 
    invoke DefWindowProc,hWin,uMsg,wParam,lParam
 
    ret
 
WndProc endp
 
; ########################################################################
 
TopXY proc wDim:DWORD, sDim:DWORD
 
    shr sDim, 1      ; divide screen dimension by 2
    shr wDim, 1      ; divide window dimension by 2
    mov eax, wDim    ; copy window dimension into eax
    sub sDim, eax    ; sub half win dimension from half screen dimension
 
    return sDim
 
TopXY endp
 
; #########################################################################
 
Paint_Proc proc hWin:DWORD, hDC:DWORD
 
    LOCAL hPen      :DWORD
    LOCAL hPenOld   :DWORD
    LOCAL hBrush    :DWORD
    LOCAL hBrushOld :DWORD
 
    LOCAL lb        :LOGBRUSH
 
    LOCAL iXc       :DWORD
    LOCAL iYc       :DWORD
    LOCAL iSize     :DWORD
 
 
    invoke CreatePen,0,1,000000FFh  ; red
    mov hPen, eax
 
    mov lb.lbStyle, BS_SOLID
    mov lb.lbColor, 00FF0000h       ; blue
    mov lb.lbHatch, NULL
 
    invoke CreateBrushIndirect,ADDR lb
    mov hBrush, eax
 
    invoke SelectObject,hDC,hPen
    mov hPenOld, eax
 
    invoke SelectObject,hDC,hBrush
    mov hBrushOld, eax
 
  ; ------------------------------------------------
  ; The paint rectangles
  ; ------------------------------------------------
 
    push eax
    mov eax, 0
    mov ax, cxClient
    shr ax, 1
    mov iXc, eax
 
    mov eax, 0
    mov ax, cyClient
    shr ax, 1
    mov iYc, eax
 
    mov eax, 0          ;iSize=min(cxClient, cyClient)
    mov ax, cxClient
    mov iSize, eax
    mov ax, cyClient
    sub eax,iSize
    sbb ebx,ebx
    and ebx,eax
    add iSize,ebx
    mov eax, iSize
    shr eax, 2
    mov iSize, eax
    pop eax
 
    invoke Paint_Rectangles, hDC, hPen, iXc, iYc, iSize, 1
 
  ; ------------------------------------------------
 
    invoke SelectObject,hDC,hBrushOld
    invoke DeleteObject,hBrush
 
    invoke SelectObject,hDC,hPenOld
    invoke DeleteObject,hPen
 
    ret
 
Paint_Proc endp
 
; iXc, iYc - координаты центра квадрата
; iR - длина половины стороны квадрата
; iDepth - текущая глубина рекурсии
Paint_Rectangles        proc    hDC:DWORD, hPen:DWORD, iXc:DWORD, iYc:DWORD, iR:DWORD, iDepth:DWORD
        LOCAL   nLeftRect       :DWORD
        LOCAL   nTopRect        :DWORD
        LOCAL   nRightRect      :DWORD
        LOCAL   nBottomRect     :DWORD
        push    eax
        push    ebx
        push    ecx
        push    edx
 
        mov     eax,    iDepth
        cmp     eax,    iMaxDepth
        jae     @@Paint
        inc     eax
        ;Rectangle(x+r,y+r,r div 2);
        mov     ebx,    iXc
        add   ebx,  iR
        mov     ecx,    iYc
        add   ecx,  iR
        mov     edx,    iR
        shr     edx,    1
        invoke  Paint_Rectangles, hDC, hPen, ebx, ecx, edx, eax
 
        ;Rectangle(x+r,y-r,r div 2);
        mov     ebx,    iXc
        add   ebx,  iR
        mov     ecx,    iYc
        sub   ecx,  iR
        mov     edx,    iR
        shr     edx,    1
        invoke  Paint_Rectangles, hDC, hPen, ebx, ecx, edx, eax
 
        ;Rectangle(x-r,y+r,r div 2);
        mov     ebx,    iXc
        sub   ebx,  iR
        mov     ecx,    iYc
        add   ecx,  iR
        mov     edx,    iR
        shr     edx,    1
        invoke  Paint_Rectangles, hDC, hPen, ebx, ecx, edx, eax
        ;Rectangle(x-r,y+r,r div 2);
        mov     ebx,    iXc
        sub   ebx,  iR
        mov     ecx,    iYc
        sub   ecx,  iR
        mov     edx,    iR
        shr     edx,    1
        invoke  Paint_Rectangles, hDC, hPen, ebx, ecx, edx, eax
 
@@Paint:
        mov     eax,    iXc
        sub     eax,    iR
        mov     nLeftRect,      eax
        mov     eax,    iYc
        sub     eax,    iR
        mov     nTopRect,       eax
        mov     eax,    iXc
        add     eax,    iR
        mov     nRightRect,     eax
        mov     eax,    iYc
        add     eax,    iR
        mov     nBottomRect,    eax
 
        invoke  Rectangle, hDC, nLeftRect, nTopRect, nRightRect, nBottomRect
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
    ret
Paint_Rectangles endp
; ########################################################################
 
end start
Миниатюры
[masm32] Графика на ассемблере (рекурсия)  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2017, 16:45
Помогаю со студенческими работами здесь

Несмотря на подключение masm32.inc и masm32.lib не подтягиваются функции stdin и stdout
Собственно скрин.

Ошибки MASM32 - cannot open file : .\masm32\include\windows.inc
установил MASM32, прописал в патче путь, выдаёт ошибки при компиляции такого рода : Microsoft (R) Macro Assembler Version 6.14.8444 ...

Не знаю в чем ошибка, программирование на ассемблере в MASM32, выводит ошибку
.386 .model flat, stdcall option casemap :none include C:\masm32\include\windows.inc include...

Рекурсия на ассемблере
Здравствуйте! Уже который день мучаюсь с реализацией программы вычисления факториала числа. Вот, собственно, код: .data x dd 1 ...

Графика в ассемблере
Добрый вечер!Недавно начал изучать ассемблер,задали курсовую "Прямоугольная графика",необходимо,чтобы было окно графика,на котором бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru