Уважаемые программисты!
Помогите, пожалуйста, найти литературу по написанию простых графических программ на ассемблере. К примеру, нарисовать квадрат!
Нужна помощь в поиске литературы
Модератор: Andy
Нашел пример для DirectDraw:
А вообще поищи на яндексе, например по стокам "opengl" или "программирование видео адаптеров"
Код: Выделить всё
.486
.MODEL FLAT, STDCALL
option casemap :none
INCLUDE D:\masm32\include\windows.inc ;эти файлы стандартные
INCLUDE D:\masm32\include\gdi32.inc ;
INCLUDE D:\masm32\include\kernel32.inc ;
INCLUDE D:\masm32\include\user32.inc ;
INCLUDE ddraw.inc
INCLUDELIB D:\masm32\lib\gdi32.lib
INCLUDELIB D:\masm32\lib\kernel32.lib
INCLUDELIB D:\masm32\lib\user32.lib
INCLUDELIB ddraw.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
next PROTO
init PROTO
;------------------------------------определяем макросы
RETURN MACRO arg
IFNB <arg>
mov eax, arg
ENDIF
ret
ENDM
;------------------------------------
LRETURN MACRO arg
IFNB <arg>
mov eax, arg
ENDIF
leave
ret
ENDM
;------------------------------------выход из программы с сообщением об ошибке
FATAL MACRO msg
LOCAL @@msg
.DATA
@@msg db msg, 0
.CODE
INVOKE MessageBox, hWnd, ADDR @@msg, ADDR szDisplayName, MB_OK
INVOKE ExitProcess, 0
ENDM
;--------------------------------------------------------------------
.DATA?
hWnd HWND ? ; surface window
lpDD LPDIRECTDRAW ? ; DDraw object
lpDDSPrimary LPDIRECTDRAWSURFACE ? ; DDraw primary surface
ddsd DDSURFACEDESC <?> ; DDraw surface descriptor
ddscaps DDSCAPS <?> ; DDraw capabilities
palette dd 256 dup (?)
table dd 512 dup (?)
lpDDPalette dd ?
;-------------------------------------------------------------------
.DATA
ddwidth EQU 640 ; display mode width
ddheight EQU 480 ; display mode height
ddbpp EQU 16 ; display mode color depth
szClassName db "DDRAW Plasma Demo", 0 ; class name
szDisplayName EQU <szClassName> ; window name
wc WNDCLASSEX < sizeof WNDCLASSEX, CS_HREDRAW or CS_VREDRAW, offset WndProc, 0, 0, , 0, 0, , 0, offset szClassName, 0 >
;---------------------------------------------------------------------------------
.CODE
start:
INVOKE GetModuleHandle, NULL
INVOKE WinMain, eax, NULL, NULL, SW_SHOWDEFAULT
INVOKE ExitProcess, eax
;---------------------------------------------------------------------------------
next PROC
mov edi, [ddsd.lpSurface]
ret
next ENDP
;---------------------------------------------------------------------------------
init PROC
ret
init ENDP
;---------------------------------------------------------------------------------
WinMain PROC hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
LOCAL msg :MSG
; Fill WNDCLASSEX structure with required variables
mov eax, [hInst]
mov [wc.hInstance], eax
INVOKE GetStockObject, BLACK_BRUSH
mov [wc.hbrBackground], eax
INVOKE RegisterClassEx, ADDR wc
; Create window at following size
INVOKE CreateWindowEx, 0, ADDR szClassName, ADDR szDisplayName, WS_POPUP, 0, 0, ddwidth, ddheight, NULL, NULL, hInst, NULL
mov [hWnd], eax
INVOKE SetFocus, hWnd
INVOKE ShowCursor, 0
; Initialize display
INVOKE DirectDrawCreate, NULL, ADDR lpDD, NULL
.IF eax != DD_OK
FATAL "Couldn't init DirectDraw"
.ENDIF
DDINVOKE SetCooperativeLevel, lpDD, hWnd, DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN
.IF eax != DD_OK
FATAL "Couldn't set DirectDraw cooperative level"
.ENDIF
DDINVOKE SetDisplayMode, lpDD, ddwidth, ddheight, ddbpp
.IF eax != DD_OK
FATAL "Couldn't set display mode"
.ENDIF
mov [ddsd.dwSize], sizeof DDSURFACEDESC
mov [ddsd.dwFlags], DDSD_CAPS
mov [ddsd.ddsCaps.dwCaps], DDSCAPS_PRIMARYSURFACE
DDINVOKE CreateSurface, lpDD, ADDR ddsd, ADDR lpDDSPrimary, NULL
.IF eax != DD_OK
FATAL "Couldn't create primary surface"
.ENDIF
INVOKE ShowWindow, hWnd, CmdShow
call init ;----------------------------------------вызов процедуры инициализации
; Loop until PostQuitMessage is sent
.WHILE 1
INVOKE PeekMessage, ADDR msg, NULL, 0, 0, PM_REMOVE
.IF eax != 0
.IF msg.message == WM_QUIT
INVOKE PostQuitMessage, msg.wParam
.BREAK
.ELSE
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.ENDIF
.ELSE
INVOKE GetFocus
.IF eax == hWnd
mov [ddsd.dwSize], sizeof DDSURFACEDESC
mov [ddsd.dwFlags], DDSD_PITCH
.WHILE 1
DDSINVOKE mLock, lpDDSPrimary, NULL, ADDR ddsd, DDLOCK_WAIT, NULL
.BREAK .IF eax == DD_OK
.IF eax == DDERR_SURFACELOST
DDSINVOKE Restore, lpDDSPrimary
.ELSE
FATAL "Couldn't lock surface"
.ENDIF
.ENDW
DDINVOKE WaitForVerticalBlank, lpDD, DDWAITVB_BLOCKBEGIN, NULL
call next
DDSINVOKE Unlock, lpDDSPrimary, ddsd.lpSurface
.ENDIF
.ENDIF
.ENDW
DDINVOKE RestoreDisplayMode, lpDD
.IF eax != DD_OK
FATAL "Couldn't restore displaymode"
.ENDIF
INVOKE DestroyWindow, hWnd
.IF eax == NULL
FATAL "Couldn't destroy window"
.ENDIF
.IF lpDD != NULL
.IF lpDDSPrimary != NULL
DDSINVOKE Release, lpDDSPrimary
mov [lpDDSPrimary], NULL
.ENDIF
DDINVOKE Release, lpDD
mov [lpDD], NULL
.ENDIF
LRETURN msg.wParam
WinMain ENDP
;-----------------------------------------------------------------------------------
WndProc PROC hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
.IF uMsg == WM_KEYDOWN
.IF wParam == VK_ESCAPE
INVOKE PostQuitMessage, NULL
RETURN 0
.ENDIF
.ELSEIF uMsg == WM_DESTROY
INVOKE PostQuitMessage, NULL
RETURN 0
.ENDIF
INVOKE DefWindowProc, hWin, uMsg, wParam, lParam
ret
WndProc ENDP
END start
И пусть удача повернется к тебе нужным местом 

