⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sin.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
MakeRect PROTO:DWORD,:DWORD,:DWORD,:DWORD
Sin PROTO :DWORD,:DWORD
XFORMCOUNTERFEIT STRUCT
  eM11  DWORD     0.0
  eM12  DWORD     0.0
  eM21  DWORD     0.0
  eM22  DWORD     0.0
  ex    DWORD        0.0
  ey    DWORD        0.0
XFORMCOUNTERFEIT ENDS

.const
IDR_MENU           equ  101
IDM_MESS           equ  40001
IDM_EXIT            equ  40002
IDM_LOMETRIC  equ  40003
IDM_ISO              equ  40004
IDM_ANISO         equ  40005
.data
ClassName       db "WinClass",0
TitleName        db "可变比例映射模式(不同比)",0
xForm             XFORMCOUNTERFEIT <1.0,1.0,0.0,1.0,0,0>
MenuMess        db "Menu Success!",0
MenuItem0       db "Message",0
MenuItem1       db "Exit",0
Caption            db "window",0
MenuName       db "MyMenu",0
base_180          dd 180
.data?
pt                    POINT <>
menu               MENUITEMINFO<>
hInstance	       HINSTANCE ?
hMenu              HMENU ?
hp                    HPEN  ?
oldhp                HPEN  ?
hBrush             HBRUSH ?
oldhBrush          HBRUSH ?
hPopupMenu     HMENU ?
Color               COLORREF ?
Rect                 RECT   <>
NewRect         RECT   <>
.code
start:
        invoke GetModuleHandle, NULL
        mov    hInstance,eax
        invoke WinMain, NULL,NULL,NULL, SW_SHOWDEFAULT
        invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL hwnd:HWND
        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        mov   eax, hInstance
        mov   wc.hInstance,eax
        invoke GetStockObject,WHITE_BRUSH 
        mov   wc.hbrBackground,eax
        mov   eax,IDR_MENU
        mov   wc.lpszMenuName,eax
        mov   wc.lpszClassName,OFFSET ClassName
        invoke LoadIcon,NULL,IDI_ASTERISK
        mov   wc.hIcon,eax
        mov   wc.hIconSm,0
        invoke LoadCursor,NULL,IDC_HAND
        mov   wc.hCursor,eax
        invoke RegisterClassEx, addr wc
        invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW+WS_EX_TOPMOST,addr ClassName,\
            addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,200,\
            NULL,NULL,hInst,NULL
        mov   hwnd,eax
        invoke ShowWindow,hwnd,CmdShow
        invoke UpdateWindow,hwnd
        invoke GetMenu,hwnd
        mov hMenu,eax
        .while TRUE
        invoke GetMessage, addr msg,NULL,0,0
           .BREAK .IF (!eax)
           invoke TranslateMessage,addr msg
           invoke DispatchMessage, addr msg
        .endw
        mov eax,msg.wParam
        ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
       LOCAL hdc:HDC
        .if    uMsg==WM_DESTROY
           invoke DeleteObject,hp
           invoke DeleteObject,oldhp
           invoke DeleteObject,hBrush
           invoke DeleteObject,oldhBrush
           invoke PostQuitMessage,NULL
        .elseif uMsg==WM_CREATE
           invoke CreatePopupMenu
           mov hPopupMenu,eax
           mov menu.cbSize,sizeof MENUITEMINFO
           mov menu.fMask,MIIM_STRING+MIIM_ID
           mov menu.wID,IDM_MESS
           mov menu.dwTypeData,offset MenuItem0
           invoke InsertMenuItem,hPopupMenu,0,TRUE,addr menu
           mov menu.dwTypeData,offset MenuItem1
           mov menu.wID,IDM_EXIT
           invoke InsertMenuItem,hPopupMenu,1,TRUE,addr menu
        .elseif uMsg==WM_COMMAND
           mov eax,wParam
           .if ax==IDM_MESS
              mov eax,IDR_MENU
              invoke MessageBox,hWnd,addr MenuMess,addr Caption,MB_OK
           .elseif ax==IDM_LOMETRIC
              invoke GetDC,hWnd
              mov hdc,eax
              invoke SetGraphicsMode,hdc,GM_ADVANCED
              invoke SetMapMode,hdc,MM_LOMETRIC
              invoke SetWorldTransform,hdc, addr xForm
              invoke GetClientRect,hWnd,addr Rect
              invoke GetStockObject,HOLLOW_BRUSH
              invoke SelectObject,hdc,eax
              invoke DPtoLP,hdc,addr Rect,2
              invoke MakeRect,-100,100,100,-100
              invoke  Ellipse,hdc,NewRect.left,NewRect.top,NewRect.right,NewRect.bottom
              invoke MakeRect,-94,94,94,-94
              invoke  Ellipse,hdc,NewRect.left,NewRect.top,NewRect.right,NewRect.bottom
              invoke MakeRect,-13,113,13,50
              invoke Rectangle,hdc,NewRect.left,NewRect.top,NewRect.right,NewRect.bottom
              invoke MakeRect,-13,96,13,50
              invoke Rectangle,hdc,NewRect.left,NewRect.top,NewRect.right,NewRect.bottom
              invoke MakeRect,-150,0,-16,0       
              invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
              invoke LineTo,hdc,NewRect.right,NewRect.bottom
              invoke MakeRect,-13,0,13,0       
              invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
              invoke LineTo,hdc,NewRect.right,NewRect.bottom
              invoke MakeRect,16,0,150,0       
              invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
              invoke LineTo,hdc,NewRect.right,NewRect.bottom
              invoke MakeRect,0,-150,0,-16       
              invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
              invoke LineTo,hdc,NewRect.right,NewRect.bottom
              invoke MakeRect,0,-13,0,13       
              invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
              invoke LineTo,hdc,NewRect.right,NewRect.bottom
              invoke MakeRect,0,16,0,150       
              invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
              invoke LineTo,hdc,NewRect.right,NewRect.bottom
              invoke ReleaseDC,hWnd,hdc   
           .elseif ax==IDM_ISO
              invoke GetClientRect,hWnd,addr Rect
              invoke GetDC,hWnd
              mov   hdc,eax
              RGB 0FFh,0,0
              invoke CreatePen,PS_INSIDEFRAME,2,eax
              mov hp,eax
              invoke SelectObject,hdc,hp
              mov oldhp,eax
              RGB 0,0,0ffh
              invoke CreateHatchBrush,HS_DIAGCROSS,eax
              mov hBrush,eax
              invoke SelectObject,hdc,hBrush
              mov oldhBrush,eax
              invoke SetMapMode,hdc,MM_ISOTROPIC
              mov eax,Rect.bottom
              shr eax,1
              invoke SetViewportOrgEx,hdc,Rect.right,eax,NULL
              invoke SetViewportExtEx,hdc,Rect.right,Rect.bottom,NULL
              invoke SetWindowOrgEx,hdc,-700,500,NULL
              invoke SetWindowExtEx,hdc,-10000,10000,NULL
              invoke MoveToEx,hdc,500,-500,NULL
              invoke LineTo,hdc,300,9500
              invoke LineTo,hdc,-700,500
              invoke LineTo,hdc,500,-500
              invoke SelectObject,hdc,oldhp
              invoke SelectObject,hdc,oldhBrush
              invoke ReleaseDC,hWnd,hdc
           .elseif ax==IDM_ANISO
              invoke GetClientRect,hWnd,addr Rect
              invoke GetDC,hWnd
              mov   hdc,eax
              RGB 0,44h,0ffh
              invoke CreatePen,PS_INSIDEFRAME,1,eax
              mov hp,eax
              invoke SelectObject,hdc,hp
              mov oldhp,eax 
              mov eax,Rect.bottom
              shr eax,1
              push eax
              invoke MoveToEx,hdc,0,eax,NULL
              pop eax
              invoke LineTo,hdc,Rect.right,eax
              invoke SetMapMode,hdc,MM_ISOTROPIC
              mov eax,Rect.bottom
              shr eax,1
              invoke SetViewportOrgEx,hdc,0,eax,NULL
              invoke SetViewportExtEx,hdc,Rect.right,Rect.bottom,NULL
              invoke SetWindowExtEx,hdc,400,-80,NULL
              invoke SetWindowOrgEx,hdc,0,0,NULL
              RGB 0FFh,0,0
              mov Color,eax
              mov ecx,0
