nasm - BasicWindow_64

文章目录

    • nasm - BasicWindow_64
    • 概述
    • 笔记
    • nasm_main.asm
    • my_build.bat
    • END

nasm - BasicWindow_64

概述

学个demo, 这个demo最主要学到了:
不用在调用每个API前都准备阴影区,在API调用后栈平衡。
可以在函数入口处考虑到所用的栈尺寸最大值(16字节对齐,阴影区,函数的所有局部变量,调用API时用的参数最多的栈尺寸),开栈;在函数出口进行栈平衡。

其他细节地方,自己对着VS2019release版的x64反汇编就能搞。
说到底,要想拿汇编代码来写东西,要知道正向怎么写,然后才能参考反汇编代码来写NASM的工程。要不谁知道对应的汇编代码怎么弄。

NASM代码和x64反汇编出来的代码基本一样,稍微改一下就能拿来用。

笔记

nasm_main.asm

; @file nasm_main.asm
; @brief 用NASM实现一个64bits的基本窗口扩展
; nasm - BasicWindow_64
; ----------------------------------------
; 宏定义
; ----------------------------------------
; Basic Window Extended, 64 bit. V1.05
ANSI_CHARSET         EQU 0                      ; Constants
BLACKNESS            EQU 42h
CLIP_DEFAULT_PRECIS  EQU 0
CS_BYTEALIGNWINDOW   EQU 2000h
CS_HREDRAW           EQU 2
CS_VREDRAW           EQU 1
DEFAULT_PITCH        EQU 0
ES_AUTOHSCROLL       EQU 80h
ES_CENTER            EQU 1
FALSE                EQU 0
GRAY_BRUSH           EQU 2
IDC_ARROW            EQU 7F00h
IDI_APPLICATION      EQU 7F00h
IDNO                 EQU 7
IMAGE_CURSOR         EQU 2
IMAGE_ICON           EQU 1
LR_SHARED            EQU 8000h
MB_DEFBUTTON2        EQU 100h
MB_YESNO             EQU 4
NULL                 EQU 0
NULL_BRUSH           EQU 5
OPAQUE               EQU 2
PROOF_QUALITY        EQU 2
SM_CXFULLSCREEN      EQU 10h
SM_CYFULLSCREEN      EQU 11h
SS_CENTER            EQU 1
SS_NOTIFY            EQU 100h
SW_SHOWNORMAL        EQU 1
TRUE                 EQU 1
WM_CLOSE             EQU 10h
WM_COMMAND           EQU 111h
WM_CREATE            EQU 1
WM_CTLCOLOREDIT      EQU 133h
WM_CTLCOLORSTATIC    EQU 138h
WM_DESTROY           EQU 2
WM_PAINT             EQU 0Fh
WM_SETFONT           EQU 30h
OUT_DEFAULT_PRECIS   EQU 0
WS_CHILD             EQU 40000000h
WS_EX_COMPOSITED     EQU 2000000h
WS_OVERLAPPEDWINDOW  EQU 0CF0000h
WS_TABSTOP           EQU 10000h
WS_VISIBLE           EQU 10000000hWindowWidth          EQU 640
WindowHeight         EQU 170
Static1ID            EQU 100
Static2ID            EQU 101
Edit1ID              EQU 102
Edit2ID              EQU 103; ----------------------------------------
; 外部函数声明
; ----------------------------------------
extern AdjustWindowRectEx                       ; Import external symbols
extern BeginPaint                               ; Windows API functions, not decorated
extern BitBlt
extern CreateFontA
extern CreateSolidBrush
extern CreateWindowExA
extern DefWindowProcA
extern DeleteObject
extern DestroyWindow
extern DispatchMessageA
extern EndPaint
extern ExitProcess
extern GetDlgCtrlID
extern GetStockObject
extern GetMessageA
extern GetModuleHandleA
extern GetSystemMetrics
extern InvalidateRect
extern IsDialogMessageA
extern LoadImageA
extern MessageBoxA
extern PostQuitMessage
extern RegisterClassExA
extern SendMessageA
extern SetBkColor
extern SetBkMode
extern SetTextColor
extern ShowWindow
extern TranslateMessage
extern UpdateWindowglobal fn_Start                                    ; Export symbols. The entry point; ----------------------------------------
; 区段定义
; ----------------------------------------
section .data                                   ; Initialized data segment
; // 常量是不需要字节对齐的Static1Colour    dd 0F0F0F0h                   ; Colour (0BBGGRRh)Static1ColourA   dd 020A0F0hStatic2Colour    dd 000FFFFhStatic2ColourA   dd 08000FFhEdit1TextColour  dd 0F590F5hEdit1BackColour  dd 0A00000hEdit2TextColour  dd 0A56E3BhEdit2BackColour  dd 0FEFE8EhBackgroundColour dd 0A56E3Bh   WindowName       db "Basic Window Extended 64", 0ClassName        db "Window", 0SegoeUI          db "Segoe UI", 0StaticClass      db "STATIC", 0EditClass        db "EDIT", 0Text1            db "ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789", 0Text2            db "abcdefghijklmnopqrstuvwxyz_0123456789", 0ExitText         db "Do you want to exit?", 0section .bss                                    ; Uninitialized data segmentalignb 8 ; 8字节对齐hInstance        resq 1BackgroundBrush  resq 1Font             resq 1Static1          resq 1Static2          resq 1Edit1            resq 1Edit2            resq 1section .text                                   ; Code segment
; ----------------------------------------
; 函数定义
; ----------------------------------------
fn_Start:; 16字节对齐; 进了函数之后,默认就是8字节对齐(因为系统调用fn_Start时, 栈上有调用fn_Start后的返回地址8个字节), 将栈顶再减去8, 就是16字节对齐sub   RSP, 8                                   ; Align stack pointer to 16 bytes; // 在一个函数中,如果调用的API比较少,则需要在API调用的前后进行单独的栈平衡sub   RSP, 32                                  ; 32 bytes of shadow spacexor   ECX, ECXcall  GetModuleHandleAmov   qword [REL hInstance], RAXadd   RSP, 32                                  ; Remove the 32 bytes; 如果是自己实现的函数, 就不用特意做(阴影区, 16字节对齐, 栈平衡)都在自己的函数内做了就行call  fn_WinMain.Exit:xor   ECX, ECXcall  ExitProcess ; 退出的函数是API, 为什么不做栈平衡, 是ExitProcess内部不用阴影区么? ExitProcess是特例?
; ----------------------------------------
fn_WinMain:push  RBP                                      ; Set up a stack frame; 返回地址 + push RBP 就已经是16字节对齐了mov   RBP, RSP; 函数内栈开多大,也不用精确计算,差不多就行(32字节的阴影区 + 函数内局部变量的字节数 + 多开一点,够函数调用时用的临时入参变量的赋值); 这里有一个技巧,在一个函数中调用API, 不用每次都在前后准备栈(阴影区)/清除栈(阴影区); 只需要在函数入口出口处准备足够栈空间(16字节对齐 + 阴影区 + 函数的局部变量区 + 调用API时最多的参数变量空间)/栈平衡; 调用API时, 只需要准备API需要的参数就行(RCX,RDX,R8,R9; 其余参数从RBP + 32开始, 参数5,参数6, ...)sub   RSP, 160 + 64 + 32                       ; 160 bytes for local variables; + 64 (8 * 8 byte) parameters ; + 32 shadow space; Kept to a multiple of 16 for API functions%define Screen.Width       RBP - 160            ; 4 bytes
%define Screen.Height      RBP - 156            ; 4 bytes%define ClientArea         RBP - 152            ; RECT structure. 16 bytes
%define ClientArea.left    RBP - 152            ; 4 bytes. Start on a 4 byte boundary
%define ClientArea.top     RBP - 148            ; 4 bytes
%define ClientArea.right   RBP - 144            ; 4 bytes
%define ClientArea.bottom  RBP - 140            ; 4 bytes. End on a 4 byte boundary%define wc                 RBP - 136            ; WNDCLASSEX structure, 80 bytes
%define wc.cbSize          RBP - 136            ; 4 bytes. Start on an 8 byte boundary
%define wc.style           RBP - 132            ; 4 bytes
%define wc.lpfnWndProc     RBP - 128            ; 8 bytes
%define wc.cbClsExtra      RBP - 120            ; 4 bytes
%define wc.cbWndExtra      RBP - 116            ; 4 bytes
%define wc.hInstance       RBP - 112            ; 8 bytes
%define wc.hIcon           RBP - 104            ; 8 bytes
%define wc.hCursor         RBP - 96             ; 8 bytes
%define wc.hbrBackground   RBP - 88             ; 8 bytes
%define wc.lpszMenuName    RBP - 80             ; 8 bytes
%define wc.lpszClassName   RBP - 72             ; 8 bytes
%define wc.hIconSm         RBP - 64             ; 8 bytes. End on an 8 byte boundary%define msg                RBP - 56             ; MSG structure, 48 bytes
%define msg.hwnd           RBP - 56             ; 8 bytes. Start on an 8 byte boundary
%define msg.message        RBP - 48             ; 4 bytes
%define msg.Padding1       RBP - 44             ; 4 bytes. Natural alignment padding
%define msg.wParam         RBP - 40             ; 8 bytes
%define msg.lParam         RBP - 32             ; 8 bytes
%define msg.time           RBP - 24             ; 4 bytes
%define msg.py.x           RBP - 20             ; 4 bytes
%define msg.pt.y           RBP - 16             ; 4 bytes
%define msg.Padding2       RBP - 12             ; 4 bytes. Structure length padding%define hWnd               RBP - 8              ; 8 bytesmov   ECX, dword [REL BackgroundColour]call  CreateSolidBrush                         ; Create a brush for the window backgoundmov   qword [REL BackgroundBrush], RAXmov   dword [wc.cbSize], 80                    ; [RBP - 136]mov   dword [wc.style], CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW  ; [RBP - 132]lea   RAX, [REL fn_WndProc]mov   qword [wc.lpfnWndProc], RAX              ; [RBP - 128]mov   dword [wc.cbClsExtra], NULL              ; [RBP - 120]mov   dword [wc.cbWndExtra], NULL              ; [RBP - 116]mov   RAX, qword [REL hInstance]mov   qword [wc.hInstance], RAX                ; [RBP - 112]xor   ECX, ECXmov   EDX, IDI_APPLICATIONmov   R8D, IMAGE_ICONxor   R9D, R9Dmov   qword [RSP + 4 * 8], NULLmov   qword [RSP + 5 * 8], LR_SHAREDcall  LoadImageA                               ; Large program iconmov   qword [wc.hIcon], RAX                    ; [RBP - 104]xor   ECX, ECXmov   EDX, IDC_ARROWmov   R8D, IMAGE_CURSORxor   R9D, R9Dmov   qword [RSP + 4 * 8], NULLmov   qword [RSP + 5 * 8], LR_SHAREDcall  LoadImageA                               ; Cursormov   qword [wc.hCursor], RAX                  ; [RBP - 96]mov   RAX, qword [REL BackgroundBrush]mov   qword [wc.hbrBackground], RAX            ; [RBP - 88]mov   qword [wc.lpszMenuName], NULL            ; [RBP - 80]lea   RAX, [REL ClassName]mov   qword [wc.lpszClassName], RAX            ; [RBP - 72]xor   ECX, ECXmov   EDX, IDI_APPLICATIONmov   R8D, IMAGE_ICONxor   R9D, R9Dmov   qword [RSP + 4 * 8], NULLmov   qword [RSP + 5 * 8], LR_SHAREDcall  LoadImageA                               ; Small program iconmov   qword [wc.hIconSm], RAX                  ; [RBP - 64]lea   RCX, [wc]                                ; [RBP - 136]call  RegisterClassExAmov   ECX, SM_CXFULLSCREENcall  GetSystemMetrics                         ; Get the current screen widthmov   dword [Screen.Width], EAX                ; [RBP - 160]mov   ECX, SM_CYFULLSCREENcall  GetSystemMetrics                         ; Get the current screen heightmov   dword [Screen.Height], EAX               ; [RBP - 156]mov   dword [ClientArea.left], 0               ; [RBP - 152]mov   dword [ClientArea.top], 0                ; [RBP - 148]mov   dword [ClientArea.right], WindowWidth    ; [RBP - 144]mov   dword [ClientArea.bottom], WindowHeight  ; [RBP - 140]lea   RCX, [ClientArea]                        ; [RBP - 152]mov   EDX, WS_OVERLAPPEDWINDOW                 ; Stylexor   R8D, R8Dmov   R9D, WS_EX_COMPOSITED                    ; Extended stylecall  AdjustWindowRectEx                       ; Get window size for the desired client size; Size is returned in ClientAreamov   EAX, dword [ClientArea.top]              ; [RBP - 148]sub   dword [ClientArea.bottom], EAX           ; New Height = ClientArea.bottom - ClientArea.topmov   EAX, dword [ClientArea.left]             ; [RBP - 152]sub   dword [ClientArea.right], EAX            ; New Width = ClientArea.right - ClientArea.leftmov   ECX, WS_EX_COMPOSITEDlea   RDX, [REL ClassName]lea   R8, [REL WindowName]mov   R9D, WS_OVERLAPPEDWINDOWxor   R10D, R10Dmov   EAX, dword [Screen.Width]                ; [RBP - 160]sub   EAX, dword [ClientArea.right]            ; Corrected window width. [RBP - 144]cmovs EAX, R10D                                ; Clamp to 0 (left) if negativeshr   EAX, 1                                   ; EAX = (Screen.Width - window height) / 2mov   dword [RSP + 4 * 8], EAX                 ; X position, now centredmov   EAX, dword [Screen.Height]               ; [RBP - 156]sub   EAX, dword [ClientArea.bottom]           ; Corrected window height. [RBP - 140]cmovs EAX, R10D                                ; Clamp to 0 (top) if negativeshr   EAX, 1                                   ; EAX = (Screen.Height - window height) / 2mov   dword [RSP + 5 * 8], EAX                 ; Y position, now centredmov   EAX, dword [ClientArea.right]            ; [RBP - 144]mov   dword [RSP + 6 * 8], EAX                 ; Widthmov   EAX, dword [ClientArea.bottom]           ; [RBP - 140]mov   dword [RSP + 7 * 8], EAX                 ; Heightmov   qword [RSP + 8 * 8], NULLmov   qword [RSP + 9 * 8], NULLmov   RAX, qword [REL hInstance]mov   qword [RSP + 10 * 8], RAXmov   qword [RSP + 11 * 8], NULLcall  CreateWindowExAmov   qword [hWnd], RAX                        ; [RBP - 8]mov   RCX, qword [hWnd]                        ; [RBP - 8]mov   EDX, SW_SHOWNORMALcall  ShowWindowmov   RCX, qword [hWnd]                        ; [RBP - 8]call  UpdateWindow.MessageLoop:lea   RCX, [msg]                               ; [RBP - 56]xor   EDX, EDXxor   R8D, R8Dxor   R9D, R9Dcall  GetMessageAcmp   RAX, 0je    .Donemov   RCX, qword [hWnd]                        ; [RBP - 8]lea   RDX, [msg]                               ; [RBP - 56]call  IsDialogMessageA                         ; For keyboard strokescmp   RAX, 0jne   .MessageLoop                             ; Skip TranslateMessage and DispatchMessageAlea   RCX, [msg]                               ; [RBP - 56]call  TranslateMessagelea   RCX, [msg]                               ; [RBP - 56]call  DispatchMessageAjmp   .MessageLoop.Done:xor   EAX, EAXmov   RSP, RBP                                 ; Remove the stack framepop   RBPret
; ----------------------------------------
fn_WndProc:push  RBP                                      ; Set up a stack framemov   RBP, RSPsub   RSP, 80 + 80 + 32                        ; 80 bytes for local variables; + 80 (10 * 8 byte) parameters; + 32 shadow space; Kept to a multiple of 16 for API functions%define hWnd                RBP + 16            ; Location of the shadow space setup by
%define uMsg                RBP + 24            ; the calling function
%define wParam              RBP + 32
%define lParam              RBP + 40%define ps                  RBP - 80            ; PAINTSTRUCT structure. 72 bytes
%define ps.hdc              RBP - 80            ; 8 bytes. Start on an 8 byte boundary
%define ps.fErase           RBP - 72            ; 4 bytes
%define ps.rcPaint.left     RBP - 68            ; 4 bytes
%define ps.rcPaint.top      RBP - 64            ; 4 bytes
%define ps.rcPaint.right    RBP - 60            ; 4 bytes
%define ps.rcPaint.bottom   RBP - 56            ; 4 bytes
%define ps.Restore          RBP - 52            ; 4 bytes
%define ps.fIncUpdate       RBP - 48            ; 4 bytes
%define ps.rgbReserved      RBP - 44            ; 32 bytes
%define ps.Padding          RBP - 12            ; 4 bytes. Structure length padding%define hdc                 RBP - 8             ; 8 bytesmov   qword [hWnd], RCX                        ; Free up RCX RDX R8 R9 by spilling themov   qword [uMsg], RDX                        ; 4 passed parameters to the shadow spacemov   qword [wParam], R8                       ; We can now access these parameters by namemov   qword [lParam], R9cmp   qword [uMsg], WM_CLOSE                   ; [RBP + 24]je    proc.WMCLOSEcmp   qword [uMsg], WM_COMMAND                 ; [RBP + 24]je    proc.WMCOMMANDcmp   qword [uMsg], WM_CREATE                  ; [RBP + 24]je    proc.WMCREATEcmp   qword [uMsg], WM_CTLCOLOREDIT            ; [RBP + 24]je    proc.WMCTLCOLOREDITcmp   qword [uMsg], WM_CTLCOLORSTATIC          ; [RBP + 24]je    proc.WMCTLCOLORSTATICcmp   qword [uMsg], WM_DESTROY                 ; [RBP + 24]je    proc.WMDESTROYcmp   qword [uMsg], WM_PAINT                   ; [RBP + 24]je    proc.WMPAINTproc.DefaultMessage:mov   RCX, qword [hWnd]                        ; [RBP + 16]mov   RDX, qword [uMsg]                        ; [RBP + 24]mov   R8, qword [wParam]                       ; [RBP + 32]mov   R9, qword [lParam]                       ; [RBP + 40]call  DefWindowProcAjmp   proc.Returnproc.WMCLOSE:mov   RCX, qword [hWnd]                        ; [RBP + 16]lea   RDX, [REL ExitText]lea   R8, [REL WindowName]mov   R9D, MB_YESNO | MB_DEFBUTTON2call  MessageBoxAcmp   RAX, IDNOje    proc.Return.WM_Processedmov   RCX, qword [hWnd]                        ; [RBP + 16]call  DestroyWindow                            ; Send a WM_DESTROY messagejmp   proc.Return.WM_Processedproc.WMCOMMAND:mov   RAX, qword [wParam]                      ; RAX = ID. [RBP + 32]cmp   AX, Static1IDje    .Static1cmp   AX, Static2IDje    .Static2jmp   proc.Return.WM_Processed.Static1:mov   EAX, dword [REL Static1Colour]mov   ECX, dword [REL Static1ColourA]mov   dword [REL Static1Colour], ECXmov   dword [REL Static1ColourA], EAX          ; Swap coloursmov   RCX, qword [lParam]                      ; Static1 handle. [RBP + 40]xor   EDX, EDXmov   R8D, TRUEcall  InvalidateRect                           ; Redraw controljmp   proc.Return.WM_Processed.Static2:mov   EAX, dword [REL Static2Colour]mov   ECX, dword [REL Static2ColourA]mov   dword [REL Static2Colour], ECXmov   dword [REL Static2ColourA], EAX          ; Swap coloursmov   RCX, qword [lParam]                      ; Static2 handle. [RBP + 40]xor   EDX, EDXmov   R8D, TRUEcall  InvalidateRect                           ; Redraw controljmp   proc.Return.WM_Processedproc.WMCREATE:xor   ECX, ECXlea   RDX, [REL StaticClass]lea   R8, [REL Text1]                          ; Default textmov   R9D, WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTERmov   qword [RSP + 4 * 8], 120                 ; Xmov   qword [RSP + 5 * 8], 10                  ; Ymov   qword [RSP + 6 * 8], 400                 ; Widthmov   qword [RSP + 7 * 8], 20                  ; Heightmov   RAX, qword [hWnd]                        ; [RBP + 16]mov   qword [RSP + 8 * 8], RAX mov   qword [RSP + 9 * 8], Static1ID mov   RAX, qword [REL hInstance] mov   qword [RSP + 10 * 8], RAXmov   qword [RSP + 11 * 8], NULLcall  CreateWindowExAmov   qword [REL Static1], RAXxor   ECX, ECXlea   RDX, [REL StaticClass]lea   R8, [REL Text2]                          ; Default textmov   R9D, WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTERmov   qword [RSP + 4 * 8], 120                 ; Xmov   qword [RSP + 5 * 8], 40                  ; Ymov   qword [RSP + 6 * 8], 400                 ; Widthmov   qword [RSP + 7 * 8], 20                  ; Heightmov   RAX, qword [hWnd]                        ; [RBP + 16]mov   qword [RSP + 8 * 8], RAX mov   qword [RSP + 9 * 8], Static2ID mov   RAX, qword [REL hInstance] mov   qword [RSP + 10 * 8], RAXmov   qword [RSP + 11 * 8], NULLcall  CreateWindowExAmov   qword [REL Static2], RAXxor   ECX, ECXlea   RDX, [REL EditClass]lea   R8, [REL Text1]                          ; Default textmov   R9D, WS_CHILD | WS_VISIBLE | ES_CENTER | WS_TABSTOP | ES_AUTOHSCROLLmov   qword [RSP + 4 * 8], 120                 ; Xmov   qword [RSP + 5 * 8], 70                  ; Ymov   qword [RSP + 6 * 8], 400                 ; Widthmov   qword [RSP + 7 * 8], 20                  ; Heightmov   RAX, qword [hWnd]                        ; [RBP + 16]mov   qword [RSP + 8 * 8], RAX mov   qword [RSP + 9 * 8], Edit1ID mov   RAX, qword [REL hInstance] mov   qword [RSP + 10 * 8], RAXmov   qword [RSP + 11 * 8], NULLcall  CreateWindowExAmov   qword [REL Edit1], RAXxor   ECX, ECXlea   RDX, [REL EditClass]lea   R8, [REL Text2]                          ; Default textmov   R9D, WS_CHILD | WS_VISIBLE | ES_CENTER | WS_TABSTOP | ES_AUTOHSCROLLmov   qword [RSP + 4 * 8], 120                 ; Xmov   qword [RSP + 5 * 8], 100                 ; Ymov   qword [RSP + 6 * 8], 400                 ; Widthmov   qword [RSP + 7 * 8], 20                  ; Heightmov   RAX, qword [hWnd]                        ; [RBP + 16]mov   qword [RSP + 8 * 8], RAX mov   qword [RSP + 9 * 8], Edit2ID mov   RAX, qword [REL hInstance] mov   qword [RSP + 10 * 8], RAXmov   qword [RSP + 11 * 8], NULLcall  CreateWindowExAmov   qword [REL Edit2], RAXmov   ECX, 20                                  ; Sizexor   EDX, EDXxor   R8D, R8D xor   R9D, R9Dmov   qword [RSP + 4 * 8], 400                 ; Weightmov   qword [RSP + 5 * 8], NULLmov   qword [RSP + 6 * 8], NULLmov   qword [RSP + 7 * 8], NULLmov   qword [RSP + 8 * 8], ANSI_CHARSETmov   qword [RSP + 9 * 8], OUT_DEFAULT_PRECISmov   qword [RSP + 10 * 8], CLIP_DEFAULT_PRECISmov   qword [RSP + 11 * 8], PROOF_QUALITYmov   qword [RSP + 12 * 8], DEFAULT_PITCHlea   RAX, [REL SegoeUI]mov   qword [RSP + 13 * 8], RAXcall  CreateFontAmov   qword [REL Font], RAXmov   RCX, qword [REL Static1]mov   EDX, WM_SETFONTmov   R8, qword [REL Font]xor   R9D, R9Dcall  SendMessageA                             ; Set Static1 fontmov   RCX, qword [REL Static2]mov   EDX, WM_SETFONTmov   R8, qword [REL Font]xor   R9D, R9Dcall  SendMessageA                             ; Set Static2 fontmov   RCX, qword [REL Edit1]mov   EDX, WM_SETFONTmov   R8, qword [REL Font]xor   R9D, R9Dcall  SendMessageA                             ; Set Edit1 fontmov   RCX, qword [REL Edit2]mov   EDX, WM_SETFONTmov   R8, qword [REL Font]xor   R9D, R9Dcall  SendMessageA                             ; Set Edit2 fontjmp   proc.Return.WM_Processedproc.WMCTLCOLOREDIT:                                 ; For colouring edit controlsmov   RCX, qword [lParam]                      ; [RBP + 40]call  GetDlgCtrlID                             ; RAX = IDcmp   RAX, Edit1IDje    .Edit1cmp   RAX, Edit2IDje    .Edit2.Default:mov   ECX, NULL_BRUSHcall  GetStockObject                           ; Return a brushjmp   proc.Return.Edit1:mov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, dword [REL Edit1TextColour]call  SetTextColormov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, OPAQUEcall  SetBkModemov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, dword [REL Edit1BackColour]call  SetBkColormov   ECX, NULL_BRUSHcall  GetStockObject                           ; Return a brushjmp   proc.Return.Edit2:mov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, dword [REL Edit2TextColour]call  SetTextColormov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, OPAQUEcall  SetBkModemov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, dword [REL Edit2BackColour]call  SetBkColormov   ECX, NULL_BRUSHcall  GetStockObject                           ; Return a brushjmp   proc.Returnproc.WMCTLCOLORSTATIC:                               ; For colouring static controlsmov   RCX, qword [lParam]                      ; [RBP + 40]call  GetDlgCtrlID                             ; RAX = IDcmp   RAX, Static1IDje    .Static1cmp   RAX, Static2IDje    .Static2.Default:mov   ECX, NULL_BRUSHcall  GetStockObject                           ; Return a brushjmp   proc.Return.Static1:mov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, dword [REL Static1Colour]call  SetTextColormov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, OPAQUEcall  SetBkModemov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, 0604060hcall  SetBkColormov   ECX, NULL_BRUSHcall  GetStockObject                           ; Return a brushjmp   proc.Return.Static2:mov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, dword [REL Static2Colour]call  SetTextColormov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, OPAQUEcall  SetBkModemov   RCX, qword [wParam]                      ; [RBP + 32]mov   EDX, 0005000hcall  SetBkColormov   ECX, GRAY_BRUSHcall  GetStockObject                           ; Return a brushjmp   proc.Returnproc.WMDESTROY:mov   RCX, qword [REL BackgroundBrush]call  DeleteObjectmov   RCX, qword [REL Font]call  DeleteObjectxor   ECX, ECXcall  PostQuitMessagejmp   proc.Return.WM_Processedproc.WMPAINT:mov   RCX, qword [hWnd]                        ; [RBP + 16]lea   RDX, [ps]                                ; [RBP - 80]call  BeginPaintmov   qword [hdc], RAX                         ; [RBP - 8]mov   RCX, qword [hdc]                         ; Destination device context. [RBP - 8]mov   EDX, 120                                 ; Destination Xmov   R8D, 130                                 ; Destination Ymov   R9D, 400                                 ; Widthmov   qword [RSP + 4 * 8], 20                  ; Heightmov   RAX, qword [hdc]                         ; [RBP - 8]mov   qword [RSP + 5 * 8], RAX                 ; Source device contextmov   qword [RSP + 6 * 8], 0                   ; Source Xmov   qword [RSP + 7 * 8], 0                   ; Source Ymov   qword [RSP + 8 * 8], BLACKNESS           ; Operationcall  BitBlt                                   ; Blit a black rectanglemov   RCX, qword [hWnd]                        ; [RBP + 16]lea   RDX, [ps]                                ; [RBP - 80]call  EndPaintproc.Return.WM_Processed:xor   EAX, EAX                                 ; WM_ has been processed, return 0proc.Return:mov   RSP, RBP                                 ; Remove the stack framepop   RBPret

