我用win32汇编画八卦图

 

汇编程序的图:

这几天在学习汇编语言的图形操作,于是想起以前用C#画过个小八卦图

半径R自己给……

 

ContractedBlock.gif ExpandedBlockStart.gif Code
Graphics g = e.Graphics;
            Brush fillWhiteBrush 
= Brushes.White;
            Brush fillBlackBrush 
= Brushes.Black;
            g.FillPie(fillWhiteBrush, 
00, r, r, -90-180);//左半圆
            g.FillPie(fillBlackBrush, 00, r, r, 90-180);//右半圆
            g.FillEllipse(fillWhiteBrush, r/40, r / 2, r / 2);//上中型圆
            g.FillEllipse(fillBlackBrush, r / 4, r / 2, r / 2, r / 2);//下中型圆
            g.FillEllipse(fillBlackBrush, 9*r/20, r/5, r / 20, r / 20);//左小圆
            g.FillEllipse(fillWhiteBrush, 9 * r / 207*r/10, r / 20, r / 20);//右小圆

win32汇编的实现

中需要调用GDI的API函数来实现……

包括:画笔(CreatePen)、画刷(GetStockObject)、坐标定位(MoveToEx)、画直线(LineTo)、画椭圆(Ellipse)、画扇形(Pie)……

注释已经很清楚了,我就不废话了……

绘图核心源码:

ContractedBlock.gif ExpandedBlockStart.gif Code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
画太极八卦
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_PaintTaiJi proc
         LOCAL 
hBrush:HBRUSH;黑色笔刷
         LOCAL wBrush:HBRUSH;白色笔刷
         LOCAL hPen:HPEN;白色画笔
         ;LOCAL lpPoint:LPPOINT 
         invoke  Ellipse,hDc,  0,0,200,200;大圆
         invoke  GetStockObject,BLACK_BRUSH;
         mov hBrush,eax;获取黑色笔刷并保存起来
         invoke  GetStockObject,DC_BRUSH;
         mov wBrush,eax;获取白色笔刷并保存起来
         invoke SelectObject,hDc,hBrush;选择黑色笔刷
         invoke Pie,hDc,0,0,200,200,100,0,100,200;左半个扇形
         invoke  Ellipse,hDc,  50,100,150,200;右半小扇形
         
         
         invoke SelectObject,hDc,wBrush
;选择白色笔刷
         invoke Pie,hDc,50,0,150,100,100,0,100,100;左半小扇形
         invoke Ellipse,hDc,  95,145,105,155;上小圆
         
         
;将画上小圆留下的黑色线条擦去
         invoke MoveToEx,hDc,100,1,0;起始坐标移动到(100,1)处
         ;将白色(RGB值为:255 255 255)填充到eax
         xor eax,eax
         
mov ah,255
                 
mov al,255
                 
shl eax,8
                 
mov al,255;
                 
         invoke CreatePen,PS_SOLID,
2,eax;
         mov hPen,eax;
         invoke SelectObject,hDc,hPen;
         invoke LineTo,hDc,99,99;
         ;
         
          invoke SelectObject,hDc,hBrush
;选择黑色笔刷
         invoke  Ellipse,hDc,  95,45,105,55;上小圆
          
    
ret

_PaintTaiJi endp

 

整个源码:

ContractedBlock.gif ExpandedBlockStart.gif 汇编整个程序代码(在RadASM调试通过)
.386

.model flat,stdcall
option 
casemap:none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Include 文件定义
;
 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;include MyFirstApp.inc

include  windows.
inc
include  user32.
inc
includelib user32.lib
include  kernel32.
inc
includelib kernel32.lib
include  Gdi32.
inc
includelib Gdi32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

   .data?

hInstance dd ?
;模块句柄
hWinMain dd ?;窗口句柄

stPs   PAINTSTRUCT <>
;
stRect   RECT <>;
hDc  dd ?;
     .const

szClassName      db    
'MyTaiJi',0;类名

szCaptionMain    db    
'汇编画八卦程序',0;窗口标题


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                 .code

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 窗口过程

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ProcWinMain     proc  uses ebx edi esi,hWnd,uMsg,wParam,lParam


 

                 
mov   eax,uMsg

;********************************************************************

                 .if      eax ==    WM_PAINT

                          invoke    BeginPaint,hWnd,addr stPs

                          
mov       hDc,eax

                          invoke    GetClientRect,hWnd,addr stRect
     
