Soyez le premier à donner votre avis sur cette source.
Vue 8 928 fois - Téléchargée 418 fois
; ######################################################################### ; ; Courbe du dragon ; algorithme non récursif ; ; ######################################################################### .386 .model flat, stdcall option casemap :none ; case sensitive ; ######################################################################### include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib ; ######################################################################### ;============= ; Local macros ;============= m2m MACRO M1, M2 push M2 pop M1 ENDM return MACRO arg mov eax, arg ret ENDM ;================= ; Local prototypes ;================= WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD .data szDisplayName db "Dragon",0 szClassName db "dragon",0 CommandLine dd 0 hWnd dd 0 hInstance dd 0 .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 LOCAL wc :WNDCLASSEX LOCAL msg :MSG mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInst ;<< NOTE: macro not mnemonic mov wc.hbrBackground, COLOR_WINDOW+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset szClassName invoke LoadIcon, NULL, IDI_APPLICATION mov wc.hIcon, eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor, eax mov wc.hIconSm, 0 invoke RegisterClassEx, ADDR wc invoke CreateWindowEx,WS_EX_LEFT, ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 785,560, NULL,NULL, hInst,NULL mov hWnd,eax invoke ShowWindow,hWnd,SW_SHOWNORMAL invoke UpdateWindow,hWnd 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 hDC :DWORD LOCAL Ps :PAINTSTRUCT .if uMsg == WM_PAINT invoke BeginPaint,hWin,ADDR Ps mov hDC,eax pushad mov edx,90 ;x mov ebx,355 ;y mov ecx,20000h ;nombre de points divisé par 2 mov al,0 pix: mov esi,ecx l1: shr esi,1 jnb l1 shr esi,1 jb l2 xor al,1 l2: or al,al jz l3 sub ebx,2 l3: inc ebx push eax push ebx push edx push ecx invoke SetPixel,hDC,edx,ebx,0 pop ecx pop edx pop ebx pop eax test cl,1 jz l5 xor al,1 l5: or al,al jnz l6 sub edx,2 l6: inc edx push eax push ebx push edx push ecx invoke SetPixel,hDC,edx,ebx,0 pop ecx pop edx pop ebx pop eax loop pix popad invoke EndPaint,hWin,ADDR Ps return 0 .elseif uMsg == WM_DESTROY invoke PostQuitMessage,NULL return 0 .endif invoke DefWindowProc,hWin,uMsg,wParam,lParam ret WndProc endp end start
9 avril 2008 à 22:26
8 janv. 2006 à 01:19
code se fais a n'importe quel profondeurs..est que tous les
calcules portant sur les nombres passe par la FPU ?
30 juin 2005 à 19:42
L'algorithme n'est en effet pas récursif. Le programme execute une boucle de 20000h (registre ax et cl) itérations. A chaque itération:
1 On modifie dl en fonction du compteur de boucle. On remplace x par x+1 ou x-1 suivant la valeur du bit de poids faible de dl.
2 on dessine un point en (x,y)
3 on modifie dl, on remplace y par y-1 ou y+1
4 on dessine un point en (x,y)
30 juin 2005 à 14:12
Mais j'ai un peu de mal à comprendre le code moi aussi...
30 juin 2005 à 09:12
00000000 B81200 mov ax,0x12
00000003 CD10 int 0x10
00000005 B800A0 mov ax,0xa000
00000008 8ED8 mov ds,ax
0000000A B1FF mov cl,0xff
0000000C B80000 mov ax,0x0
0000000F BA0020 mov dx,0x2000
00000012 BEA51A mov si,0x1aa5
00000015 88CD mov ch,cl
00000017 89C3 mov bx,ax
00000019 D0ED shr ch,1
0000001B D1DB rcr bx,1
0000001D 73FA jnc 0x19
0000001F D1EB shr bx,1
00000021 7203 jc 0x26
00000023 80F201 xor dl,0x1
00000026 08D2 or dl,dl
00000028 7508 jnz 0x32
0000002A D0CE ror dh,1
0000002C 83D600 adc si,byte +0x0
0000002F E90500 jmp 0x37
00000032 D0C6 rol dh,1
00000034 83DE00 sbb si,byte +0x0
00000037 0834 or [si],dh
00000039 A801 test al,0x1
0000003B 7403 jz 0x40
0000003D 80F201 xor dl,0x1
00000040 83C650 add si,byte +0x50
00000043 08D2 or dl,dl
00000045 7504 jnz 0x4b
00000047 81EEA000 sub si,0xa0
0000004B 0834 or [si],dh
0000004D 40 inc ax
0000004E 75C5 jnz 0x15
00000050 FEC1 inc cl
00000052 75C1 jnz 0x15
00000054 B400 mov ah,0x0
00000056 CD16 int 0x16
00000058 B80300 mov ax,0x3
0000005B CD10 int 0x10
0000005D B8004C mov ax,0x4c00
00000060 CD21 int 0x21
Ce code est très compact compte tenu de la "complexité" de l'image obtenue. Question subsidiaire: quelle serait la taille de cette image bitmap ?
Dommage que le code ne soit pas commenté. Je suppose que le processus est récursif et qu'une constante définit la finesse du motif.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.