my_build.bat

@echo off
clsrem ----------------------------------------
rem my_build.batrem env
rem NASM version 2.16.03 compiled on Apr 17 2024
rem GoLink.Exe Version 1.0.4.6  Copyright Jeremy Gordon 2002-2025set path=C:\Program Files\NASM;C:\soft\Golink;%path%rem . bat默认是不支持中文的 .
rem echo full path name - %~f0
rem echo full path      - %~dp0
rem echo file name      - %~nx0
rem echo work path      - %cd%
rem all param           - %*rem . rem注释的第1个字符和最后1个字符,不能是中文,否则有概率会当作命令来执行 .
rem . 调试.bat的方法 .
rem . 如果.bat写的不对,又不容易看出来,只能在每行后面加pause, 然后执行.bat, 然后按一下空格执行一行 .set prj_src_name_1=nasm_main.asm
set prj_obj_name_1=nasm_main.obj
set prj_exe_name=BasicWindow_ext_64.exerem win32 or win64
set prj_build_type=win64rem /console or /SUBSYSTEM:WINDOWS
set prj_sub_sys=/SUBSYSTEM:WINDOWSecho [%~nx0 %*]if "%1" == "build" (call :fn_build
) else if "%1" == "clear" (call :fn_clear
) else (call :fn_usage
)goto endrem ----------------------------------------
rem function
rem ----------------------------------------:fn_usage
echo usage my_build.bat [option]
echo build - build asm to EXE
echo clear - clear trush on the project
exit /brem ----------------------------------------
:fn_build
echo build ...rem find file on work path
call :fn_del_file "%prj_obj_name_1%"nasm -f %prj_build_type% %prj_src_name_1% -o %prj_obj_name_1%
rem 用IDA打开.obj 已经可以看到实现逻辑了call :fn_del_file "%prj_exe_name%"rem 如果不指定要连接的dll, 会报错
golink /entry:fn_Start '%prj_sub_sys%' kernel32.dll user32.dll gdi32.dll %prj_obj_name_1% /fo %prj_exe_name%call :fn_exec "%prj_exe_name%"
exit /brem ----------------------------------------
:fn_clear
echo clear ...
call :fn_del_file "%prj_obj_name_1%"
call :fn_del_file "%prj_exe_name%"
exit /brem ----------------------------------------
:fn_del_file
if exist "%~1"  (echo del "%~1" del "%~1" 
)
exit /b:fn_exec
if exist "%~1"  (echo exec "%~1"%~1
)
exit /brem ----------------------------------------
:end
echo END
rem pause
rem call cmd

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript变量的作用域介绍

