Windows汇编疑问 - x86

4
我正在编写一个没有任何宏的Windows汇编程序。因此,我下载了一个使用宏的程序,并将其转换为“纯”汇编代码。
然而,我在这里遇到了一个问题。有一个标签@@:,我不理解,还有一个跳转jne @F,我也不明白。这两个符号是什么意思?
MyWndProc:

    push ebp
    mov ebp, esp

    cmp DWORD PTR [ebp+12], 2 ;WM_DESTROY=2
    jne @F
      push ecx
      push NULL
      mov dword ptr ecx, 7e42ca5ah ;address of PostQuitMessage
      call ecx
      pop ecx
    @@:

    push DWORD PTR [ebp+20]
    push DWORD PTR [ebp+16]
    push DWORD PTR [ebp+12]
    push DWORD PTR [ebp+8]
    call DefWindowProc
    ;mov dword ptr edx, 7e42c17eh
    ;call edx

    leave
    ret 16

对于PostQuitMessage API,我可以在WinXP 32位SP3英文版上硬编码内存地址,但对于DefWindowProc,虽然编译通过,但执行时会出现错误。有人知道原因吗?

感谢大家的支持。

PS:我正在使用masm32。


为什么要“没有任何宏”? - Andrey
1
为什么?有两个原因:1)我想查看Windows二进制文件的详细信息。2)我想在C程序中构建一个汇编程序。为什么?我只是一个非常好奇的人... - jyz
硬编码地址 = 不行。 - Jens Björnhager
@Jens Björnhager:我知道这不是一个好的做法,但正如我上面解释的那样,这更多是出于好奇心。我想让这段代码摆脱链接器的东西(至少我需要确信这是可能的)。我认为这是可能的,因为我在代码中硬编码了几个API的地址,只有DefWindowProc没有起作用...不知道为什么:( - jyz
你可以通过使用汇编器来实际编写无链接器的代码。 - Jens Björnhager
1个回答

4

@@ 是匿名本地标签。您可以在文件中有许多这样的标签。而 jne @@ 意味着跳转到当前位置之前最近的 @@


没有更多的代码,我无法告诉你。DefWindowProc是你的另一个例程吗? - Carl Norum
不,DefWindowProc是Windows API。这个例程负责获取窗口消息...我使用arwin工具在我的机器上找到了它的地址,但这是我无法硬编码的唯一API..但我不知道为什么我不能像PostQuitMessage一样做同样的事情... - jyz
然后您需要对其进行全局符号声明,然后使用链接器确保一切匹配。我不确定您是否可以依赖它始终具有相同的地址。虽然我不是Windows API专家。 - Carl Norum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接