again:
              invoke Sin,ecx,80
              push ecx
              invoke SetPixel,hdc,ecx,eax,Color
              pop ecx
              inc ecx
              cmp ecx,360
              jnz again
              invoke SelectObject,hdc,oldhp
              invoke ReleaseDC,hWnd,hdc
           .elseif ax==IDM_EXIT
              invoke DestroyWindow,hWnd
           .endif    
        .elseif uMsg==WM_RBUTTONDOWN
           invoke GetCursorPos,addr pt
           invoke TrackPopupMenuEx,hPopupMenu,TPM_BOTTOMALIGN+TPM_RIGHTBUTTON,pt.x,pt.y,hWnd,NULL
        .else
           invoke DefWindowProc,hWnd,uMsg,wParam,lParam		
           ret
        .endif
        xor eax,eax
        ret
WndProc endp
MakeRect proc x1:dword,y1:dword,x2:dword,y2:dword
   mov eax,Rect.right
   sar eax,1
   add eax,x1
   push eax
   pop NewRect.left

   mov eax,Rect.bottom
   sar eax,1
   add eax,y1
   push eax
   pop NewRect.top

   mov eax,Rect.right
   sar eax,1
   add eax,x2
   push eax
   pop NewRect.right

   mov eax,Rect.bottom
   sar eax,1
   add eax,y2
   push eax
   pop NewRect.bottom
   ret
MakeRect endp
Sin proc angle:dword,amplification:dword
  local RetVal:dword
  finit
  fild angle
  fldpi
  fmul
  fild base_180
  fdivp st(1),st(0)
  fsin
  fild amplification
  fmul
  fist RetVal
  mov eax,RetVal
  ret
Sin endp
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -