Winapi 程序集中的寄存器类

Winapi 程序集中的寄存器类,winapi,assembly,masm32,Winapi,Assembly,Masm32,我正在尝试手动调用RegisterClassEx Windows API,而不在.data部分使用WNDCLASS结构,我只需要使用push指令创建此结构 有人能帮我吗 非常感谢反向将结构推送到堆栈中,将有效地址推送到第一项,调用注册表类,将结构从堆栈中弹出 .data wndclass WNDCLASS .code push offset wndclass call RegisterClassEx 应该推动其偏移量,而不是结构本身 对于局部变量,按其地址 LOC

我正在尝试手动调用RegisterClassEx Windows API,而不在.data部分使用WNDCLASS结构,我只需要使用
push
指令创建此结构

有人能帮我吗


非常感谢

反向将结构推送到堆栈中,将有效地址推送到第一项,调用注册表类,将结构从堆栈中弹出

.data 
    wndclass WNDCLASS
.code
    push offset wndclass
    call RegisterClassEx 
应该推动其偏移量,而不是结构本身

对于局部变量,按其地址

 LOCAL wndclass:WNDCLASS
 lea edx, wndclass
 push edx
 call RegisterClassEx 

事实上,你可以很容易地做你想做的事。您只需要小心地正确计算结构中每个元素的地址。但这也是一项容易的任务……;)

请查看我的代码:

WinMain:
    push ebp
    mov ebp, esp
    add esp, -50h

    push 7F00h
    push 0h
    call LoadIconA

    mov ebx, eax

    push 7F00h
    push 0h
    call LoadCursorA
    ;eax = return of LoadCursorA
    ;ebx = return of LoadIconA

    mov dword ptr ss:[ebp-30h], 30h                 ;WNDCLASSEX.cbSize,           dd    WNDCLASSEX_size
    mov dword ptr ss:[ebp-2Ch], 3h                  ;WNDCLASSEX.style,            dd    CS_VREDRAW + CS_HREDRAW
    mov dword ptr ss:[ebp-28h], WndProc             ;WNDCLASSEX.lpfnWndProc,      dd    WndProc
    mov dword ptr ss:[ebp-24h], 0h                  ;WNDCLASSEX.cbClsExtra,       dd    NULL
    mov dword ptr ss:[ebp-20h], 0h                  ;WNDCLASSEX.cbWndExtra,       dd    NULL
    mov dword ptr ss:[ebp-1Ch], 0h                  ;WNDCLASSEX.hInstance,        dd    NULL
    mov dword ptr ss:[ebp-18h], ebx                 ;WNDCLASSEX.hIcon,            dd    return of LoadIconA
    mov dword ptr ss:[ebp-14h], eax                 ;WNDCLASSEX.hIconSm,          dd    return of LoadCursorA
    mov dword ptr ss:[ebp-10h], 06h                 ;WNDCLASSEX.hbrBackground,    dd    COLOR_BTNFACE + 1
    mov dword ptr ss:[ebp-0Ch], 0h                  ;WNDCLASSEX.lpszMenuName,     dd    NULL
    mov dword ptr ss:[ebp-08h], offset WndProc      ;WNDCLASSEX.lpszClassName,    dd    offset of ClassName
    mov dword ptr ss:[ebp-04h], ebx                 ;WNDCLASSEX.hCursor,          dd    return of LoadIconA

    lea eax,[ebp-30h]
    push eax
    call RegisterClassEx
你只需要把它放在调用CreateWindow之前

如果有疑问,就喊一声


PS:记住WndProc是汇编程序的循环过程

为什么需要汇编来做这件事?@joni:他不需要汇编来做。他只想在汇编中这样做:)作为这些“我很酷,因为我写了win32/64应用程序,在asm中只是为了好玩和学习”——英雄们,他应该能够自己解决这个问题,然后赢得奖牌:PYeah。。。我试图在不使用.data段的情况下创建WNDCLASS结构。@joni:你怎么会认为他是这样的人?为什么一个集合问题会产生这种注释?如果他只是在学习Windows API中发生了什么?如果你知道答案,你不需要回答这个问题,但是你不应该用这些评论来劝阻那个家伙。所有的知识都是有效的和受欢迎的。我不是在为他辩护,我是在为这个问题辩护。
ss:
不是必需的-它是ebp的默认段寄存器。@Abyx:是的,我知道,只是为了澄清:)