Спасибо 
Но в идеале всё намного проще
может кому-нибудь это и пригодится...
PutPixel macro x,y,color
pusha
mov ah,0ch
mov al,color
mov bh,0h
mov cx,x
mov dx,y
int 10h
popa
endm
.model small
.code
.486
org 100h
beg: jmp start
start:
pusha
mov ah,0fh
int 10h
push ax
mov ax,12h
int 10h
mov ah,0bh
mov bx,0006h
int 10h
mov cx,200
mov dx,200
met:
Putpixel cx,dx,0ch
inc dx
cmp dx,220
jbe met
mov dx,200
inc cx
cmp cx,220
jbe met
met2:
mov ah,10h
int 16h
cmp al,1bh
jne met2
pop ax
mov ah,00h
int 10h
popa
mov ax,4c00h
int 21h
end beg

Но в идеале всё намного проще

может кому-нибудь это и пригодится...
PutPixel macro x,y,color
pusha
mov ah,0ch
mov al,color
mov bh,0h
mov cx,x
mov dx,y
int 10h
popa
endm
.model small
.code
.486
org 100h
beg: jmp start
start:
pusha
mov ah,0fh
int 10h
push ax
mov ax,12h
int 10h
mov ah,0bh
mov bx,0006h
int 10h
mov cx,200
mov dx,200
met:
Putpixel cx,dx,0ch
inc dx
cmp dx,220
jbe met
mov dx,200
inc cx
cmp cx,220
jbe met
met2:
mov ah,10h
int 16h
cmp al,1bh
jne met2
pop ax
mov ah,00h
int 10h
popa
mov ax,4c00h
int 21h
end beg
А что поменять в этой программе чтобы у мене рисовалj квадрат символом "0" ??
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Всё поменять, так как данный код рисует в видео-режиме, а ты хочешь рисовать в текстовом режиме.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.