call _PaintTaiJi;

                          invoke    EndPaint,hWnd,addr stPs

;********************************************************************

                 .elseif  eax ==    WM_CLOSE

                          invoke    DestroyWindow,hWinMain

                          invoke    PostQuitMessage,NULL

;********************************************************************

                 .else

                          invoke    DefWindowProc,hWnd,uMsg,wParam,lParam

                                   
ret

                          .endif

;********************************************************************

                 
xor      eax,eax

                 
ret

 

_ProcWinMain     endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;构建窗口

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain         proc

                 local    
@stWndClass:WNDCLASSEX

                 local    
@stMsg:MSG

 

                 invoke   GetModuleHandle,NULL

                 
mov                hInstance,eax

                 invoke   RtlZeroMemory,addr @stWndClass,sizeof @stWndClass

;********************************************************************

; 注册窗口类

;********************************************************************

                 invoke   LoadCursor,
0,IDC_ARROW

                 
mov      @stWndClass.hCursor,eax

                 
push     hInstance

                 
pop      @stWndClass.hInstance

                 
mov      @stWndClass.cbSize,sizeof WNDCLASSEX

                 
mov      @stWndClass.style,CS_HREDRAW or CS_VREDRAW

                 
mov      @stWndClass.lpfnWndProc,offset _ProcWinMain

                 
mov      @stWndClass.hbrBackground,COLOR_WINDOW + 1

                 
mov      @stWndClass.lpszClassName,offset szClassName

                 invoke   RegisterClassEx,addr @stWndClass

;********************************************************************

; 建立并显示窗口

;********************************************************************

                 invoke   CreateWindowEx,WS_EX_CLIENTEDGE,\

                          offset szClassName,offset szCaptionMain,\

                          WS_OVERLAPPEDWINDOW,\

                          
100,100,600,400,\

                          NULL,NULL,hInstance,NULL

                 
mov      hWinMain,eax

                 invoke   ShowWindow,hWinMain,SW_SHOWNORMAL

                 invoke   UpdateWindow,hWinMain

;********************************************************************

; 消息循环

;********************************************************************

                 .while   TRUE

                          invoke    GetMessage,addr @stMsg,NULL,
0,0

                          .break    .if eax  == 
0

                          invoke    TranslateMessage,addr @stMsg

                          invoke    DispatchMessage,addr @stMsg

                 .endw

                 
ret

 

_WinMain         endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
画太极八卦
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_PaintTaiJi proc
   LOCAL 
hBrush:HBRUSH;黑色笔刷
   LOCAL wBrush:HBRUSH;白色笔刷
   LOCAL hPen:HPEN;白色画笔
   ;LOCAL lpPoint:LPPOINT 
   invoke  Ellipse,hDc,  0,0,200,200;大圆
   invoke  GetStockObject,BLACK_BRUSH;
   mov hBrush,eax;获取黑色笔刷并保存起来
   invoke  GetStockObject,DC_BRUSH;
   mov wBrush,eax;获取白色笔刷并保存起来
   invoke SelectObject,hDc,hBrush;选择黑色笔刷
   invoke Pie,hDc,0,0,200,200,100,0,100,200;左半个扇形
   invoke  Ellipse,hDc,  50,100,150,200;右半小扇形
   
   
   invoke SelectObject,hDc,wBrush
;选择白色笔刷
   invoke Pie,hDc,50,0,150,100,100,0,100,100;左半小扇形
   invoke Ellipse,hDc,  95,145,105,155;上小圆
   
   
;将画上小圆留下的黑色线条擦去
   invoke MoveToEx,hDc,100,1,0;起始坐标移动到(100,1)处
   ;将白色(RGB值为:255 255 255)填充到eax
   xor eax,eax
   
mov ah,255
                 
mov al,255
                 
shl eax,8
                 
mov al,255;
                 
   invoke CreatePen,PS_SOLID,
2,eax;
   mov hPen,eax;
   invoke SelectObject,hDc,hPen;
   invoke LineTo,hDc,99,99;
   ;
   
    invoke SelectObject,hDc,hBrush
;选择黑色笔刷
   invoke  Ellipse,hDc,  95,45,105,55;上小圆
    
 
ret

_PaintTaiJi endp


;程序入口
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:

                 
call     _WinMain

                 invoke   ExitProcess,NULL

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                 end      start

 

 

 

 

 

转载于:https://www.cnblogs.com/BinBin1987/archive/2009/04/22/1441669.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值