JavaScript变量的作用域介绍 JavaScript 变量的作用域决定了变量在代码中的可访问性。 var 是 JavaScript 中最早用于声明变量的关键字,它函数作用域或全局作用域。 let 关键字,具有块级作用域、全局作用域。 const关键字,具有块级作用域…

Microsoft 365 Copilot中使用人数最多的是哪些应用

今天在浏览Microsoft 365 admin center时发现,copilot会自动整理过去30天内所有用户使用copilot的概况: 直接把这个图丢给copilot让它去分析,结果如下: 总用户情况 总用户数在各应用中均为 561 人,说明此次统计的样本…

ue5.2.1 quixel brideg显示asset not available in uAsset format

我从未见过如此傻x的bug,在ue5.2.1上通过内置quixel下载资源显示 asset not available in uAsset format 解决办法:将ue更新到最新版本,通过fab进入商场选择资源后add to my library 点击view in launcher打开epic launcher,就可…

当电脑上有几个python版本Vscode选择特定版本python

查看当前vscode用的python版本命令 Import sys print(sys.version) 修改VSCODE解释器 打开 VSCode。 按下 CtrlShiftP打开命令面板。 输入 Python: Select Interpreter 并选择它。 从弹出的列表中选择你安装的 Python 解释器。如果你有多个 Python 版本(例如…

Vue 中 nextTick 的原理详解

1. 为什么需要 nextTick Vue 采用 异步渲染机制,当响应式数据发生变化时,Vue 并不会立即更新 DOM,而是将这些变化放入一个 队列 中,并在 同一事件循环(Event Loop)中合并相同的修改,最后执行批…

Spring面试题2

1、compareable和compactor区别 定义与包位置:Comparable是一个接口,位于java.lang包,需要类去实现接口;而Compactor是一个外部比较器,位于java.util包 用法:Comparable只需要实现int compareTo(T o) 方法,比较当前对…

DuodooBMS源码解读之 cncw_statement模块

财务应收应付扩展模组用户使用手册 一、模块概述 财务应收应付扩展模组是一个基于 Odoo18 的扩展模块,主要对财务应收应付相关功能进行了修改和增强。该模块增加了多个功能模块,如预收款单模块、费用类别设置模块等,同时对发票、公司、销售…

JUC并发—9.并发安全集合四

大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 4.JUC的各种阻塞队列介绍 (1)基于数组的阻塞…

vue项目启动时报错:error:0308010C:digital envelope routines::unsupported

此错误与 Node.js 的加密模块有关,特别是在使用 OpenSSL 3.0 及以上版本时。Vue 项目在启动时可能会依赖一些旧的加密算法,而这些算法在 OpenSSL 3.0 中默认被禁用,导致 error:0308010C:digital envelope routines::unsupported 错误。 解决…

ncDLRES:一种基于动态LSTM和ResNet的非编码RNA家族预测新方法

现有的计算方法主要分为两类:第一类是通过学习序列或二级结构的特征来预测ncRNAs家族,另一类是通过同源序列之间的比对来预测ncRNAs家族。在第一类中,一些方法通过学习预测的二级结构特征来预测ncRNAs家族。二级结构预测的不准确性可能会导致…

爱普生 SG-8101CE 可编程晶振在笔记本电脑的应用

在笔记本电脑的精密架构中,每一个微小的元件都如同精密仪器中的齿轮,虽小却对整体性能起着关键作用。如今的笔记本电脑早已不再局限于简单的办公用途,其功能愈发丰富多样。从日常轻松的文字处理、网页浏览,到专业领域中对图形处理…

SPRING10_getBean源码详细解读、流程图

文章目录 ①. getBean方法的入口-DefaultListableBeanFactory②. DefaultListableBeanFactory调用getBean③. 进入到doGetBean方法④. getSingleton三级缓存方法⑤. getSingleton()方法分析⑥. createBean创建对象方法⑦. 对象创建、属性赋值、初始化⑧. getBean最详细流程图 ①…

IDEA中查询Maven项目的依赖树

在Maven项目中,查看项目的依赖树是一个常见的需求,特别是当你需要了解项目中直接或间接依赖了哪些库及其版本时。你可以通过命令行使用Maven的dependency:tree插件来做到这一点。这个命令会列出项目中所有依赖的树状结构。 打开idea项目的终端&#xff…

深入xtquant:财务数据获取与应用的实战指南

深入xtquant:财务数据获取与应用的实战指南 在量化交易领域,虽然技术分析和市场情绪分析占据了主导地位,但财务数据作为评估公司基本面的重要依据,同样不可或缺。xtquant作为一个强大的Python库,提供了便捷的接口来获…

windows 安装 stable diffusion

在windows上安装 stable diffusion,如果windows没有nvidia显卡,想只使用CPU可在webui-user.bat中添加命令 set COMMANDLINE_ARGS--no-half --skip-torch-cuda-test 可正常使用stable diffusion,但速度较慢

Kubernetes控制平面组件:APIServer 基于 引导Token 的认证机制

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…

DeepSeek 助力 Vue 开发:打造丝滑的缩略图列表(Thumbnail List)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

DeepSeek写俄罗斯方块手机小游戏

DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件: 核心功能要求 原生JavaScript实现,适配手机屏幕 …

百问网(100ask)的IMX6ULL开发板的以太网控制器(MAC)与物理层(PHY)芯片(LAN8720A)连接的原理图分析(包含各引脚说明以及工作原理)

前言 本博文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 。 本博文和博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 的目录是找出百问网(100ask)的IMX6ULL开发板与NXP官方提供的公板MCIMX6ULL-EVK(imx6ull14x14evk)在以太网硬件…

QT开发技术 【opencv图片裁剪,平均哈希相似度判断,以及获取游戏窗口图片】

一、图片裁剪 int CJSAutoWidget::GetHouseNo(cv::Mat matMap) {cv::imwrite(m_strPath "/Data/map.png", matMap);for (int i 0; i < 4; i){for (int j 0; j < 6; j){// 计算当前子区域的矩形cv::Rect roi(j * 20, i * 17, 20, 17);// 提取子区域cv::Mat …